2010-11-29 74 views
0

我們正在開發我們的第一個JSF項目,並且存在一些問題。我們正在登錄的功能,當我們打的登錄按鈕,它拋出:導航案例在JSF中不工作

  • 一個IllegalArgumentException - 空 源

  • 一個NullPointerException - Servlet.service()進行的servlet [面臨 Servlet的]與上下文路徑 [/ JSF空白]拋出異常

你有,爲什麼它不工作的任何想法?請啓發我們。

這裏是出用戶豆:

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> 

我們faces-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

回答

3

你混在JSF 1.x和2.x的JSF方法。也許你正在閱讀一本過時的書/教程,它是針對JSF 1.x而IDE是自動生成JSF 2.x的東西?

JSF 2.0默認不再支持JSP。傳統的JSP已經成功了Facelets,它提供了更優越的模板功能。儘管您可以配置JSF 2.0以再次使用復古JSP,但我強烈建議您不要這樣做。而是重寫login.jsplogin.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> 


無關的問題,與JSF 2.0,你可以爲你目前有也是整個faces-config.xmlget rid。以下javax.faces.bean註釋添加到User類:

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

有了新的隱式導航,結果將是默認的視圖的文件名處理。你已經做得很好,所以你根本不需要那些導航規則。