第7章 EL和JSTL

本文介绍了EL表达式如何简化取值,以及JSTL标签库在遍历、判断和操作集合中的应用。涵盖了pageContext、Web域相关对象、隐式对象和常用JSTL标签的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、EL表达式

Expression Language 表达式语言,常用于取值
我们之前在JSP中写java代码必须写在<%%>里面。并且取值代码比较繁琐。
而EL表达式可以使我们的取值代码更加简洁

语法非常简单:${}

MyServlet用于存储用户名和密码

import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet(name = "MyServlet",urlPatterns="/MyServlet")
public class MyServlet extends HttpServlet {
    public void doGet(HttpServletRequest request,
        HttpServletResponse  response) throws ServletException, IOException {
        request.setAttribute("username", "itcast");
        request.setAttribute("password", "123");
        RequestDispatcher dispatcher = request
                .getRequestDispatcher("/myjsp.jsp");
        dispatcher.forward(request, response);
    }
    public void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

web目录下编写一个名称为myjsp的JSP文件,比较Java代码和EL的区别:

<%@ page language="java" contentType="text/html; charset=utf-8" %>
<html>
<head></head>
<body>
用户名:<%=request.getAttribute("username")%><br/>
密 码:<%=request.getAttribute("password")%><br/>
<hr/>
使用EL:<br/>
用户名:${username}<br/>
密 码:${password}<br/>
</body>
</html>

使用EL表达式则可以减少很多取值的代码,接 ${username} 。这些值是从哪取的呢,实际上就是从四大作用域中获取的。servlet中的四个作用域分别为 pagerequestsessionapplication

2、EL隐式对象

隐式对象名称

      

pageContext

对应于JSP页面中的pageContext对象,

pageScope

代表page域中用于保存属性的Map对象

requestScope

代表request域中用于保存属性的Map对象

sessionScope

代表session域中用于保存属性的Map对象

applicationScope

代表application域中用于保存属性的Map对象

param

表示一个保存了所有请求参数的Map对象

paramValues

表示一个保存了所有请求参数的Map对象,它对于某个请求参数,

返回的是一个String类型数组

header

表示一个保存了所有http请求头字段的Map对象

headerValues

表示一个保存了所有http请求头字段的Map对象,返回String类型数组

cookie

用于获取使用者的cookie值,cookie的类型是Map

initParam

表示一个保存了所有Web应用初始化参数的Map对象

上表列举的隐式对象中,pageContext可以获取其他10个隐式对象,pageScoperequestScopesessionScopeapplicationScope是用于获取指定域的隐式对象;paramparamValues是用于获取请求参数的隐式对象,headerheaderValues是用于获取HTTP请求消息头的隐式对象;cookie是用于获取Cookie信息的隐式对象;initParam是用于获取Web应用初始化信息的隐式对象。

2.1 pageContext

web目录下创建一个名为pageContext.jsp的文件演示pageContext隐式对象的具体用法:

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<html>
<head></head>
<body>
请求URI为:${pageContext.request.requestURI} <br />
Content-Type响应头:${pageContext.response.contentType} <br />
服务器信息为:${pageContext.servletContext.serverInfo} <br />
Servlet注册名为:${pageContext.servletConfig.servletName} <br />
</body>
</html>

需要注意的是,不要将EL中的隐式对象与JSP中的隐式对象混淆,只有pageContext对象是它们所共有的,其他隐式对象则毫不相关。

2.2 Web域相关对象

EL中提供了4 个用于访问作用域范围的隐式对象,即pageScoperequestScopesessionScopeapplicationScope。默认作用域从小到大:page->request->session->application。

应用这4个隐式对象指定所要查找的标识符的作用域后,系统将不再按照默认的顺序(page、Request、session及application)查找相应的标识符。它们与JSP中的page、request、session及application内置对象类似,只不过这4个隐式对象只能用于获取指定范围内的属性值,而不能获取其他相关信息。

${pageScope.userName} 
${requestScope.userName} 
${sessionScope.userName} 
${applicationScope.userName} 

/ *pageScope、requestScope、 sessionScope和applicationScope4个隐式对象都可以通过setAttribute()方法存储属性,通过getAttribute()方法获取属性。 */

示例:web目录下,新建一个名为scopes.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<% pageContext.setAttribute("userName", "itcast"); %>
<% request.setAttribute("bookName", "Java Web"); %>
<% session.setAttribute("userName", "itheima"); %>
<% application.setAttribute("bookName", "Java 基础"); %>
表达式\${pageScope.userName}的值为:${pageScope.userName} <br />
表达式\${requestScope.bookName}的值为:${requestScope.bookName} <br />
表达式\${sessionScope.userName}的值为:${sessionScope.userName} <br />
表达式\${applicationScope.bookName}的值为:${applicationScope.bookName}
<br />
表达式\${userName}的值为:${userName}
</body>
</body>
</html>

2.3  访问环境信息的隐式对象

web目录下,新建一个名为param.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<html>
<head></head>
<body style="text-align: center;">
<form action="${pageContext.request.contextPath}/param.jsp">
    num1:<input type="text" name="num1"><br />
    num2:<input type="text" name="num"><br />
    num3:<input type="text" name="num"><br /> <br />
    <input type="submit" value="提交" />&nbsp;&nbsp;
    <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对象

web目录下新建一个名为cookie.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<html>
<head></head>
<body>
Cookie对象的信息:<br />
${cookie.userName } <br />
Cookie对象的名称和值:<br />
${cookie.userName.name }=${cookie.userName.value }
<% response.addCookie(new Cookie("userName", "itcast")); %>
</body>
</html>

2.5 initParam对象

若没有则选择Java EE Tools -> Generate Deployment Descriptor Stub。Eclipse会自动添加web.xml至WEB-INF。

//web.xml 设置如下:
<context-param>
<param-name>author</param-name>
<param-value>张三</param-value>
</context-param>

//web包下创建initParam.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<html>
<head></head>
<body>
Author的值为:${initParam.author}
</body>
</html>

3、JSTL

SP标准标签库(JavaSeverPages Standard Tag Libary)
同样的也是为了简化我们的jsp代码,一般与EL表达式结合使用
EL表达式多用于取值操作,而JSTL则可以方便我们对集合进行遍历,对数据进行判断等操作。

首先,下载Standard Taglib:https://tomcat.apache.org/taglibs/standard/

