JSTL与EL表达式

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.jarel表达式支持包(非必须)
taglibs-standard-compat-1.2.5.jar1.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
HH24小时制
hh12小时制
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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值