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?

Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top