Question

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://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>

And our directory structure is: alt text

Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top