JSP表达式语言错误行为?

时间:2009-05-26 18:53:28

标签: jsp tomcat el

我在Linux上运行Tomcat 6.0.18。

我有一个使用这样的bean的JSP:

<jsp:useBean id="helper"
             type="com.example.SomeType"
             scope="request"/>

该页面引用helper的属性,其表达式语言如下:

<!-- This works properly, but could fail silently if the bean name is incorrect. -->
<div><p>Here's some stuff: ${helper.stuff}</div>

在我错过名称helper的重构的某些重构中,如果名称helper写错了,我注意到没有错误引发。不在屏幕上,而不在我的日志文件中。在输出中没有为表达式语言片段生成任何内容:

<!-- Wrong name! "foo" should be "helper" but no error is observed (other than missing ouput)! -->
<div><p>Here's some stuff: ${foo.stuff}</div>

现在,如果我使用以下用于helper的名称不正确的JSP语法,则会引发错误 (我的自定义错误页面显示,我在日志文件中看到异常):

<!-- Wrong name, but an error is raised. -->
<div><p>Here's some stuff: <jsp:getProperty name="foo" property="stuff"/></div>

在这种情况下,日志记录此条目:

SEVERE: requestURI: /some.jsp servletName: jsp statusCode: 500
org.apache.jasper.JasperException: Attempted a bean operation on a null object.

为了完整性,当bean名称正确时,jsp:getProperty语法正常工作:

<!-- Works properly, protects me from an incorrect name, but is more verbose than EL. -->
<div><p>Here's some stuff: <jsp:getProperty name="helper" property="stuff"/></div>

为什么我在写$ {foo.stuff}时看不到错误?在这种情况下是否有一些控制错误报告的配置选项?

2 个答案:

答案 0 :(得分:5)

Expression Language Specification Version 2.1

的第1.6节介绍了此行为
  

评估expr-a [expr-b]:

     

如果value-a为null:

     
      
  • 如果expr-a [expr-b]是要解析的最后一个属性:      
        
    • 如果表达式是值表达式并且   ValueExpression.getValue(context)是   打电话来启动这个表达   评估,返回null。
    •   
    • 否则,抛出PropertyNotFoundException。 试图   为左值取消引用null
    •   
  •   
  • 否则,返回null。
  •   

(EL统一。和[]运算符)

答案 1 :(得分:2)

这就是EL工作的方式。

$ {helper}的计算结果为null,因此EL只返回“”并且不会尝试计算表达式的其余部分。

在某些情况下,它有点方便:

${myBean.property1.name}
即使property1为null,

也会起作用,因此我不必只是为了防止NPE而写:

<c:if test="${not empty myBean.property1}">${myBean.property1.name}</c:if>