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
- Java for Web学习笔记(二三):EL(3)EL的视图
- Java for Web学习笔记(二二):EL(2)EL语法
- Java for Web学习笔记(二一):EL(1)什么是EL
- Java for Web学习笔记(二四):EL(4)流(Stream)
- EL学习过程(三)
- EL学习过程(二)
- JSP学习笔记(三):JSP配置与EL表达式
- EL技术(三)
- Java学习笔记:EL表达式
- EL表达式(二)
- Java for Web学习笔记(二):Web Containers
- Java for Web学习笔记(三二):JSTL(8)XML Tag
- 学习笔记_java web—EL表达式
- java web学习总结29:EL表达式
- java web学习总结30:EL函数库
- java web中的EL
- Java web----EL函数库
- java-web EL表达式
- 2016 计蒜之道 初赛 第五场
- java(递归)
- STL容器迭代过程中删除元素技巧(转)
- Unity社交功能开发——移动端输入法回车事件响应
- java中泛型的理解
- Java for Web学习笔记(二三):EL(3)EL的视图
- 深入解析Spring架构与设计原理(二)AOP原理
- Python下UnicodeEncodeError编码错误的解决
- Java千百问_03基础语法(017)_static有什么用
- 一款将MP3格式嵌入PPT的软件
- 命令行建立无线WiFi
- 51nod 1001 数组中和等于K的数对
- Error: Could not find or load main class xxxx.xxxx
- BitBlt函数用法