JSP2.1和统一表达式语言

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}照样只会做为字符创文本值显示,不会进行求值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值