通过学习how2j上的知识记的笔记
JSP
通过Servlet进行整个网站的开发是可以的,不过在servlet中输出html代码,特别是复杂的html代码,会很繁琐。
如果能够直接使用html代码,并在html中写java代码就好了,JSP就可以实现这个功能。
一、Hello JSP
1、新建jsp文件
新建一个动态javaweb项目,命名为JSP,导入servlet-api.jar,然后在web-INF下新建一个NewFile.jsp,写进以下代码
<%@page contentType
然后运行这个动态项目,输入网址http://localhost:8080/JSP/NewFile.jsp,可以看到以下界面
![ecf230298f75b09ae4ef7d5d159e7c14.png](https://img-blog.csdnimg.cn/img_convert/ecf230298f75b09ae4ef7d5d159e7c14.png)
2、代码解释
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%>
<%@page是JSP的指令
contentType="text/html;charset=UTF-8"就相当于response.setContentType("text/html;charset=UTF-8");也就是通知浏览器以UTF-8进行中文解码。
pageEncoding="UTF-8"是jsp的参数,表示如果jsp文件中出现了中文,那这些中文使用UTF-8进行编码。
import="java.util.*"表示jsp文件中调用的java代码需要依赖哪些包,如果需要多个包,中间要用逗号隔开。
<%=new Date().toLocaleString()%>输入当前时间,相当于在servlet中使用response.getWriter().println(new Date().toLocalString());
二、JSP页面元素
1、静态内容,也就是html、css、JavaScript等内容
2、指令<%@ %>,中间是内容,比如<%@page import="java.util.*"%>
3、表达式<%= %>,用于输出一段html
4、<% %>,中间可以写任何java代码
5、声明<%! %>,用来声明任何字段和方法,但不建议这么做。
6、动作<jsp:include page="Filename">,在jsp页面中包含另一个页面
7、注释<%-- --%>
8、<% %>和<%= %>间的关系
比如同样是在网页上输出hell jsp,两种方法的实现不同
<%out.println("hello jsp");%> <%="hello jsp"%>
9、for循环等一些语法练习
<%@page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%--注释:两种输出方式 --%>
<%="hello jsp" %><br>
<% out.println("hello jsp"); %><br>
<%
List<String> words = new ArrayList<String>();
words.add("today");
words.add("is");
words.add("a");
words.add("great");
words.add("day");
%>
<%--for循环输出,只是在控制台上显示--%>
<%
for (String word:words){
System.out.println(word);
}
%>
<%--for循环输出,网页上显示 --%>
<%for(String word:words){ %>
<%=word %>
<br>
<%} %>
<%--把words中的内容显示在一个表格中 --%>
<%--先定义表格边框属性 --%>
<table width="200px" align="center" border="1" cellspacing="0">
<%for (String word:words){ %>
<tr>
<td>
<%=word %>
</td>
</tr>
<%} %>
</table>
</body>
</html>
![118de13cdb2c81bb04e5ff99f83dc8b5.png](https://img-blog.csdnimg.cn/img_convert/118de13cdb2c81bb04e5ff99f83dc8b5.png)
三、jsp include
每个网页下面都有版权声明等信息,而且还很长,比如【Copyright © 2019 w3cschool.cn All Rights Reserved. 】,如果有一万个网页,都是使用的这个版权声明,那么在写每个网页的时候,都需要加上这句版权声明,一旦后续版权声明需要更改,一万个网页都挨个需要更改,维护成本很高。
但是,如果把版权声明弄成一个jsp,直接在网页中include这个jsp,那个只需要更改一次版权声明的jsp其他一万个网页中的内容就全部更改了。
1、建立版权声明的jsp 在动态web项目JSP的WebContent下新建footer.jsp,且写入版权声明代码
<hr>
<p style="text-align:center">copyright@2016
</p>
2、在NewFile.jsp中包含footer.jsp
<%@page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%--注释:两种输出方式 --%>
<%="hello jsp" %><br>
<% out.println("hello jsp"); %><br>
<%
List<String> words = new ArrayList<String>();
words.add("today");
words.add("is");
words.add("a");
words.add("great");
words.add("day");
%>
<%--for循环输出,只是在控制台上显示--%>
<%
for (String word:words){
System.out.println(word);
}
%>
<%--for循环输出,网页上显示 --%>
<%for(String word:words){ %>
<%=word %>
<br>
<%} %>
<%--把words中的内容显示在一个表格中 --%>
<%--先定义表格边框属性 --%>
<table width="200px" align="center" border="1" cellspacing="0">
<%for (String word:words){ %>
<tr>
<td>
<%=word %>
</td>
</tr>
<%} %>
</table>
<%@include file="footer.jsp" %>
<jsp:include page="footer.jsp"/>
</body>
</html>
运行项目输入网址http://localhost:8080/JSP/NewFile.jsp,可以看到如下图
![2f738e0929f68233622e4644c24dd7d5.png](https://img-blog.csdnimg.cn/img_convert/2f738e0929f68233622e4644c24dd7d5.png)
在程序中可以看到,include有两种方式,分别是指令方式和动作方式
<%@include file="footer.jsp" %> <jsp:include page="footer.jsp"/>
3、指令方式和动作方式区别
jsp执行过程中会转换成*_jsp.java文件
指令方式会把footer.jsp的内容插入到NewFile.jsp中,最后只形成一个NewFile_jsp.java文件
动作方式会形成两个单独的.java文件NewFile_jsp.java和footer_jsp.java,NewFile_jsp.java会在服务器端访问footer_jsp.java,然后把返回的结果嵌入到响应中
4、传参问题
指令方式不存在传参问题,因为最后合并为了一个文件
但是动作方式存在一个访问的步骤,就涉及到了传参问题,
在NewFile的代码中修改一下
<%@page contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%="hello jsp" %><br>
<% out.println("hello jsp"); %><br>
<%
List<String> words = new ArrayList<String>();
words.add("today");
words.add("is");
words.add("a");
words.add("great");
words.add("day");
%>
<%
for (String word:words){
System.out.println(word);
}
%>
<%for(String word:words){ %>
<%=word %>
<br>
<%} %>
<table width="200px" align="center" border="1" cellspacing="0">
<%for (String word:words){ %>
<tr>
<td>
<%=word %>
</td>
</tr>
<%} %>
</table>
<%@include file="footer.jsp" %>
<%--做出了修改的地方,在包含footer.jsp的同时传出一个参数9999999给footer.jsp --%>
<jsp:include page="footer.jsp">
<jsp:param name="year" value="9999999"/>
</jsp:include>
</body>
</html>
并在footer.jsp中接收这个参数
<hr>
<p style="text-align:center">copyright@2016<%=request.getParameter("year")%>
</p>
最后运行输入网址http://localhost:8080/JSP/NewFile.jsp,显示如下,可以看到最下面一行多了9999999
![e39cfaf8cf8baa57002fe227e1c0f619.png](https://img-blog.csdnimg.cn/img_convert/e39cfaf8cf8baa57002fe227e1c0f619.png)
四、jsp跳转
和Servlet的跳转一样,jsp跳转也分两种方式:服务端跳转、客户端跳转
1、客户端跳转(跳转后显示新网址)
新建一个jump.jsp并输入以下代码
<%
response.sendRedirect("NewFile.jsp");
%>
运行项目输入网址http://localhost:8080/JSP/jump.jsp,可以看到项目跳转到了NewFile.jsp,也可以使用火狐浏览器调试工具,可以看到返回代码是302,证明跳转到了NewFile.jsp
2、服务端跳转(跳转后网址显示不变)
修改jump.jsp程序为如下所示
<%
request.getRequestDispatcher("NewFile.jsp").forward(request, response);
%>
或者使用简化的代码
<jsp:forward page="hello.jsp"/>
JSP cookie
有的时候,我们会遇到这样的情况,输入一次账号密码,接下来一周或者一个月都不需要再次输入就能够登录,这是靠cookie实现的
1、什么是cookie
cookie是浏览器和服务器交互数据的方式,cookie由服务器创建,但是服务器并不保存这个cookie,而是在建立后发送给浏览器,交给浏览器保存在用户本地,下次访问网站的时候,就会把该cookie发送给服务器。
2、创建一个cookie
步骤为:
Cookie c=new Cookie("name","Gareen");创建一个cookie对象,名字是name,值是Gareen
c.setMaxAge(24*60*60);设定cookie保存的时间,单位是s,如果设置为0,那么网页关闭的时候这个cookie就被销毁
c.setPath("/");设置访问什么路径的时候提交cookie,如果是"/"则表示访问任何路径都会提交cookie
response.addCookie(c);通过response把这个cookie保存在本地浏览器中
下面进行实践,新建一个setCookie.jsp文件,写代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
Cookie c = new Cookie("name", "Gareen");
c.setMaxAge(60 * 24 * 60);
c.setPath("/");
response.addCookie(c);
%>
<%--用来跳转到获取cookie信息界面--%>
<a href="getCookie.jsp">跳转到获取cookie的页面</a>
运行项目,在火狐浏览器中输入网址http://localhost:8080/JSP/setCookie.jsp,可以在调试工具中看到
![1aa66ce41bebeaaddfa6523ce23ac871.png](https://img-blog.csdnimg.cn/img_convert/1aa66ce41bebeaaddfa6523ce23ac871.png)
3、获取cookie中的信息
创建getCookie.jsp文件,
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for (int d=0;d<=cookies.length-1;d++){
out.print(cookies[d].getName()+" "+cookies[d].getValue()+"<br>");
}
}
%>
点击刚才页面上的【跳转到获取cookie的页面】,界面如下
![92316e3d1f466e4061a5d0435d9e8c60.png](https://img-blog.csdnimg.cn/img_convert/92316e3d1f466e4061a5d0435d9e8c60.png)
4、尝试建立多个cookie
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
Cookie c = new Cookie("name", "Gareen");
c.setMaxAge(60 * 24 * 60);
c.setPath("/");
response.addCookie(c);
Cookie c2 = new Cookie("name2", "Gareen");
c2.setMaxAge(60 * 24 * 60);
c2.setPath("/");
response.addCookie(c2);
Cookie c3 = new Cookie("name3", "Gareen");
c3.setMaxAge(60 * 24 * 60);
c3.setPath("/");
response.addCookie(c3);
%>
<a href="getCookie.jsp">跳转到获取cookie的页面</a>
现访问http://localhost:8080/JSP/setCookie.jsp,然后获取cookie信息,如
![63359479d8e24a4d7423e15a0638b5f4.png](https://img-blog.csdnimg.cn/img_convert/63359479d8e24a4d7423e15a0638b5f4.png)
JSP Session
一个服务器,有很多用户访问,每一个用户访问服务器,就会在服务器上建立一个Session,用来存放一个用户从打开浏览器到关闭浏览器的所有操作。
1、新建一个session
新建setSession.jsp文件,内部写入程序,其中session.setAttribute("name","teemo")负责新建一个session,这个session的name是teemo
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
session.setAttribute("name", "teemo");
%>
<a href="getSession.jsp">跳转到获取session的页面</a>
2、获取session的参数
新建getSession.jsp写入代码,其中session.getSession("name")负责获取数据。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
<%
String name = (String)session.getAttribute("name");
%>
session中的name: <%=name%>
输入网址http://localhost:8080/JSP/setSession.jsp,点击【跳转到获取session的页面】,可见获取到了刚才新建的session的name如下
![ac76cba834fe1411fa739f1a79e476bc.png](https://img-blog.csdnimg.cn/img_convert/ac76cba834fe1411fa739f1a79e476bc.png)
3、Session和Cookie关系
一个服务器上,有多个用户使用自己的浏览器访问服务器,那怎么知道每个用户对应服务器上的哪个session呢,这就用到了cookie,cookie是session的钥匙。
4、如果浏览器禁用了cookie怎么办
有些浏览器禁用了cookie,那么怎么使用session呢?
如果没有cookie,那么服务器就不能获取到jsessionid,那么每次访问服务器,服务器都会新建一个session对象。
![f779c404b27b879982fc3dbc85525cda.png](https://img-blog.csdnimg.cn/img_convert/f779c404b27b879982fc3dbc85525cda.png)
为了解决这个问题,可以在setSession.jsp中用<a href="<%=response.encodeURL("getSession.jsp")%>">跳转到获取session的页面替换掉跳转到获取session的页面
这是因为response.encodeURL()方法会把getSession.jsp这个URL转换成getSession.jsp;jsessionid=22424AEA86ADBE89F335EEB649D997A8,这样就有了一个jsessionid,提交这个jsessionid到服务器就可以找到对应的session,和session相关的功能就能正常工作了
5、session的有效期
登录一个网站后,短时间内不用重复登录,但是一段时间后仍旧会要求重新登录,这是因为服务端的session一段时间后失效了,这个时间在tomcat中默认为30分钟。可以打开tomcatconfweb.xml文件查看,也可以在文件中修改。
![f46d7ec1e6d2fb9fef3dd7ae9e9576ba.png](https://img-blog.csdnimg.cn/img_convert/f46d7ec1e6d2fb9fef3dd7ae9e9576ba.png)
JSP作用域
JSP有4个作用域,分别是:
pageContext 当前页面
requestContext 一次请求
sessionContext 当前会话
applicationContext 全局,所有用户共享
JSP隐式对象
JSP共有9个隐式对象request、response、out、pageContext、session、application、page、config、exception
其中有些很熟悉了,
request代表请求 response代表响应 out代表输出 pageContext代表当前页面作用域 session代表会话作用域 application代表全局作用域
1、page表示当前对象
page就代表了this
新建test.jsp,输入代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
page:<%=page%>
<br>
this:<%=this%>
输入网址http://localhost:8080/JSP/test.jsp,可以看到显示如下:
![258c3811acc47dd015dbdfcf3e0bfe19.png](https://img-blog.csdnimg.cn/img_convert/258c3811acc47dd015dbdfcf3e0bfe19.png)
2、config可以获取一些在web.xml中初始化的参数
分为两个步骤:
1)在web.xml配置一些信息,才能在jsp中获取到信息
2)通过config.getInitParameter("database-ip")获取配置信息
新建一个web.xml,并添加以下信息
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<!-- 把 testconfig.jsp配置为一个 servlet -->
<servlet-name>test</servlet-name>
<jsp-file>/test.jsp</jsp-file>
<!-- 配置初始化参数 -->
<init-param>
<param-name>database-ip</param-name>
<param-value>127.0.0.1</param-value>
</init-param>
</servlet>
<!-- 将路径 test映射到test.jsp -->
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
这样的话,在test.jsp中就可以获取到初始化参数。test.jsp中程序如下
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
database-ip:<%=config.getInitParameter("database-ip")%>
输入网址http://localhost:8080/JSP/test,可以获得初始化参数如下:
![5caed856f9b544fa349bf418ffcc1a09.png](https://img-blog.csdnimg.cn/img_convert/5caed856f9b544fa349bf418ffcc1a09.png)
注意这里的网址后面没有.jsp,如果输入网址http://localhost:8080/JSP/test.jsp是获取不到初始化参数的,如下
![dff5d5d4427d35faceb13721bd8f6dcb.png](https://img-blog.csdnimg.cn/img_convert/dff5d5d4427d35faceb13721bd8f6dcb.png)
3、exception
表示异常
新建一个try.jsp和catch.jsp,在try.jsp中写入程序:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="catch.jsp"%>
<% int [] a = new int[10]; a[20]=5; %>
很明显,执行代码会存在索引溢出错误,因此程序指定了一旦出现异常就交给catch.jsp处理
在catch.jsp中写入代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<%=exception%>
必须设置isErrorPage="true"才能使用exception
浏览器输入网址http://localhost:8080/JSP/try.jsp,输出界面如下,可以看到输出了索引越界异常。
![13b143c4992266fc60217d63b66c661b.png](https://img-blog.csdnimg.cn/img_convert/13b143c4992266fc60217d63b66c661b.png)
JSTL
全称JSP Standard Tag Library,使开发人员可以像使用HTML标签那样在JSP开发java功能,JSTL库有core、fmt、sql、i18n
1、导入jar包
新建一个动态web项目test,且新建jsp文件testjstl.jsp。为了在JSP中使用JSTL,需要以引入两个jar包,分别为jstl.jar和standard.jar,下载地址http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/,解压后把jakarta-taglibs-standard-1.1.2/lib/下的两个jar文件:standard.jar 和 jstl.jar 文件拷贝到/WEB-INF/lib/下。
2、set、out、remove
在testjstl.jsp中输入代码,里面涉及到了一些EL表达式,后面会学习到,很简单:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="name" value="${'zhangsan'}" scope="request"/>
通过标签获取name:<c:out value="${name}"/><br>
<c:remove var="name" scope="request"/>
再次通过标签获取name:<c:out value="${name}"></c:out>
</body>
</html>
代码输入后文件可能报错javax.servlet.jsp.JspException cannot be resolved to a type。在网上找的解决方案是在你的项目中加入jsp-api.jar和servlet-api.jar包,这两个包来源于tomcat的libs目录中,但是会出现一个问题,项目打包发布的时候也会将这两个jar打包出去,这时候发布到tomcat中后tomcat可能启动失败,同时你的jar包可能和tomcat中的jar版本不一致等情况。
解决方式:右键你的项目--properties选择Targeted Runtimes,选择你的运行环境,我选择Apache Tomcat v7.0,Apply--OK。
运行后输入网址http://localhost:8080/test/testjstl.jsp结果如下:
![3711dea1fc110ffc5ea848dfa04ab0aa.png](https://img-blog.csdnimg.cn/img_convert/3711dea1fc110ffc5ea848dfa04ab0aa.png)
3、if else
JSTL通过<c:if test="">进行条件判断,但是JSTL中没有<c:else,所以常用办法是在<c:if的条件里面取反。
配合if使用的还有通过empty判断是否为空,empty可以判断对象是否为null、字符串长度是否为0、集合长度是否为0.
修改testjstl.jsp如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="hp" value="${10}" scope="request"/>
<c:if test="${hp<5}">
<p>这个英雄快要挂了</p>
</c:if>
<c:if test="${!(hp<5)}">
<p>这个英雄还可以抢救</p>
</c:if>
<%
pageContext.setAttribute("武器", null);
pageContext.setAttribute("遗言", "");
pageContext.setAttribute("物品栏", new ArrayList());
%>
<c:if test="${empty 武器}">
<p>没有携带武器</p>
</c:if>
<c:if test="${empty 遗言}">
<p>没有遗言</p>
</c:if>
<c:if test="${!empty 遗言}">
<p>你要好好活下去</p>
</c:if>
<c:if test="${empty 物品栏}">
<p>物品栏为空</p>
</c:if>
</body>
</html>
运行结果为:
![80001dd920eca7ee4d2d62d0cea1ec38.png](https://img-blog.csdnimg.cn/img_convert/80001dd920eca7ee4d2d62d0cea1ec38.png)
4、choose标签
虽然JSTL没有提供else标签,但是提供了一个else功能的标签
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="hp" value="${10}" scope="request"/>
<c:choose>
<c:when test="${hp<5}">
这个英雄要挂了
</c:when>
<c:when test="${!(hp<5)}">
这个英雄还可以抢救
</c:when>
</c:choose>
</body>
</html>
![ae62b9059aa10c3add7badca0081cd5b.png](https://img-blog.csdnimg.cn/img_convert/ae62b9059aa10c3add7badca0081cd5b.png)
5、forEach
JSP中可以使用for循环,但是可读性很差,如果使用JSTL的c:forEach标签可以改善可读性。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
List<String> heros = new ArrayList<String>();
heros.add("塔姆");
heros.add("艾克");
heros.add("巴德");
heros.add("雷克赛");
request.setAttribute("heros", heros);
%>
<%--
items="${heros}" 表示遍历的集合
var="hero" 表示把每一个集合中的元素放在hero上
varStatus="st" 表示遍历的状态
--%>
<c:forEach items="${heros}" var="hero" varStatus="st">
<c:out value="${hero}"></c:out>
</c:forEach>
</body>
</html>
遍历结果如下:
![10207970b3940ece1aa83567a7cbe6ef.png](https://img-blog.csdnimg.cn/img_convert/10207970b3940ece1aa83567a7cbe6ef.png)
6、forTokens拆分字符串
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="heros" value="塔姆,艾克;巴德|雷克赛!卡莉丝塔" />
<c:forTokens items="${heros}" delims=":;|!" var="hero">
<c:out value="${hero}" /> <br />
</c:forTokens>
</body>
</html>
运行结果如下:
![017ca98d82530b84565319c78bbe3820.png](https://img-blog.csdnimg.cn/img_convert/017ca98d82530b84565319c78bbe3820.png)
7、fmt:formatNumber格式化数字
<fmt:formatNumber 表示要格式化的数字 minFractionDigits 小数点至少要有的位数 maxFractionDigits 小数点最多能有的位数
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="money" value="888.8" />
<c:set var="pi" value="3.1415926" />
最少两个小数点:
<fmt:formatNumber type="number" value="${money}" minFractionDigits="2"/>
<br>
最多两个小数点:
<fmt:formatNumber type="number" value="${pi}" maxFractionDigits="2" />
</body>
</html>
8、fmt:formatDate格式化日期
三种格式
<fmt:formatDate value="${now}" pattern="G yyyy年MM月dd日 E"/>
<fmt:formatDate value="${now}" pattern="a HH:mm:ss.S z"/>
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Date now = new Date();
pageContext.setAttribute("now", now);
%>
完整日期:<fmt:formatDate value="${now}" pattern="G yyyy年MM月dd日 E"/>
<br>
完整时间:<fmt:formatDate value="${now}" pattern="a HH:mm:ss.S z"/>
<br>
常见格式:<fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/>
</body>
</html>
![45314bcd28f59725dcb1d5d9cf04bbea.png](https://img-blog.csdnimg.cn/img_convert/45314bcd28f59725dcb1d5d9cf04bbea.png)
9、fn
fn标签提供各种实用功能,使用之前首先加入指令:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="name" value="hello jsp fajslkdj hiosdfgldsf"></c:set>
${fn:substring(name,5,25)}
</body>
</html>
![ea636d58148b9ef6530f747a91ad40c2.png](https://img-blog.csdnimg.cn/img_convert/ea636d58148b9ef6530f747a91ad40c2.png)
EL表达式
使用EL表达式非常简单,但是由于不同的tomcat对EL是否支持是不一样的,因此要在页面上加上一句isELIgnored="false"
1、EL获取值 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <c:set var="name" value="EL贼好用"></c:set> 通过JSTL方式获取:<c:out value="${name}"></c:out>
通过EL方式获取:${name} </body>
![3767d39fca3e1a68df77ba2ef4c8c3ca.png](https://img-blog.csdnimg.cn/img_convert/3767d39fca3e1a68df77ba2ef4c8c3ca.png)
2、作用域优先级
EL表达式可以从pageContext,request,session,application四个作用域中取到值,如果4个作用域都有name属性怎么办? EL会按照从高到低的优先级顺序获取:pageContext>request>session>application
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="name" value="EL贼好用"></c:set>
<c:set var="name" value="${'gareen-pageContext'}" scope="page" />
<c:set var="name" value="${'gareen-request'}" scope="request" />
<c:set var="name" value="${'gareen-session'}" scope="session" />
<c:set var="name" value="${'gareen-application'}" scope="application" />
4个作用域都有name,优先获取出来的是 : ${name}
</body>
</html>
3、javaBean
JavaBean的标准 1. 提供无参public的构造方法(默认提供) 2. 每个属性,都有public的getter和setter 3. 如果属性是boolean,那么就对应is和setter方法
package bean;
public class Hero {
public int id;
public String name;
public float hp;
public int damage;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getHp() {
return hp;
}
public void setHp(float hp) {
this.hp = hp;
}
public int getDamage() {
return damage;
}
public void setDamage(int damage) {
this.damage = damage;
}
}
获取JavaBean的属性,只需要通过.符号操作就可以了。像这样 ${hero.name} ,就会自动调用getName方法了,如果属性是boolean类型,那么就会自动调用isXXX方法了。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false" import="bean.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
Hero hero =new Hero();
hero.setName("盖伦");
hero.setHp(616);
request.setAttribute("hero", hero);
%>
英雄名字 : ${hero.name} <br>
英雄血量 : ${hero.hp}
4、 结合JSTL的<c:forEach
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
List<String> heros = new ArrayList<String>();
heros.add("塔姆");
heros.add("艾克");
heros.add("巴德");
heros.add("雷克赛");
heros.add("卡莉丝塔");
request.setAttribute("heros",heros);
%>
<%--jstl foreach迭代 --%>
<c:forEach items="${heros}" var="hero" varStatus="st">
<c:out value="${hero}"></c:out>
</c:forEach>
<br>
<%-- 结合JSTL的<c:forEach --%>
<c:forEach items="${heros}" var="hero" varStatus="st">
${hero}
</c:forEach>
5、取参
可以在网址中赋值,比如输入网址http://localhost:8080/test/testjstl.jsp?name=abc
且程序如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
${param.name}
结果会显示abc
6、eq、ne、neq、gt、lt、gte等等
使用eq进行条件判断,大大简化了JSTL中的c:if和c:choose代码
例子中讲的是大于等于,除此之外的其他用法如下:
eq相等 ne、neq不相等,
gt大于, lt小于
gt大于, lt小于
gte、ge大于等于
lte、le 小于等于
not非 mod求模
is [not] div by是否能被某数整除
is [not] even是否为偶数
is [not] odd是否为奇
比如这样:${killNumber ge 10? "超神":"还没超神" }。表示剩余血量>=