Отложенный EL не разрешается - PullRequest
1 голос
/ 15 июля 2011

У меня проблемы с JSF.

Похоже, что отложенные оценки (например, #{bean.property} не разрешаются. Немедленные оценки (например, ${bean.property}), кажется, работают нормально.

Следующая страница JSF:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1-strict.dtd">
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view>
<html>
<head>
  <title>Hello World</title>
</head>
<body>
  <h:form>
    ${nameBean.name}
    #{nameBean.name}
    <h:outputText value="#{nameBean.name}"/>
  </h:form>
</body>
</html>
</f:view>

Мой web.xml выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
  xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <display-name>JSF Test</display-name>
  <context-param>
    <param-name>javax.faces.CONFIG_FILES</param-name>
    <param-value>/WEB-INF/faces-config.xml</param-value>
  </context-param>
  <context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
  </context-param>
  <filter>
    <display-name>Ajax4jsf Filter</display-name>
    <filter-name>ajax4jsf</filter-name>
    <filter-class>org.ajax4jsf.Filter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>ajax4jsf</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
  </filter-mapping>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.faces</url-pattern>
  </servlet-mapping>
  <login-config>
    <auth-method>BASIC</auth-method>
  </login-config>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

Со следующими зависимостями maven:

<dependency>
  <groupId>jstl</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>
<dependency>
  <groupId>javax.faces</groupId>
  <artifactId>jsf-api</artifactId>
  <version>1.2_12</version>
</dependency>
<dependency>
  <groupId>javax.faces</groupId>
  <artifactId>jsf-impl</artifactId>
  <version>1.2_12</version>
</dependency>
<dependency>
  <groupId>com.sun.facelets</groupId>
  <artifactId>jsf-facelets</artifactId>
  <version>1.1.14</version>
</dependency>

Перевод на HTML-страницу, содержащую:

NameInBean
#{nameBean.name}
#{nameBean.name}

Возможно, я что-то неправильно настроил, но не знаю, где искать. Кто-нибудь может мне помочь?

Ответы [ 5 ]

1 голос
/ 18 июля 2011

Я переустановил свой сервер Tomcat и изменил свой pom.xml на:

<dependency>
  <groupId>org.apache.myfaces.core</groupId>
  <artifactId>myfaces-api</artifactId>
  <version>1.2.2</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.apache.myfaces.core</groupId>
  <artifactId>myfaces-impl</artifactId>
  <version>1.2.2</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.apache.myfaces.tomahawk</groupId>
  <artifactId>tomahawk</artifactId>
  <version>1.1.6</version>
  <scope>runtime</scope>    
  <exclusions>
    <exclusion>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
    </exclusion>
  </exclusions>    
</dependency>
<dependency>
  <groupId>jstl</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
  <scope>runtime</scope>
</dependency>   
<dependency>
  <groupId>com.sun.facelets</groupId>
  <artifactId>jsf-facelets</artifactId>
  <version>1.1.11</version>
</dependency>

А теперь код работает.

1 голос
/ 16 июля 2011

Мне кажется странным, что вы пишете JSP, но используете библиотеку Facelets (которая является лучшей технологией просмотра для JSF).

Facelets позволяют оценивать синтаксис #{} в тексте шаблона.


Отложенные выражения EL в JSP разрешены только в тегах атрибутов, которые их поддерживают (обычно это компоненты JavaServer Faces, но можно написать собственные библиотеки пользовательских тегов для их поддержки).

Из спецификации JSP 2.2 :

Для выражений в тексте шаблона допускается только синтаксис ${}. Перевод Ошибка будет результатом, если #{} используется в тексте шаблона, если #{} не выключен через механизм обратной совместимости.

Поскольку вы не используете директиву deferredSyntaxAllowedAsLiteral page и не получаете сообщение об ошибке, я предполагаю, что ваш web.xml определяет версию, которая по умолчанию соответствует JSP 2.0 или более старым правилам и , которые Вы не обрабатываете страницу с помощью сопоставления FacesServlet.

  • Проверьте версию web.xml (укажите ваш целевой сервер и версию, если вам нужна дополнительная информация)
  • Убедитесь, что URL использует FacesServlet mapping
0 голосов
/ 08 февраля 2012

Вы должны использовать Servlet API 2.5 или более позднюю версию.

Вы должны изменить версию в своем web.xml

<web-app 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
0 голосов
/ 16 июля 2011

Вы не закрываете тег f: view - возможно, это может быть проблемой? Btw. разве это не должно следовать за тегом html?

0 голосов
/ 15 июля 2011

Я не совсем уверен, но вам нужно поместить #{nameBean.name} в компонент JSF.Попробуйте использовать <h:outputText value="#{nameBean.name}"/>.

С статью java.net на языке унифицированных выражений:

Отложенная оценка означает, что технология, использующая унифицированный EL, принимаетответственность за оценку выражения из механизма JSP и оценку выражения в соответствующее время в течение жизненного цикла страницы.EL получает контроль от JSP-контейнера для оценки выражения в соответствующее время.Выражения JSF EL имеют вид #{defExpr}.Выражения JSF работают таким образом.

Это означает, что JSF отвечает за оценку отложенных выражений и распознает их, только если они добавлены в компонент JSF.То, что непосредственные выражения все еще работают, подразумевает, что после выполнения JSF с фазой ответа рендеринга механизм сервлета / JSP вступает во владение и оценивает эти выражения.Таким образом, вы можете даже генерировать немедленные выражения с использованием отложенных выражений (хотя не проверено).

...