2010-11-29 55 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 { 
    // ... 
} 

有了新的隐式导航,结果将是默认的视图的文件名处理。你已经做得很好,所以你根本不需要那些导航规则。