`

servlet和jsp核心编程(第2版)第十六章 简化对Java代码的访问:jsp2.0表达式语言学习笔记

阅读更多
第十六章:简化对Java代码的访问:jsp2.0表达式语言
1.为了计算和输出存储在标准位置的java对象的值,JSP2.0引入一种简捷的语言。表达式语言(EL),另一个特性是用JSP语法。
2.<警告>JSP表达式语言不能用在只支持JSP1.2或更早版本的服务器中。
一、应用EL的驱动力
1.为什么要使用EL表达式,因为我们在MVC模式中,用JSP页面呈现结果,我们一般使用jsp:useBean,或是jsp:getProperty,但是如果属性是集合或另外的bean,那么子属性的访问需要用到复杂的java代码,这就需要我们使用EL表达式。

二、表达式语言的调用
1.在jsp2.0中,我们使用${expression}调用表达式语言,我们也可以使用
${expression1}blah${expression2}
来实现字符串的连接


三、阻止表达式语言的求值
(一)停用整个Web应用中的表达式语言
1.如果在web.xml中引用的是servlet规范的2.3版本或更早的版本(即jsp1.2或更早的版本),则jsp2.0表达式语言自动在web应用中停用。
2.如果是2.4及其以上,则默认情况下应该激活表达式语言。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
</web-app>
这里就采用servlet规范2.5。
(二)停用多个JSP页面中的表达式语言
<jsp-property-group>
	<url-pattern>/legacy/*.jsp</url-pattern>
	<el-ignored>true</el-ignored>
</jsp-property-group>

停用legacy目录下所有JSP页面的表达式语言。
(三)停用个别页面中的表示式语言
<%@page isELEnabled = "false"%>
用在jsp1.2版本中。
(四)停用个别表达式语言语句
1.在jsp1.2将${}用于输出,而不是表达式语句,则使用HTML字符实体,将$替换为相应的HTML字符实体(对应ISO 8859-1的值${36})。因此可将$#36;{blah}将会可移植地向用户显示,${blah}。但要注意,字符实体是被浏览器转换成$,不是由服务器完成。因此,这项技术只能用在向web浏览器输出html的情况下。

2.在jsp2.0中,如何停用${},通过转移。使用\${1+1}来表示${1+1}而不是表达式。
有关HTML字符实体的内容可参见 http://www.w3school.com.cn/html/html_entities.asp。

四、阻止标准脚本元素的使用
在web.xml中禁止使用传统脚本元素
<jsp-property-group>
	<url-pattern>/legacy/*.jsp</url-pattern>
	<scription-invalid>true</scription-invalid>
</jsp-property-group>

五、访问作用域变量
1.什么是作用域变量?servlet将一些存储在HttpServletRequest,HttpSession,ServletContext,处于这些位置的对象称作“作用域变量”,我们可以将作用域变量存放在PageContext对象中,但由于servlet和JSP页面不共享PageContext对象,所以这样做没有任何好处,因此,作用域限于页面的变量仅限于同一个JSP页面之前存储的对象,也就是说PageContext的作用域仅为当前页面,不适合servlet存储的对象。比如:${customer.firstName}中的customer。

2.要输出作用域变量的值,我们只需在表达式语言元素中使用它的名字,${name},表示依次在PageContext、HttpServletRequest、HttpSession、ServletContext中查找名为name的属性。如果找到该属性,调用它的toString方法,如果没有找到,返回空字符串,注意不是null。因此${name}等同于
<%=pageContext.findAttribute("name")%>
 该findAttribute
方法为
引用
:Object findAttribute(String name) 寻找在所有范围中属性名称为name 的属性对象。

六、访问bean的属性。
1.如${customer.firstName},系统为了支持这种行为,必须执行反射动作,
${customer.firstName}
等同于
<%@page import ="coreservlets.NameBean"%><%NameBean person = (NameBean)pageContext.findAttribute("customer");%><
%=person.getFirstName()%>
或者等同于
<jsp:useBean id = "customer" type = "coreservlets.NameBean" scope = "request,session,or application"/><jsp:getProperty name = "customer " property = "firstName"/>


2.
${name.property}
等同于
${name["property"]}
后者property可以为变量,而前者必须是字面值。
七、访问集合
1.
${attributeName[entryName]}
,无论作用域变量attributeName指向数组,List或Map
八、引用隐式对象
表达式语言可以用在任何JSP页面中,为了使得表达式语言的使用更有效率,相应规范定义了下面的隐式对象。
1.pageContext,该对象引用当前页面的PageContext,PageContext类依次拥有request,session,out和servletContext属性。

2.param和paramValues:访问基本的请求参数值或请求参数的数组${param.custID}

3.header和headerValues:访问HTTP请求报头的主要值以及全部值。${header.Accept} ${header["Accept-Encoding"]}后者只能使用数组的形式。

4.cookie,返回cookie对象。可以使用${cookie["userCookie"].value}相当于取出名为userCookie对象的属性值。

5.initParam,上下文初始化参数

6.pageScope,requestScope,sessionScope,applicationScope,限定查找范围。如果为${name},则依次在HttpServletRequest、HttpSession、ServletContext中查找名为name的属性,如果为${requestScope.name},则系统旨在HttpServletRequest中查找。

九、表达式语言中运算符的应用
1.<核心方法>应该将表达式语言的运算符用在面向表示逻辑(确定如何表达数据)的简单任务中,要避免在商业逻辑(创建并处理数据)中使用这些运算符,相反,应该将商业逻辑放在常规的java类中,然后从启动MVC过程的servlet中调用这些代码。

[size=large]十、表达式条件求值
1[/size].JSP2.0并不提供丰富的条件求值功能,这项功能由JSP标准标签库(JSTL)的c:if和c:choose标签。但也提供基本的语句
${test?expression1:expression2}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics