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

来源:互联网 发布:网络预算表 编辑:程序博客网 时间:2024/06/04 19:01

视图可以分为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相关文章

0 0
原创粉丝点击