2009-05-26 88 views
4

我在Linux上運行Tomcat 6.0.18。JSP表達式語言錯誤行爲?

我有一個使用這樣的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> 

,錯誤提高(我的自定義錯誤頁顯示,我看到在我的日誌文件除外),如果我用下面的JSP語法與helper不正確的名稱:

<!-- 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. 

爲了完整起見,jsp:getProperty語法正常工作時bean的名字是正確的:

<!-- 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?在這種情況下是否有一些控制錯誤報告的配置選項?

+0

就肯定別人說什麼,這是EL的有意義的功能。 – Eddie 2009-05-26 19:42:58

回答

5

此:

${myBean.property1.name} 

如果即使property1爲空,所以我不必只寫,以防止NPE會工作行爲在Expression Language Specification Version 2.1的1.6部分中涵蓋。

評價爲expr-A [EXPR-B]:

如果value-a是空:

  • 如果expr-A [EXPR-B]是正在解決最後一個屬性:
    • 如果表達式是一個值表達式和 ValueExpression.getValue(上下文)是 稱爲啓動這一表達 評估,返回null。
    • 否則,拋出PropertyNotFoundException。試圖 去引用空了一個左
  • 否則,返回null。

(EL統一了。和[]運算符)

+1

感謝您的回答@McDowell。要澄清:「ValueExpression.getValue(context)」==使用EL來讀取一個值(這是我在這個問題中做的),並且「試圖用一個左值去引用null」==使用EL寫一個值。規範的第1.4節討論觀察到的行爲的基本原理。噢,「return null」意思是「產生空字符串」在這個上下文中 - 規範部分1.18.2 – 2009-05-27 02:33:39

2

這就是EL的工作方式。

$ {helper}計算結果爲null,因此EL只返回「」,並且不會嘗試評估表達式的其餘部分。

它在某些情況下,還挺方便的功能:

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