在JSP开发中,为了获取Servlet域对象中存储的数据,经常需要写很多Java代码,这样的做法会使JSP页面混乱,难以维护,为此,在JSP2.0规范中提供了EL表达式,EL是Expression Language的缩写,它是一种简单的数据访问语言。
EL表达式可以简化JSP页面,语法以“${”开始,以“}”结束的,具体格式:${表达式}
接下来通过一个案例来对比使用Java代码与EL表达获取信息的不同
先写一个文件MyServlet.java
package t;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected 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);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
接下来写myjsp.jsp文件
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head></head>
<body>
使用java代码<br />
用户名:<%=request.getAttribute("username")%><br />
密 码:<%=request.getAttribute("password")%><br />
<hr>
使用EL表达式:<br />
用户名:${username}<br />
密 码:${password}<br />
</body>
</html>
EL中还有标识符,保留字,变量,常量,运算符,等等,这些就不说了
重点说下EL隐式对象
共有11个:
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对象
直接上代码,看效果
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="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>
结果
Web域相关对象
在Web开发中,PageContext、HttpServletRequest、HttpSession、ServletContext这4个对象之所以可以存储数据,是因为它们内部都定义了一个Map集合,这些Map集合是由一定作用范围的,例如,HttpServletRequest对象存储的数据只在当前请求中可以获取到。
我们习惯把这些Map集合称为域,这些Map集合所在的对象称为域对象,
在EL表达式中,为了获取指定域中的数据,提供了PageContext、HttpServletRequest、HttpSession、ServletContext 4个隐式对象,示例代码:
${pageScope.userName}
${requestScope.userName}
${sessionScope.userName}
${applicationScope.userName}
在EL表达式中,只能在这4个作用域中获取数据
上代码
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head></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>
</html>
结果如下
param和paramValues对象
在JSP页面中,经常需要获取客户端传递的请求参数,为此,EL表达式提供了param和paramValues两个隐式对象。
param对象