您的位置:首页 > 编程语言 > Java开发

Java for Web学习笔记(二三):EL(3)EL的视图

2016-06-11 21:41 633 查看
视图可以分为page,request,session和application,也是从小到大。而page则是某个request中针对一个jsp的试图,使用JspContext或者PageContext,同样提供了setAttribute()和getAttribute()的方法。

EL有11个内定的参数,如果参数与之不匹配,则在page视图中查找,即看看PageContext.getAttribute("variable")是否有,如果没有则在request视图查找,即看看HttpServletRequest.getAttribute("variable"),如果没有则在session视图中查找,即看看HttpSession.getAttribute("variable")是否有,如果没有则在application的视图中查找,即看看ServletContext.getAttribute("variable")是否有,如果还没有,则报错。

小例子

我们定义了User类,如下:

public class User {
private long userId;
private String username;
private String firstName;
private String lastName;

private Map<String,Boolean> permissions = new Hashtable<>();
…… getters and setters (略)……
}

在某个Serlvet中,转到jsp中进行处理:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
User user= new User();
user.setUserId(34324L);
user.setUsername("Coder314");
user.setFirstName("Flowingflying");
user.setLastName("Wei");

Hashtable<String, Boolean> permissions = new Hashtable<>();
permissions.put("user", true);
permissions.put("moderator", true);
permissions.put("admin", false);
user.setPermissions(permissions);

request.setAttribute("user", user);
request.getRequestDispatcher("/WEB-INF/jsp/view/profile.jsp").forward(request, response);
}

重点看看profile.jsp如何写

<!-- 例子中使用了fn里面方法,要加上 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!-- 下面这个可以不需要,但是有两个好处:1、说明user对应的类,让看程序的明确;2、IDE可以据此智能给出补充(但我在Eclipse中无效果,基于第一个理由,还是建议加上) -->
<%--@elvariable id="user" type="cn.wei.flowingflying.chapter06.User"--%>
<!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>User profile</title>
</head>
<body>
<!-- 查request试图,找到了user,获取里面的属性,实际通过了getter -->
User ID: ${user.userId}<br/>
<!--  调用了一个string的方法length(),当然也可以通过fn:来获取 -->
Username : ${user.username} (${user.username.length()} characters) <br/>
<!--  实验了一个fn:escapeXml的方法,同时通过 +=表示字符串级联起来 -->
Full Name : ${fn:escapeXml(user.lastName) += ', ' += fn:escapeXml(user.firstName)} <br/><br/>
<!-- 用fn获取map的size() -->
<b>Permissions (${fn:length(user.permissions)})</b><br />
<!-- 获取map中某个元素 -->
User: ${user.permissions["user"]}<br/>
Moderator: ${user.permissions["moderator"]}<br/>
Administrator: ${user.permissions["admin"]}<br/>
</body>
</html>

内定参数

EL的11个内定的参数如下:

pageContext:是PageContext的实例。它是这11个内动参数中唯一不是Map结构的。通过它可以获得页面的error信息和异常对象,output writer,JSP servlet实例,请求和响应,ServletContext,ServletConfig和Session。
pageScope是Map<String,Object>,包含PageContext的所有attributes。
requestScope是Map<String,Object>,包含ServletRequest的所有attributes。
sessionScope是Map<String,Object>,包含session的所有attribute。
applicationScope是Map<String,Object>,包含ServletContext的所有attributes。
param和paramValues对应为request的parameters,param是Map<String,String>包括该参数的第一个值(类似servletRequest.getParameter()),而paramValues是Map<String,String[]>,包含参数的所有值(类似servletRequest.getParameterValues())。
header和headerValues则是获取Http的消息头信息:header是Map<String,String>包括第一个消息头,而headerValues是Map<String,String[]>,包含所有消息头的值。
initParam是Map<String,String>,包含所有应用中servletContext实例的初始化参数。
cookie是Map<String,javaz.servlet.http.Cookie>,包含request含有的所有的cookies。Key是cookie的名字。有可能有两个相同名字的cookie(不同path),但cookie只包含第一个个cookie,而这个顺序不同请求很可能会不同。EL不能够直接通过cookie来获取相同名字名字的不同cookie,这需要遍历cookies(下一章节介绍)。
下面是小例子:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%   //分别给予不同的scope给出参数,提供测试
application.setAttribute("appAttr","my application");
pageContext.setAttribute("pageAttr","my page");
session.setAttribute("sessionAttr","my session");
request.setAttribute("requestAttr","my Request"); %>
<!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>Test</title>
</head>
<body>
<!-- 测试pageContext对象 -->
Remote Address : ${pageContext.request.remoteAddr}<br/>
Request URL : ${pageContext.request.requestURL}<br/>
Session ID: ${pageContext.request.session.id}<br />
<!-- 测试不同scope的attribute -->
Application Scope: ${applicationScope["appAttr"]}<br />
Page Scope: ${pageScope["pageAttr"]}<br />
Session Scope: ${sessionScope["sessionAttr"]}<br />
Request Scope: ${requestScope["requestAttr"]}<br />
<!-- http://localhost:8080/chapter06/test.jsp?user=hello&colors=green&colors=red,用来测试下面两项的参数 -->
User Parameter: ${param["user"]}<br />
Color Parameters: ${fn:join(paramValues["colors"], ', ')}<br/>
<!-- 测试header -->
Accept Header: ${header["Accept"]}<br />
<!-- 测试cookie-->
Session ID Cookie Value: ${cookie["JSESSIONID"].value}<br />
</body>
</html>

相关链接:
我的Professional Java for Web Applications相关文章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: