Ошибка JSF на странице - невозможно получить или установить значения для bean-компонента - PullRequest
0 голосов
/ 28 ноября 2011

Я должен сделать веб-приложение с JSF, просто чтобы получить и поместить значение из JSF в bean-компонент и наоборот. Я думаю, что все сделал правильно, но когда я запускаю сервер и пытаюсь получить доступ к своей первой странице, я получаю следующую ошибку

SEVERE: Servlet.service() for servlet [jsp] in context with path [/SimpleJSF] threw exception [/greeting.jsp (line: 20, column: 85) #{...} is not allowed in template text] with root cause
org.apache.jasper.JasperException: /greeting.jsp (line: 20, column: 85) #{...} is not allowed in template text

Я использую Eclipse Helios с JDK 1.6, Apache Tomcat 7 и JSF 2.0 framework

Вот мой фрагмент кода

greeting.jsp

<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html 
xmlns="http://www.w3.org/1999/xhtml" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
        <title>Guess Number Facelets Application</title>
    </h:head>
    <h:body>
        <h:form>

            <h2>
                Hi, my name is Duke. I am thinking of a number from
                0 to 10.
                Can you guess it?
            </h2>
            <p><h:inputText id="userNo" title="Type a number from 0 to 10:" value="#{resultNumber.userNumber}">
                    <f:validateLongRange minimum="#{resultNumber.minimum}" maximum="#{resultNumber.maximum}"/>
                </h:inputText>

                <h:commandButton id="submit" value="Submit" action="response.jsp"/>
            </p>
            <h:message showSummary="true" showDetail="false" style="color: #d20005; font-family: 'New Century Schoolbook', serif; font-style: oblique; text-decoration: overline"
                       id="errors1"
                       for="userNo"/>

        </h:form>
    </h:body>
</html>

response.jsp

<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Insert title here</title>
 <h:head>
        <title>Guess Number Facelets Application</title>
    </h:head>
    <h:body>
        <h:form>

            <h2>
                <h:outputText id="result" value="#{resultNumber.response}"/>
            </h2>
            <h:commandButton id="back" value="Back" action="greeting.xhtml"/>
        </h:form>
    </h:body>

</html>

Java bean, ResultNumber.java

package guessNumber;

import java.util.Random;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

/**
 * Session Bean implementation class ResultNumber
 */
@Stateless(mappedName = "resultNumber")
@LocalBean
public class ResultNumber {

     Integer randomInt = null;
        Integer userNumber = null;
        String response = null;
        private long maximum=10;
        private long minimum=0;

        public ResultNumber() {
            Random randomGR = new Random();
            randomInt = new Integer(randomGR.nextInt(10));
            System.out.println("Duke's number: " + randomInt);
        }

        public void setUserNumber(Integer user_number) {
            userNumber = user_number;
        }

        public Integer getUserNumber() {
            return userNumber;
        }

        public String getResponse() {
            if ((userNumber != null) && (userNumber.compareTo(randomInt) == 0)) {
                return "Yay! You got it!";
            } else {
                return "Sorry, " + userNumber + " is incorrect.";
            }
        }

        public long getMaximum() {
            return (this.maximum);
        }

        public void setMaximum(long maximum) {
            this.maximum = maximum;
        }

        public long getMinimum() {
            return (this.minimum);
        }

        public void setMinimum(long minimum) {
            this.minimum = minimum;
        }


}

Теперь для файлов конфигурации

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>SimpleJSF</display-name>
  <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>
  <context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>
  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
  </context-param>
  <listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
  </listener>
  <welcome-file-list>
    <welcome-file>faces/greeting.jsp</welcome-file>
  </welcome-file-list>
</web-app>

фасет-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<faces-config
    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-facesconfig_2_0.xsd"
    version="2.0">
    <managed-bean>
        <managed-bean-name>resultNumber</managed-bean-name>
        <managed-bean-class>guessNumber.ResultNumber</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
</faces-config>

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

В JSF 2.0, JSP устарела как технология просмотра и сменила Facelets.Вам необходимо переименовать ваши .jsp файлы в .xhtml файлы.В вашем случае вам также необходимо удалить всю строку <%@ page %> в обеих JSP.Затем вам нужно вызвать их с расширением .xhtml в URL.

Кроме того, вам также необходимо удалить ConfigureListener из web.xml и вам необходимо переименовать файл приветствия JSP в XHTML.Я бы также предложил использовать *.xhtml вместо /faces/* в качестве FacesServlet шаблона URL.Таким образом, вам не нужно каждый раз вставлять /faces/* в URL.Наконец, вам нужно удалить компонент из faces-config.xml и аннотировать компонент следующим образом вместо этих javax.ejb аннотаций:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class ResultNumber {

В конце концов, кажется, что вы читали руководства по JSF 1.x и микшировалиэто с JSF 2.x.Вы должны быть очень осторожны, какую версию JSF книги / учебника JSF вы читаете.Начиная с JSF 2.0 многие вещи сделаны по-другому.

0 голосов
/ 28 ноября 2011

Вы используете файлы .jsp, поэтому вам следует импортировать метки вручную. Добавьте эти две строки прямо над открывающим тегом html.

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...