JSP Expression Language Error Behavior?
Pergunta
Estou executando o TomCat 6.0.18 no Linux.
Eu tenho um JSP que usa um feijão como este:
<jsp:useBean id="helper"
type="com.example.SomeType"
scope="request"/>
A página faz referência a um atributo de helper
com a linguagem de expressão como esta:
<!-- This works properly, but could fail silently if the bean name is incorrect. -->
<div><p>Here's some stuff: ${helper.stuff}</div>
Durante alguma refatoração em que perdi uma ocorrência do nome helper
, Eu percebi isso Nenhum erro é levantado Se o nome helper
está escrito incorretamente. Não na tela, e não nos meus arquivos de log. Nada é produzido para o trecho da linguagem de expressão na saída:
<!-- Wrong name! "foo" should be "helper" but no error is observed (other than missing ouput)! -->
<div><p>Here's some stuff: ${foo.stuff}</div>
Agora, um erro é Levantado (minha página de erro personalizada é exibida e vejo uma exceção no meu arquivo de log) se eu usar a seguinte sintaxe JSP com um nome incorreto para helper
:
<!-- Wrong name, but an error is raised. -->
<div><p>Here's some stuff: <jsp:getProperty name="foo" property="stuff"/></div>
Nesse caso, o log registra esta entrada:
SEVERE: requestURI: /some.jsp servletName: jsp statusCode: 500
org.apache.jasper.JasperException: Attempted a bean operation on a null object.
Para completude, o jsp:getProperty
A sintaxe funciona corretamente quando o nome do feijão está correto:
<!-- 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>
Por que não vejo um erro quando escrevo $ {foo.stuff}? Existe alguma opção de configuração que controla o relatório de erro nesses casos?
Solução
Este comportamento é abordado na Seção 1.6 do Especificação da linguagem de expressão versão 2.1.
Para avaliar o EXPR-A [EXPR-B]:
Se o valor-a for nulo:
- Se Expr-A [expr-B] estiver a última propriedade que está sendo resolvida:
- Se a expressão for uma expressão de valor e valorexpressão.getValue (contexto) foi chamada para iniciar essa avaliação da expressão, retorne nulo.
- Caso contrário, jogue a propriedadeNotFoundException. Tentando despertar a referência nula para um lvalue
- Caso contrário, retorne nulo.
(El unifica os operadores. E [
Outras dicas
É assim que El funciona.
$ {Helper} Avalia para NULL para que El apenas retorne "" e não tenta avaliar o restante da expressão.
É um recurso meio útil em alguns casos:
${myBean.property1.name}
funcionará se mesmo se o Property1 for nulo, portanto, não preciso escrever apenas para evitar um NPE:
<c:if test="${not empty myBean.property1}">${myBean.property1.name}</c:if>