Случай навигации не работает в JSF

Мы работаем над нашим первым проектом JSF, и у нас есть некоторые проблемы. Мы делаем функцию входа в систему, и когда мы нажимаем кнопку входа, она выдает:

  • исключение IllegalArgumentException - нулевой источник

  • исключение NullPointerException - Servlet.service() для сервлета [Faces Servlet] в контексте пути [/jsf-blank] вызвало исключение

У вас есть идеи, почему это не работает? Пожалуйста, просветите нас.

Вот пользовательский компонент:

public class User
{
    private long    id;
    private String  username;
    private String  password;

    public User()
    {
    }

    public User(String username, String password)
    {
        this.username = username;
        this.password = password;
    }

    public User(long id, String username, String password)
    {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public String getNextPage()
    {

        return "failure"; //or "admin" or "client"
    }

    public long getId()
    {
        return id;
    }

    public void setId(long id)
    {
        this.id = id;
    }

    public String getUsername()
    {
        return username;
    }

    public String getPassword()
    {
        return password;
    }

    public void setUsername(String username)
    {
        this.username = username;
    }

    public void setPassword(String password)
    {
        this.password = password;
    }
}

Наша страница login.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Login</title>
</head>
<body>
<f:view>
    <h:form>
        Username: <h:inputText value="#{userBean.username}"></h:inputText>
        <br />
        Password: <h:inputText value="#{userBean.password}"></h:inputText>
        <br />
        <h:commandButton value="Login" action="#{userBean.getNextPage}" ></h:commandButton>
    </h:form>
</f:view>
</body>
</html>

Наши лица-config.xml:

<?xml version="1.0"?>
<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>userBean</managed-bean-name>
        <managed-bean-class>data_layer.model.User</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

    <navigation-rule>
        <from-view-id>/login.jsp</from-view-id>
        <navigation-case>
            <from-action>#{userBean.getNextPage}</from-action>
            <from-outcome>admin</from-outcome>
            <to-view-id>/admin.jsp</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-action>#{userBean.getNextPage}</from-action>
            <from-outcome>failure</from-outcome>
            <to-view-id>/failure.jsp</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-action>#{userBean.getNextPage}</from-action>
            <from-outcome>client</from-outcome>
            <to-view-id>/client.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>
</faces-config>

Наш 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_2_5.xsd"
    version="2.5">
    <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>*.jsf</url-pattern>
    </servlet-mapping>

    <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.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <!-- <welcome-file>index.html</welcome-file> -->
    </welcome-file-list>
</web-app>

И наша структура каталогов: alt text


person DaJackal    schedule 29.11.2010    source источник


Ответы (1)


Вы смешиваете подходы JSF 1.x и JSF 2.x. Может быть, вы читаете устаревшую книгу/руководство, ориентированное на JSF 1.x, в то время как среда IDE автоматически генерирует материалы JSF 2.x?

JSF 2.0 больше не поддерживает JSP по умолчанию. На смену устаревшему JSP пришли Facelets, которые предлагают гораздо более совершенные возможности шаблонов. . Хотя вы можете настроить JSF 2.0 для повторного использования старого JSP, я настоятельно рекомендую этого не делать. Скорее перепишите login.jsp в login.xhtml:

<!DOCTYPE html>
<html lang="en"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Login</title>
    </head>
    <body>
    <h:form>
        Username: <h:inputText value="#{userBean.username}" />
        <br />
        Password: <h:inputText value="#{userBean.password}" />
        <br />
        <h:commandButton value="Login" action="#{userBean.getNextPage}" />
    </h:form>
</body>


Unrelated to the problem, with JSF 2.0 you can also get rid of the whole faces-config.xml as you currently have. Add the following javax.faces.bean annotations to the User class:

@ManagedBean(name="userBean")
@RequestScoped
public class User {
    // ...
}

С новой неявной навигацией результат будет по умолчанию рассматриваться как имя файла представления. Вы уже сделали это хорошо, поэтому вам вообще не нужны эти правила навигации.

person BalusC    schedule 29.11.2010