JavaWeb核心技术系列教程(27)——EL表达式隐式对象
讲给Android程序员看的前端系列教程(40集免费****+源码)
版权声明
- 本文原创作者:谷哥的小弟
- 作者博客地址:http://blog.csdn.net/lfdfhl
EL隐式对象概述
在介绍JSP技术时,我们学习了JSP的隐式对象。类似地,在EL技术中同样提供了隐式对象。在此,详细介绍EL中11个隐式对象。
pageContext
EL表达式中的pageContext对象表示的是JSP页面中的pageContext对象。所以,我们完全可通过pageContext获取JSP中的其它隐式对象。
pageScope
代表page域中用于保存属性的Map对象
requestScope
代表request域中用于保存属性的Map对象
sessionScope
代表session域中用于保存属性的Map对象
applicationScope
代表application域中用于保存属性的Map对象
param
在JSP页面中,经常需要获取客户端传递的请求参数,为此,EL表达式提供了param 和paramValues两个隐式对象,用于获取客户端访问JSP页面时传递的请求参数。
param为保存所有单值请求参数的Map对象。
paramValues
paramValues为保存了所有多值请求参数的Map对象;当获取多值的请求参数时它返回string类型数组。
header
当客户端访问Web服务器中的JSP页面时通常会通过请求消息头传递一些信息,例如请求消息头中的"User-Agent"字段可告诉服务器浏览器的类型。为获取请求消息头中 的信息,EL表达式提供了两个隐式对象header和headerValues
header为保存了所有单值请求头字段的Map对象。
headerValues
headerValues为保存了所有多值请求头字段的Map对象;当获取多值请求头字段时它返回string类型数组。
cookie
cookie为保存了所有Cookie信息的Map对象。在该Map中键为各Cookie的名称,获取方式为cookie.Cookie的名称.name;各Cookie的值为对应的Cookie对象,获取方式为cookie.Cookie的名称.value。
initParam
initParam为保存了web.xml文件中所有Web应用初始化参数的Map对象。
EL隐式对象示例
项目结构
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>EL07</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置Servlet -->
<servlet>
<servlet-name>RegisterServlet</servlet-name>
<servlet-class>cn.com.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegisterServlet</servlet-name>
<url-pattern>/RegisterServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>CookieServlet</servlet-name>
<servlet-class>cn.com.CookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieServlet</servlet-name>
<url-pattern>/CookieServlet</url-pattern>
</servlet-mapping>
<!-- Web应用初始化参数 -->
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
<context-param>
<param-name>size</param-name>
<param-value>200</param-value>
</context-param>
</web-app>
测试pageContext
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试pageContext</title>
</head>
<body>
<h2 style="color: red;">本文作者:谷哥的小弟</h2>
<h2 style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
请求URL:${pageContext.request.requestURL }<br />
请求URI:${pageContext.request.requestURI }<br />
请求方式:${pageContext.request.method }<br />
服务器信息:${pageContext.servletContext.serverInfo} <br />
Servlet名称:${pageContext.servletConfig.servletName}<br />
ContextPath:${pageContext.request.contextPath}<br />
Content-Type响应头:${pageContext.response.contentType} <br />
</body>
</html>
在该示例中,通过${pageContext.request.contextPath}获取了Web应用的上下文路径。在日后的学习和开发中,我们应使用该方式替换之前的硬代码。
测试pageScope、requestScope、sessionScope、appplicationScope
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试pageScope、requestScope、sessionScope、appplicationScope</title>
</head>
<body>
<h2 style="color: red;">本文作者:谷哥的小弟</h2>
<h2 style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
<% pageContext.setAttribute("name", "lucy"); %>
<% request.setAttribute("gender", "female"); %>
<% session.setAttribute("city", "BeiJing"); %>
<% application.setAttribute("job", "driver"); %>
表达式\${pageScope.name}的值为:${pageScope.name} <br />
表达式\${requestScope.gender}的值为:${requestScope.gender} <br />
表达式\${sessionScope.city}的值为:${sessionScope.city} <br />
表达式\${applicationScope.job}的值为:${applicationScope.job} <br /><br />
表达式\${name}的值为:${name}<br />
表达式\${gender}的值为:${gender}<br />
表达式\${city}的值为:${city}<br />
表达式\${job}的值为:${job}<br />
</body>
</html>
在使用EL表达式获取属性时可指定在特定的域中查找,也可不指定在特定的域而是按照四个域的顺序查找。
例如:在该示例中,${name}获取name属性的值就是分别从page域、request域、session域、application域依次进行查找。
测试param、paramValues
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试param、paramValues</title>
</head>
<body>
<h2 style="color: red;">本文作者:谷哥的小弟</h2>
<h2 style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
<form action="${pageContext.request.contextPath}/RegisterServlet" method="post">
用 户:<input type="text" name="username" />
<br /><br />
密 码:<input type="password" name="password" />
<br /><br />
性 别:<input type="radio" name="gender" value="男" />男
<input type="radio" name="gender" value="女" checked="checked" />女
<br /><br />
爱 好:<input type="checkbox" name="hobby" value="摄影" />摄影
<input type="checkbox" name="hobby" value="唱歌" />唱歌
<input type="checkbox" name="hobby" value="跑步" />跑步
<br /><br />
城 市:
<select name="city">
<option>------请选择------</option>
<option value="chengdu">成都</option>
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
</select>
<br /><br />
<input type="submit" value="欢迎注册" />
</form>
</body>
</html>
在本示例中设置表单的action属性时灵活采用${pageContext.request.contextPath}获取Web应用上下文路径。
package cn.com;
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 RegisterServlet extends HttpServlet{
private static final long serialVersionUID = -2179731166537038196L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/RegisterResult.jsp");
requestDispatcher.forward(request, response);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Register Result</title>
</head>
<body>
<h2 style="color: red;">本文作者:谷哥的小弟</h2>
<h2 style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
用 户:${param.username}<br />
密 码:${param.password}<br />
性 别:${param.gender}<br />
爱 好:${paramValues.hobby}<br />
城 市:${param.city}<br />
</body>
</html>
在该JSP页面中通过param.属性名获取单值属性,通过paramValues.属性名获取多值属性。
测试header、headerValues
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试header、headerValues</title>
</head>
<body>
<h2 style="color: red;">本文作者:谷哥的小弟</h2>
<h2 style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
header.host:${header.host}<br/>
headerValues["Accept-Language"]:${headerValues["Accept-Language"][0]} <br/>
</body>
</html>
测试cookie
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试cookie</title>
</head>
<body>
<h2 style="color: red;">本文作者:谷哥的小弟</h2>
<h2 style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
<a href="${pageContext.request.contextPath}/CookieServlet">Click Me</a>
</body>
</html>
package cn.com;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl
*/
public class CookieServlet extends HttpServlet {
private static final long serialVersionUID = -2621005366193768161L;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//生成Cookie
Cookie cookie = new Cookie("userid", "zxx9527");
//将Cookie返回至客户端浏览器
response.addCookie(cookie);
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/CookieResult.jsp");
requestDispatcher.forward(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
this.doPost(request, response);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Cookie Result</title>
</head>
<body>
<h2 style="color: red;">本文作者:谷哥的小弟</h2>
<h2 style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
Cookie对象的信息:${cookie.userid } <br/>
Cookie对象的名称和值:${cookie.userid.name }=${cookie.userid.value }<br/>
<br/>
Cookie对象的信息:${cookie.JSESSIONID } <br/>
Cookie对象的名称和值:${cookie.JSESSIONID.name }=${cookie.JSESSIONID.value }<br/>
</body>
</html>
在该示例中,除了名为JSESSIONID的Cookie以外,我们自己还生成了一个Cookie返回至客户端浏览器,该Cookie名为userid值为zxx9527。我们可通过EL内置对象cookie获取该Cookie。
在此,连续两次访问该CookieResult.jsp页面观察Cookie的键及其值
测试initParam
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>测试initParam</title>
</head>
<body>
<h2 style="color: red;">本文作者:谷哥的小弟</h2>
<h2 style="color: red;">博客地址:http://blog.csdn.net/lfdfhl</h2>
size:${initParam.size }<br/>
encoding:${initParam.encoding }<br/>
</body>
</html>
上一篇: 线程池