We're working on our first JSF project, and we have some problems. We are making the login functionality, and when we hit the login button, it throws:
an IllegalArgumentException - null source
a NullPointerException - Servlet.service() for servlet [Faces Servlet] in context with path [/jsf-blank] threw exception
Do you have any idea why it's not working? Please enlighten us.
Here is out User bean:
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;
}
}
Our login.jsp page:
<%@ 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>
Our 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>
Our web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://ja开发者_StackOverflow社区va.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>
And our directory structure is:
You're intermixing JSF 1.x and JSF 2.x approaches. Maybe you're reading from an outdated book/tutorial which is targeted on JSF 1.x while the IDE is autogenerating JSF 2.x stuff?
JSF 2.0 doesn't support JSP by default anymore. The legacy JSP has been succeeded by Facelets which offers far more superior templating capabilities. Although you can configure JSF 2.0 to use the vintage JSP again, I strongly recommend to not do so. Rather rewrite login.jsp
to 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 {
// ...
}
With the new implicit navigation, the outcome will be by default treated as filename of the view. You've already done it fine, so you don't need those navigation rules at all.
精彩评论