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中的四个作用域分别为 page,request,session,application
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个隐式对象,pageScope、requestScope、sessionScope、applicationScope是用于获取指定域的隐式对象;param和paramValues是用于获取请求参数的隐式对象,header和headerValues是用于获取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 个用于访问作用域范围的隐式对象,即pageScope、requestScope、 sessionScope和applicationScope。默认作用域从小到大: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="提交" />
<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>