 目前最新版本是1.2.5,将下面四个jar包下载后倒入到项目中即可。

 在jsp页面添加如下指令后,即可使用jstl标签了

//使用核心标签库的taglib指令格式如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
//核心标签库主要用于完成JSP页面的常用功能,包括JSTL的表达式标签、URL标签、流程控制标签。

//使用格式标签库的taglib指令格式如下:
<%@ taglib prefix "fmt" url="http://java.sun.com/jsp/jstl/fmt"%>
//国际化/格式化标签库,它包含实现Web应用程序的国际化标签和格式化标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、使日期按照本地格式显示等。

//使用SQL标签库的taglib指令格式如下:
<%@ taglib prefix="sql" url="http://java.sun.com/jsp/jstl/sql" %>
//SQL标签库,它包含了用于访问数据库和操作数据库的标签。例如,获取数据库连接、从数据库表中检索数据等。由于在软件分层开发模型中,JSP页面仅作为显示层,一般不会在JSP页面中直接操作数据库,所以,JSTL中提供的这套标签库不经常使用。

//使用XML标签库的taglib指令格式如下:
<%@ taglib prefx="xml" url="http://java.sun.com/jsp/jstl/xml" %> 
//XML文档的标签库,它包含对XML文档中的数据进行操作的标签。例如,解析XML文件、输出XML文档中的内容,以及迭代处理XML文档中的元素。XML广泛应用于Web开发,使用XML标签库处理XML文档更加简单方便。

//使用函数标签库的taglib指令格式如下:
<%@ taglib prefix= "fn" url="http://java.sun.com/jsp/jstl/functions"%>
//函数标签库,它提供了一套自定义EL函数,包含了JSP网页制作者经常要用到的字符串操作。例如,提取字符串中的子字符串、获取字符串的长度等。


 其中prefix表示前缀,前缀的值我们可以自己定义,但是不要使用关键字,会有冲突。为了保证可读性,一般都跟标签类型相对应例如 c 对应core.

编写一个简单的JSP文件test.jsp,使用taglib指令引入Core标签库,在该文件中使用<c:out>标签

<%@ 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:out value="Hello World!"></c:out>
</body>
</html>

3.1 报错处理

报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]

报错原因:找不到jstl标签库。

解决方法:WEB-INF\lib目录下,拷贝刚才的那4个包,刷新下。

3.2 常用标签

语法格式:前缀名:标签

