天天看点

JSTL与EL表达式EL表达式JSTL

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>
           
JSTL与EL表达式EL表达式JSTL
由页面输出的结果可以看出当忽略作用域时就会从小到大搜索给属性,即先获取request中的属性。所以建议每个输出都要有作用域,保证代码的严谨性。

获取请求中的参数

EL中提供了

${param.参数名}

表达式可获取地址栏中的请求参数,简化了参数的输出。

JSTL与EL表达式EL表达式JSTL

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>

           
JSTL与EL表达式EL表达式JSTL

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>