JSP2.1的新特性
1、新的统一表达式语言,允许表达式延期求值,表达式既可以取值也可以赋值,还可以调用方法。
2、可以通过注解实现资源注入,简化配置访问资源或外界对象。比如访问JNDI对象。
3、统一了JSF标签和JSP的实现,建立在统一表达式语言基础上。
统一表达式语言
1、在常规的JSP应用中,请求处理模型只有一个阶段即页面渲染,所以表达式可以立即求值返回给响应response即可。而且表达式只需要从后台对象中取值显示。JSP中表达式语言以“$”开头。
2、在JSF中请求处理模型分解成了6个阶段,每个阶段都有可能用到表达式,所以要求表达式支持延期求值。即在不同的阶段都可以通过表达式语言访问特定的对象。用户在界面输入内容后在postback期间要赋给服务器端的对象,所以需要表达式有赋值功能。另外在验证数据和处理事件,需要后台托管bean的方法,所以表达式需要支持方法调用。JSF表达式语言以“#”开头。
因此,JSP和JSF对表达式语言的使用和要求是不一样的,因此也造成了二者不能一起很好的配合使用,例如下面的应用:
<c:forEach var="location" items="${handler.locations}"> <h:inputText value="#{location}"/> </c:forEach>
变量“location”只能在迭代阶段使用,但是在postback期间,无法访问。
为了解决JSP和JSF中表达式语言不一致的问题,统一表达式语言出现了。上面提到的问题就可以通过下面的方式解决了:
<c:forEach var="location" items="#{locations}"> <h:inputText value="#{location}"/> </c:forEach>
统一表达式语言的特性:
1、延期求值。
2、既能从对象中获得值也能给对象赋值。
3、支持方法表达式,允许调用调用方法实现JSF UICompnent验证、处理事件和其它一些功能。
4、 灵活的扩展机制去实现新的表达式求值方法实现。
JSP2.1中使用表达式语言
1、在JSP中模板文本中只能使用${expr},下面的使用时非法的
…………………………… <body> Hellow #{userName} ……………………………
2、#{expr}只能在标签属性中使用。
如果标签的tld文件中指定的JSP版本为2.1之前(如:JSF1.1中的标签),那么“#{” 解析为字符串文本,因为这些标签会自己处理表达式。如果JSP版本为2.1之后,“#{”接解析为延期表达式,但是如果tld属性没有标明支持延期求值(使用<deferred-value>标记),在转换阶段会报错。
3、在JSP2.1之前,“#{}”语法是不会被处理的,所以在基于JSP2.1之前编写的页面在支持JSP2.1的容器中运行的时候,为了保证能正常运行,有两个办法解决。
1、在“#”前加“\”。
2、在web.xml中添加
<jsp-property-group> <deferred-syntax-allowed-as-literal> true </deferred-syntax-allowed-as-literal> </jsp-property-group>
或者在JSP中添加:
<%@page ... deferredSyntaxAllowedAsLiteral="true" %>
比如test.jsp中有如下一段代码:
…………………………… <body> Hellow #{userName} ……………………………
在实现jsp2.1规范之前的容器中可以正常运行,但是#{username}直接作为字符串文本值显示。
在实现jsp2.1规范的容器中,需要在修改为
…………………………… <body> Hellow \#{userName} ……………………………
或者
<%@ deferredSyntaxAllowedAsLiteral="true"%> …………………………… <body> Hellow #{userName} ……………………………
注意:#{username}照样只会做为字符创文本值显示,不会进行求值。