平时最常使用的就是核心标签了,我们来看看核心标签中都有哪些常用标签

set标签:将值保存在指定的作用域中

<%-- var="变量名"  value="值" scope="保存在哪个作用域(page、request、session、application)"--%>
<c:set var="userName" value="yzq" scope="page"></c:set>
<span>${userName}</span><%--配合EL表达式取值--%>

out标签:将结果输出

<%--取值--%>
<c:out value="${userName}"></c:out>

remove标签:删除某个值

<%--删除userName的值--%>
<c:remove var="userName"></c:remove>

if标签:判断

之前的jsp中我们如果要对数据进行判断后显示符合条件的数据,要这么写。

<%--JSP程序脚本--%>

<%
    /*
     * 这里可以写变量声明,表达式,程序逻辑等
     * 是局部的,相当于Java中的普通方法
     * */
    String name = "yzq";
    int age = 23;
    if (age > 20) {
%>

<span>奔三的人了</span>
<%

} else {
%>

<span>奔二的人了</span>
<%
    }
%>

用JSTL的if标签就很简单了

<c:set value="26" var="age"  />
<c:if test="${age>20}">
    <span>奔三的人了</span>
</c:if>
<c:if test="${age<20}">
    <span>奔二的人了</span>
</c:if>

choose:选择,跟java中的switch语句类似

<c:set var="age" scope="page" value="40"></c:set>
<c:choose>

    <%--符合该条件时执行--%>
    <c:when test="${age>20&&age<30}">
        <span>奔三的人了</span>
    </c:when>

    <%--符合该条件时执行--%>
    <c:when test="${age<20}">
        <span>还是小鲜肉</span>

    </c:when>

    <%--之前条件都不满足时,执行这个--%>
    <c:otherwise>

        <span>可以考虑养生了</span>

    </c:otherwise>
</c:choose>

forEach标签:用于迭代集合

创建一个servlet,用于创建一个集合数据,放到request中,User中就两个属性,name和age。

User类

package firstweb;

public class User {
	private String username;
	private int age;
	public User() {
		// TODO Auto-generated constructor stub
	}
	
	public User(String username,int age) {
		// TODO Auto-generated constructor stub
		this.username = username;
		this.age = age;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

}

package firstweb;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class myforEach
 */
@WebServlet("/myforEach")
public class myforEach extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public myforEach() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		 List<User> users = new ArrayList<>();

	        for (int i = 0; i < 10; i++) {
	            users.add(new User("yzq", i));
	        }
	        request.setAttribute("users", users);
	        request.getRequestDispatcher("/chapter07/jstl.jsp").forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

jstl.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<%--迭代标签 用于迭代集合--%>
<c:forEach items="${users}" var="user">

    <span>${user.username}</span>:<span>${user.age}</span>
    <br>

</c:forEach>

foreach标签还有一些其他的属性

begin  :从哪个下标开始迭代,默认值为0
end:迭代到第几个,默认值为集合的长度
step:迭代的步长
varStatus:迭代项的状态变量名,可以获取迭代项的相关状态

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%--迭代标签 用于迭代集合--%>

<c:forEach items="${users}" var="user" begin="2" end="6" step="2" varStatus="userStatus">

    <hr>
    <span>${user.username}</span>:<span>${user.age}</span><br>

    count:${userStatus.count} <br>
    step:${userStatus.step} <br>
    begin: ${userStatus.begin} <br>
    end:${userStatus.end} <br>
    index:${userStatus.index} <br>
    IsFirst:${userStatus.first} <br>
    IsEnd:${userStatus.last}<br>


</c:forEach>

例7-17if.jsp

<%@ 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>
<fieldset>
    <c:if test="${param.action=='mon'}">
        周一了:工作的第一天,加油!
    </c:if>
    <c:if test="${param.action=='tues'}">
        周二了:工作的第二天,加油!
    </c:if>
    <c:if test="${param.action=='wed'}">
        周三了:工作的第三天,加油!
    </c:if>
    <c:if test="${param.action=='thu'}">
        周四了:工作的第四天,加油!
    </c:if>
    <c:if test="${param.action=='fri'}">
        周五了:工作的第五天,加油!
    </c:if>
    <c:if test="${param.action=='sat'}">
        周六了:休息的第一天!
    </c:if>
    <c:if test="${param.action=='sun'}">
        周日了:休息的第二天!
    </c:if>
</fieldset>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值