一、El
1.1 El语法
${表达式}
特点:
- (1)EL可以与JavaScript语句结合使用。
- (2)EL可以自动进行类型转换。如果想通过EL获取两个字符串数值(如number1和number2)的和,可以直接通过"+"符号进行连接(如$ {number1+number2})。
- (3)EL不仅可以访问一般变量,还可以访问JavaBean中的属性、嵌套属性和集合对象。
- (4)在EL中,可以执行算术运算、逻辑运算、关系运算和条件运算等。
- (5)在EL中,可以获取pageContext对象,进而获取其他内置对象。
- (6)在使用EL进行除法运算时,如果除数为0,则返回表示无穷大的Infinity,而不返回错误。
- (7)在EL中,可以访问JSP的作用域(request、 session、 application 以及page)。
演示
新建一个类,请求转发获取域对象,来使用El表达式
java
@WebServlet("/RequestServlet04")
public class El extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("username","zhansan");
req.setAttribute("password",123456);
RequestDispatcher requestDispatcher = req.getRequestDispatcher("Demo4.jsp");
requestDispatcher.forward(req,resp);
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPut(req, resp);
}
}
请求转发的页面
html
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
用户名:<%= request.getAttribute("username")%> <br>
密码:<%= request.getAttribute("password")%> <br>
使用El: <br>
用户名:${username} <br>
密码:${password} <br>
</body>
</html>
运行结果;
EL明显简化了JSP页面的书写,使程序简洁易维护。另外,当域对象里面的值不存在时,使用EL获取域对象里面的值时返回空字符串;而使用Java方式获取时,如果返回值是null,会报空指针异常,所以在实际开发中推荐使用EL的方式获取域对象中存储的数据。
1.2 EL运算符
|---------|---------------------------|
| 优先级 | 运算符 |
| 1 | [ ] . |
| 2 | ( ) |
| 3 | -(unary) not ! empty |
| 4 | * / div % mod |
| 5 | + -(binary) |
| 6 | < > <= >= lt gt le ge |
| 7 | == != eq ne |
| 8 | && and |
| 9 | || or |
| 10 | ?: |
注意:在应用EL取值时,没有数组的下标越界,没有空指针异常,没有字符串的拼接。
二、El隐式对象
EL提供了11个隐式对象,pageContext可以获取其他10个隐式对象。
- pageScope、requestScope、sessionScope、applicationScope用于获取指定域的隐式对象
- param和paramValues用于获取请求参数的隐式对象,
- header和headerValues用于获取HTTP请求消息头的隐式对象;
- cookie用于获取Cookie信息的隐式对象;
- initParam用于获取Web应用初始化信息的隐式对象。
2.1 pageContest对象的使用
html
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
请求URI为: ${pageContext.request.requestURI} <br>
Content-Type响应头为: ${pageContext.response.contentType} <br>
服务信息为: ${pageContext.servletContext.serverInfo} <br>
Servlet注册名为: ${pageContext.servletConfig.servletName} <br>
</body>
</html>
2.2 4个不同范围的域对象
pageScope、requestScope、 sessionScope和applicationScope4个隐式对象都可以通过setAttribute()方法存储属性,通过getAttribute()方法获取属性。如果存在相同的在name属性,那么会在page、request、session、application这4个作用域内按顺序依次查找对应的属性。
html
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<% pageContext.setAttribute("username", "zhansan");%>
<% request.setAttribute("bookName", "Mysql");%>
<% session.setAttribute("username", "lisi");%>
<%application.setAttribute("bookName", "Mybatis");%>
${pageScope.username};
${requestScope.bookName};
${sessionScope.username};
${applicationScope.bookname};//这里是小写,上面大写
</body>
</html>
当没有对应的值时后,显示为空。
2.3 获取请求参数param和paramValues两个对象
param对象用于获取请求参数的某个值,它是Map类型,与request.getParameter()方法相同,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。
如果一个请求参数有多个值,可以使用paramValues对象获取请求参数的所有值,该对象返回请求参数所有值组成的数组,如果要获取某个请求参数的第一个值,可以使用下标。
html
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/El/param.jsp">
num1:<input type="text" name="num1"> <br>
num2:<input type="text" name="num"> <br>
num3:<input type="text" name="num"> <br>
<input type="submit" value="提交"> <br>
<input type="submit" value="重置">
<hr>
num1:${param.num1} <br>
num2:${paramValues.num[0]} <br>
num3:${paramValues.num[1]} <br>
</form>
</body>
</html>
2.4 cookie对象
该对象是一个集合了所有Cookie信息的Map集合,Map集合中元素的键为各个Cookie的名称,值则为对应的Cookie对象。
html
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
cookie对象信息:${cookie.userName} <br>
cookie对象的名称和值:${cookie.userName.name} = ${cookie.userName}
<%response.addCookie(new Cookie("userName","zhangsan"));%>
</body>
</html>
第一次访问:需要先让cookie对象存放才能被获取
第二次访问:(刷新后)
2.5 initParam对象
在web.xml中添加
XML
<context-param>
<param-name>author</param-name>
<param-value>曹雪芹</param-value>
</context-param>
jsp页面El获取
XML
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
Author的值:${initParam.author}
</body>
</html>
运行结果
三、JSTL
标准标签库(JavaServer Pages Standard Tag Library),简称JSTL。
核心标签库:<%@ taglib prefix="c" url="http://java.sun.com/jsp/jstl/core" %>。主要用于完成JSP页面的常用功能,包括JSTL的表达式标签、URL标签、流程控制标签。例如,用于输出文本内容的<c:out>标签、用于条件判断的<c:if>标签、用于迭代循环的<c:forEach>标签等。
格式标签库:<%@ taglib prefix "fmt" url="http://java.sun.com/jsp/jstl/fmt"%>。实现Web应用程序的国际化标签和格式化标签。
SQL标签库:<%@ taglib prefix="sql" url="http://java.sun.com/jsp/jstl/sql" %>。用于访问数据库和操作数据库的标签。
XML标签库:<%@ taglib prefx="xml" url="http://java.sun.com/jsp/jstl/xml" %>,包含对XML文档中的数据进行操作的标签。
函数标签库:<%@ taglib prefix= "fn" url="http://java.sun.com/jsp/jstl/functions"%>,包含了JSP网页制作者经常要用到的字符串操作。
下载jakarta-taglibs-standard-1.1.2.zip之后将其lib目录下的两个jar包导入对应的目录。
注意:taglib指令的uri属性用于指定引入标签库描述符文件的URI,prefix属性用于指定引入标签库描述符文件的前缀,在JSP文件中使用这个标签库中的某个标签时,都需要使用这个前缀。
案例演示:
XML
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:out value="Hello World!"></c:out>
</body>
</html>
四、JSTL中的Core标签库
4.1 <c:out> :向页面输出一段文本信息
两种格式:
有标签体
<c:out value="value" [escapeXml="{true|false}"]>
defaultValue </c:out>
无标签体
<c:out value="value" [default="defaultValue"] [escapeXml="{true|false}"]/>
- (1)value属性用于指定输出的文本内容。
- (2)default属性用于指定当value属性为null时所输出的默认值,该属性是可选的(中括号中的属性都是可选的)。
- (3)escapeXml属性用于指定是否将>、<、&、'、" 等特殊字符进行HTML编码转换后再进行输出,默认值为true。
需要注意的是,只有当value属性值为null时,<c:out>标签才会输出默认值,如果没有指定默认值,则默认输出空字符串。
XML
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--第1个out标签 --%>
userName属性的值为:
<c:out value="${param.username}" default="unknown"/> <br/>
<%--第2个out标签 --%>
userName属性的值为:
<c:out value="${param.username}">
unknown
</c:out>
</body>
</html>
XML
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head></head>
<body>
<%--escapeXml="true"--%>
<c:out value="${param.username }" escapeXml="false">
<meta http-equiv="refresh"
content="0;url=https://www.baidu.com/" />
</c:out>
</body>
</html>
当escapeXml="false"设置为false时,url中不会被转义,而是直接跳转到对应的链接,当把其设置为true时候,就能显示对应的界面。
4.2 <c:remove>:
<c:remove var="name" [scope="范围"]/>
var:用于指定要移除的变量名。
scope:用于指定变量的有效范围,可选值有page、request、session和application,默认值为page。如果在该标签中没有指定变量的有效范围,那么将分别在page、request、 session 和application的范围内查找要移除的变量并移除。例如,在一个页面中,存在不同范围的两个同名变量,当不指定范围时移除该变量,这两个范围内的变量都将被移除。因此,在移除变量时,最好指定变量的有效范围。
4.3 流程控制标签
①<c:if>标签,有三个属性
- test属性用于设置逻辑表达式。
- var属性用于指定逻辑表达式中变量的名字。
- scope属性用于指定var变量的作用范围,默认值为page
java
<%@ page language="java" contentType="text/html; charset=utf-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>欢迎页面</title>
</head>
<body>
<c:if test="${empty sessionScope.visitCount}">
<c:set var="visitCount" value="1" scope="session"/>
欢迎你!
</c:if>
<c:if test="${sessionScope.visitCount == 1}">
<c:set var="visitCount" value="${visitCount + 1}" scope="session"/>
欢迎你!这是你的第${visitCount}次访问。
</c:if>
<c:if test="${sessionScope.visitCount > 1}">
这是你的第${sessionScope.visitCount}次访问。
</c:if>
</body>
</html>
②<c:choose>、<c:when>和<c:otherwise>标签
<c:choose>标签没有属性,在它的标签体中只能嵌套一个或多个<c:when>标签,零个或一个<c:otherwise>标签,并且同一个<c:choose>标签中所有的<c:when>子标签必须出现在<c:otherwise>子标签之前。
java
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head></head>
<body>
<c:choose>
<c:when test="${empty param.username}">
Unknown find
</c:when>
<c:when test="${param.username=='zhangsan' }">
${ param.username} is manager.
</c:when>
<c:otherwise>
${ param.username} no
</c:otherwise>
</c:choose>
</body>
</html>
案例:
③<c:forEach>
- var属性:用于将当前迭代到的元素保存到page域中的名称。
- items属性:用于指定将要迭代的集合对象。
- varStatus属性:用于指定将当前迭代状态信息的对象保存到page域中的名称。
- begin属性:用于指定从集合中第几个元素开始进行迭代,begin的索引值从0开始,如果没有指定items属性,就从begin指定的值开始迭代,直到迭代结束为止。
- step属性:用于指定迭代的步长,即迭代因子的增量。