EL表达式
请求输出语法和作用域
EL表达式是用于JSP页面的简化输出方法,全称为Expression Language。基本语法为${[作用域].属性[.子属性]}
,例如:<h1>职员姓名:${requestScope.employee.name}</h1>
即可在页面上输出结果。
作用域 | 描述 |
---|---|
pageScope | 从当前页面取值 |
requestScope | 从当前请求中取值 |
sessionScope | 从当前会话中取值 |
applicationScope | 从当前应用获取全局属性取值 |
EL表达式存在4种作用域对象,如果在页面中忽略作用域,会默认按照从小到大依次尝试获取结果。
EL表达式可以进行数值运算,逻辑运算,对象属性输出和对象的输出。这里输出对象也是调用了Java类的toString()方法。
例如:
创建一个员工类(Employee)定义编号、姓名、部门三个属性(代码略)。
创建Servlet类并创建一个Employee对象对其赋值,将其作为request属性发送给前端页面。
package com.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/employee")
public class ExpressionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Employee employee = new Employee();
employee.setId("S001");
employee.setName("张三");
employee.setDepartment("销售部");
req.setAttribute("employee", employee);
// 添加grade参数测试对象的作用域
req.setAttribute("grade", "A");
HttpSession session = req.getSession();
session.setAttribute("grade", "B");
ServletContext context = req.getServletContext();
context.setAttribute("grade", "C");
req.getRequestDispatcher("info.jsp").forward(req, resp);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Expression</title>
<style>
tr, td, th {
border: 1px solid #000000;
}
</style>
</head>
<body>
<table style="border: 1px solid #000000;">
<tr>
<th>员工编号</th>
<th>员工姓名</th>
<th>员工部门</th>
<th>员工评级</th>
</tr>
<tr>
<td>${requestScope.employee.id}</td>
<td>${requestScope.employee.name}</td>
<td>${requestScope.employee.department}</td>
<td>${grade}</td>
</tr>
</table>
<p>员工信息:${employee}</p>
</body>
</html>
由页面输出的结果可以看出当忽略作用域时就会从小到大搜索给属性,即先获取request中的属性。所以建议每个输出都要有作用域,保证代码的严谨性。
获取请求中的参数
EL中提供了${param.参数名}
表达式可获取地址栏中的请求参数,简化了参数的输出。
JSTL
JSTL(JSP Standard Tag Library)是一套标准的JSP标签库,用于简化JSP的开发,提高代码的可读性与可维护性。JSTL是有SUN(Oracle)定义规范,由Apache Tomcat实现。
JSTL由4个基础jar包提供功能
jar包 | 描述 |
---|---|
taglibs-standard-impl-1.2.5.jar | 标签库的实现包 |
taglibs-standard-spec-1.2.5.jar | 标签库的定义包 |
taglibs-standard-jstlel-1.2.5.jar | el表达式支持包(非必须) |
taglibs-standard-compat-1.2.5.jar | 1.0版本兼容包(非必须) |
JSTL按照功能可以换分为5种类型的标签库,分别为核心标签库(core)、格式化标签库(fmt)、SQL操作标签库(sql)、XML操作标签库(XML)、函数标签库(functions)。其中后三种不常用,有更便捷的技术用于替代,主要使用的还是核心标签库和格式化标签库。
核心标签库
引用
在页面的开始需要进行标签库的引用:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
,其中prefix
标识标签的标识,值为c
时即所有的标签需要c
开头,uri
则表示了使用的版本。
条件判断
主要使用两组标签来用于进行逻辑判断<c:if text="">
和<c:choose> <c:when text=""> <c:otherwise>
。
<c:if>
标签只能用于单逻辑判断
示例:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
成绩:${requestScope.score}
<c:if test="${requestScope.score >= 60}" >
<p>成绩合格</p>
</c:if>
<c:if test="${requestScope.score < 60}" >
<p>成绩不合格</p>
</c:if>
</body>
</html>
<c:choose>
标签类似于Java中的if...else...
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:choose>
<c:when test="${requestScope.grade == 'A'}">
<p>成绩优异</p>
</c:when>
<c:when test="${requestScope.grade == 'B'}">
<p>成绩一般</p>
</c:when>
<c:when test="${requestScope.grade == 'C'}">
<p>成绩普通</p>
</c:when>
<c:otherwire>
<p>成绩较差</p>
</c:otherwire>
</c:choose>
</body>
</html>
循环输出
与Java中的foreach类似但要更为简便,用于输出集合中的元素,基本语法为<c:forEach item="${requestScope.list}" var="item“ varStatus="idx”>
。item
为request中获取的集合元素,var
表示为实体类的对象,varStatus
为遍历的编号。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table>
<tr>
<th>序号</th>
<th>编号</th>
<th>姓名</th>
<th>部门</th>
</tr>
<c:forEach items="${requestScope.list}" var="employee" varStatus="idx">
<tr>
<td>${idx.index + 1}</td>
<td>${employee.id}</td>
<td>${employee.name}</td>
<td>${employee.department}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
Servlet类
package com.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/employee")
public class ExpressionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Employee employee = new Employee();
employee.setId("S001");
employee.setName("张三");
employee.setDepartment("销售部");
List<Employee> list = new ArrayList<>();
list.add(employee);
list.add(new Employee("S002", "李四", "销售部"));
req.setAttribute("employee", employee);
req.setAttribute("score", 89);
req.setAttribute("list", list);
// 添加grade参数测试对象的作用域
req.setAttribute("grade", "A");
HttpSession session = req.getSession();
session.setAttribute("grade", "B");
ServletContext context = req.getServletContext();
context.setAttribute("grade", "C");
req.getRequestDispatcher("core.jsp").forward(req, resp);
}
}
格式化标签库
格式化标签库用于将时间或金额等信息按照某种格式进行处理的
<fmt:formatDate value="date" pattern="yyyy-MM-dd HH:mm:ss.SSS" />
:格式化时间,value为获取的对象,pattern为需要的格式
表达式 | 描述 |
---|---|
yyyy | 年份 |
MM | 月份 |
dd | 日 |
HH | 24小时制 |
hh | 12小时制 |
mm | 分钟 |
ss | 秒 |
SSS | 毫秒 |
<fmt:formatNumber value = "${amt }" pattern="0,00.00">
:格式化数字,value为获取的对象,pattern为需要的格式
表达式 | 描述 |
---|---|
0.00 | 保留两位小数 |
0,000.00 | 在千分位用逗号隔开 |
<c:out value="${nothing }" default="">
:获取默认值,value为获取的对象,default为默认值,若值为null则会使用default值<c:out value="${ html}" escapeXml="true">
:是否解析HTML,对于一些HTML代码如果想原样输出在页面上可以使用该标签,当escapeXml
为true时会解析HTML文件,为false时会原样输出。
示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ 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>
<%
request.setAttribute("amt", 1987654.326);
request.setAttribute("now", new java.util.Date());
request.setAttribute("html", "<a href='index.html'>index</a>");
request.setAttribute("nothing", null);
%>
<h2>${now }</h2>
<h2>
<fmt:formatDate value="${requestScope.now }" pattern="yyyy-MM-dd HH:mm:ss.SSS" />
</h2>
<h2>${amt }</h2>
<h2>¥<fmt:formatNumber value = "${amt }" pattern="0,00.00"></fmt:formatNumber>元</h2>
<h2>null默认值:<c:out value="${nothing }" default="无"></c:out> </h2>
<h2><c:out value="${ html}" escapeXml="true"></c:out></h2>
</body>
</html>