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")是否有,如果还没有,则报错。
在某个Serlvet中,转到jsp中进行处理:
重点看看profile.jsp如何写
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(下一章节介绍)。
下面是小例子:
相关链接:
我的Professional Java for Web Applications相关文章
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相关文章
相关文章推荐
- 1.1 Eclipse的安装
- 深入解析Spring架构与设计原理(二)AOP原理
- Java千百问_03基础语法(017)_static有什么用
- java中泛型的理解
- java(递归)
- 深入理解Java的接口和抽象类
- java学习总结五:继承中子父类的构造函数
- 崔希凡-javaWeb-笔记day04-(暂停更新,期末考完再继续 2016年6月11日21:20:56)
- 崔希凡-javaWeb-笔记day04-(暂停更新,要期末考试啦---2016年6月11日21:19:38)
- SpringMVC中的注解驱动(九)
- java访问修饰符 Modifier
- Java设计模式——单例模式
- java学习总结六:abstract抽象类
- Java中动态数组的理解
- JAVA——File类
- java连接数据库出现的中文乱码问题
- 使用百度地图出现java.lang.UnsatisfiedLinkError错误
- SpringMVC的实质揭秘图(八)
- 关于SpringMVC入门配置
- MD5 升级优化 加盐(Java)