0

This is a college lab. I've been stuck for 3 days now. I'm building an image viewer website with Google App Engine and Java. I've made a web page with login functionality. On the welcome page the user can register an account or log in. If I register a new account there's no problem, the user data is saved, cookies are added to the http response and the user progresses to the next page where he/she can upload and view images in the category that they selected on registering an account. However, if I try to log in as a user that already has an account the app crashes after the successful login with a NullPointerException I cannot figure out what's wrong.

The process for registering and logging in is the same with the exception of saving to and reading from the database.

Here's my Welcome page:

<%@ page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory" %>
<%@ page import="com.google.appengine.api.blobstore.BlobstoreService" %>
<%@ page import="com.blobtest.UserManager" %>
<%@ page import="com.blobtest.UserDatastore" %>
<%@ page import="com.google.appengine.api.datastore.Entity" %>
<%@ page import="java.util.List" %>
<%
    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    UserManager userManager = new UserManager();
    UserDatastore dataStore = new UserDatastore();


        Cookie cookie = null;
        Cookie[] cookies = null;
        cookies = request.getCookies();
        if(cookies != null){
            System.out.println("");
            System.out.println("============ From WELCOME.JSP =================");
            System.out.println("");
            System.out.println("Found Cookies!!");
            for(int i = 0; i < cookies.length; i++){
                cookie = cookies[i];
                System.out.println("");
                System.out.println("Name: " + cookie.getName());
                System.out.println("Value: " + cookie.getValue());
                System.out.println("Domain: " + cookie.getDomain());
            }
            System.out.println("");
            System.out.println("============ From WELCOME.JSP =================");
            System.out.println("");
        }

%>


<html>
    <head>
        <title>Welcome</title>
        <link rel="StyleSheet" type="text/css" href="Style.css" />
    </head>
    <body>

    <h1>Welcome to the Picture Gallery!</h1>
    <p>To log in enter your email and password and press "Login", to register enter your email, the password you want and select a role from the menu and press "Login"</p>
        <form action="usermanager" method="post">
            <label>E-Mail:</label>
            <input name="username" type="text" size="30" maxlength="2048" />
            <label>Password:</label>
            <input name="password" type="password" size="30" maxlength="2048" />
            <label>Role:</label>
            <select name="register_role">
            <%
        List<Entity> registerRoles = dataStore.getRoles();
        for(Entity role : registerRoles){
        out.println("<option>" + role.getProperty("role") + "</option>");
        }
%>
            </select>
            <input type="submit" value="Login">
        </form>

    <h1>Gallery Viewer</h1>
    <p>Select a gallery from the menu below and press "Go" to view it</p>

    <form action="/serve" method="get">
        <select name="role">
<%
        List<Entity> roles = dataStore.getRoles();
        for(Entity role : roles){
        out.println("<option>" + role.getProperty("role") + "</option>");
        }

%>
            </select>
            <input type="submit" value="Go">
        </form>
    </body>
</html>

Here's my UserManager class:

package com.blobtest;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.appengine.api.datastore.Entity;

public class UserManager extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 8824378069546886214L;
    public final String ROLE_SOLDIER = "soldier";
    public final String ROLE_PROGRAMMER = "programmer";
    public final String ROLE_SINGER = "singer";
    public final String ROLE_FOOTBALLER = "footballer";
    public final String COOKIE_PROPERTY_ROLE = "role";
    public final String COOKIE_PROPERTY_USER = "verifieduser";
    public final String COOKIE_APP_DOMAIN = "ImageViewer.se";
    private UserDatastore datastore;

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        datastore = new UserDatastore();
        checkCookies(request);
        String email = request.getParameter("username");
        String password = request.getParameter("password");
        String role = request.getParameter("register_role");
        Entity user = datastore.selectUser(email);
        /*
         * If the database returns a user, check the password matches, otherwise
         * register the user
         */
        if (user != null) {

            if (password.equals(user.getProperty("password"))) {

                message("REGISTERED USER FOUND:", true, 0);
                message("user: " + user.getProperty("email") + "; Password: "
                        + user.getProperty("password"), false, 0);
                // request.getSession().setAttribute("loggedInUser", userName);
                Cookie cookie = new Cookie(this.COOKIE_PROPERTY_ROLE, user
                        .getProperty("role").toString());
                message("UserManager: New Cookie created with role: "
                        + user.getProperty("role").toString(), false, 0);
                cookie.setMaxAge(300); // -1 = persist for the duration of the
                                        // session; 0 = remove cookie; value > 0
                                        // = time in seconds.
                response.addCookie(cookie);
                Cookie userCookie = new Cookie(this.COOKIE_PROPERTY_USER, user
                        .getProperty("email").toString());
                message("UserManager: New Cookie created with verifieduser: "
                        + user.getProperty("email").toString(), true, 1);

                userCookie.setMaxAge(300); // -1 = persist for the duration of
                                            // the session; 0 = remove cookie;
                                            // value > 0 = time in seconds.
                response.addCookie(userCookie);
                dispatch(request, response, "/loggedin.jsp");
            } else {
                message("Passwords don't match, invalidating session", true, 0);
                message("", true, 1);
                request.getSession().invalidate(); // need to dispose of cookies
                                                    // here, not currently using
                                                    // sessions
                dispatch(request, response, "/welcome.jsp");
            }
        } else {
            datastore.addUser(email, password, role);
            message("NEW USER ADDED:", true, 0);
            Cookie cookie = new Cookie(this.COOKIE_PROPERTY_ROLE, role);
            message("UserManager: New Cookie created with role: " + role,
                    false, 0);
            cookie.setMaxAge(300); // -1 = persist for the duration of the
                                    // session; 0 = remove cookie; value > 0 =
                                    // time in seconds.
            response.addCookie(cookie);
            Cookie userCookie = new Cookie(this.COOKIE_PROPERTY_USER, email);
            message("UserManager: New Cookie created with verifieduser: "
                    + email, true, 1);

            userCookie.setMaxAge(300); // -1 = persist for the duration of the
                                        // session; 0 = remove cookie; value > 0
                                        // = time in seconds.
            response.addCookie(userCookie);
            dispatch(request, response, "/register.jsp");
        }

    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {

    }

    protected void dispatch(HttpServletRequest request,
            HttpServletResponse response, String page)
            throws javax.servlet.ServletException, java.io.IOException {
        RequestDispatcher dispatcher = getServletContext()
                .getRequestDispatcher(page);
        dispatcher.forward(request, response);

    }

    private void checkCookies(HttpServletRequest request) {
        Cookie cookie = null;
        Cookie[] cookies = null;
        cookies = request.getCookies();
        if (cookies != null) {
            message("Found Cookies!!", true, 0);
            for (int i = 0; i < cookies.length; i++) {
                cookie = cookies[i];
                message("Name: " + cookie.getName(), false, 0);
                message("Value: " + cookie.getValue(), false, 0);
                message("Domain: " + cookie.getDomain(), false, 0);
            }
            message("", true, 1);
        }
    }

    /**
     * Formats the message and message wrapper
     * 
     * @param message
     *            The message to print
     * @param includeWrapper
     *            true to include header/footer labels
     * @param position
     *            if includeWrapper is true, then set 0 for header 1 for footer,
     *            otherwise set 0.
     */
    private void message(String message, boolean includeWrapper, int position) {

        if (includeWrapper) {

            if (position == 0) {
                System.out.println("");
                System.out
                        .println("==========From USERMANAGER===================");
                System.out.println("");
                System.out.println(message);

            } else {
                System.out.println(message);
                System.out.println("");
                System.out
                        .println("========== From USERMANAGER ===================");
                System.out.println("");
            }
        } else {
            System.out.println(message);

        }
    }

}

My "Login Successful" and "Registration Successful" pages are exactly the same, they simply redirect to the Uploader.jsp page below:

<%@ page import="com.google.appengine.api.blobstore.BlobstoreServiceFactory" %>
<%@ page import="com.google.appengine.api.blobstore.BlobstoreService" %>
<%@ page import="com.blobtest.UserManager" %>
<%@ page import="com.blobtest.UserDatastore" %>
<%@ page import="com.google.appengine.api.datastore.Entity" %>
<%@ page import="java.util.List" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<% //taglib xmlns:h="http://java.sun.com/jsf/html"prefix="h" %>

<%
    BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
    UserManager userManager = new UserManager();
    UserDatastore dataStore = new UserDatastore();
    Cookie[] cookies = request.getCookies();
    Cookie userCookie = null;
    boolean ok = false;
    for(int i = 0; i < cookies.length; i++){
        if(cookies[i].getName().equals(userManager.COOKIE_PROPERTY_USER)){
            if(cookies[i].getValue() != null){
                ok = true;
            }
        }else if(cookies[i].getName().equals(userManager.COOKIE_PROPERTY_ROLE)){
                userCookie = cookies[i];    
        }
    }

    if(!ok){
        System.out.println("Request failed, number of cookies found: " + cookies.length + ", redirecting to welcome.jsp");
        for(int i = 0; i < cookies.length; i++){
            System.out.println("Name: " + cookies[i].getName() + ", Value: " + cookies[i].getValue());
        }
        RequestDispatcher dispatcher = getServletContext()
                .getRequestDispatcher("/welcome.jsp");
        dispatcher.forward(request, response);
    }
%>

<html>
    <head>
        <title>Upload Test</title>
        <link rel="StyleSheet" type="text/css" href="style.css" />
    </head>
    <body>
        <form action="<%= blobstoreService.createUploadUrl("/upload") %>" method="post" enctype="multipart/form-data">

            <input type="text" name="description">
            <input type="file" name="myFile">
            <input type="submit" value="Submit">
        </form>
    <form action="/usermanager" method="post" enctype="multipart/form-data">

    </form>
            <form action="/serve" method="get">
            <select name="role">
<%
    if(userCookie != null) out.println("<option>" + userCookie.getValue() + "</option>");

%>
            </select>
            <input type="submit" value="Go">
        </form>
        <%
        Cookie cookie2 = null;
        Cookie[] cookies2 = null;
        // Get an array of Cookies associated with this domain
        cookies2 = request.getCookies();
        if( cookies2 != null ){
           out.println("<h2> Found Cookies Name and Value</h2>");
           for (int i = 0; i < cookies.length; i++){
              cookie2 = cookies2[i];
              out.print("Name : " + cookie2.getName( ) + ",  ");
              out.print("Value: " + cookie2.getValue( )+" <br/>");
           }
       }else{
           out.println("<h2>No cookies founds</h2>");
       }
        %>
        <a href="/logout.jsp">Click to Log Out</a>
    </body>
</html>

The page above is where the application crashes. If I try to log in with a previously registered user I get the following error (Some printouts from the UserManager Included):

Retreiving user: paul@email.com, 1234, programmer

==========From USERMANAGER===================

REGISTERED USER FOUND:
user: paul@email.com; Password: 1234
UserManager: New Cookie created with role: programmer
UserManager: New Cookie created with verifieduser: paul@email.com

========== From USERMANAGER ===================

mar 30, 2014 12:53:53 EM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: /uploader.jsp
java.lang.NullPointerException
    at org.apache.jsp.uploader_jsp._jspService(uploader_jsp.java:76)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
    at com.google.appengine.tools.development.PrivilegedJspServlet.access$101(PrivilegedJspServlet.java:23)
    at com.google.appengine.tools.development.PrivilegedJspServlet$2.run(PrivilegedJspServlet.java:61)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.google.appengine.tools.development.PrivilegedJspServlet.service(PrivilegedJspServlet.java:58)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:127)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:366)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:487)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)


==========From USERMANAGER===================

NEW USER ADDED:
UserManager: New Cookie created with role: soldier
UserManager: New Cookie created with verifieduser: paul3@email.com

========== From USERMANAGER ===================

mar 30, 2014 12:54:32 EM com.google.appengine.api.datastore.dev.LocalDatastoreService$PersistDatastore persist
INFO: Time to persist datastore: 56 ms

As you can see above, when adding a new user I don't get any error, it proceeds to the uploader.jsp page as it should and I can upload and view pictures without any problems. Any pointers would be greatly appreciated.

mal
  • 3,022
  • 5
  • 32
  • 62
  • `NullPointerException` raised in `uploader.jsp`. show this page? and why you not keeping your business logic codes in servlets? if you keep your java codes in servlets or any models then it will be easy to debug your code. – Abhishek Nayak Mar 30 '14 at 13:14
  • Hot Rembo, thank for your time. My apologies, there was a typo in the post upload.jsp is uploader.jsp. I've fixed the typo. – mal Mar 30 '14 at 15:21
  • OK, all my logic should be in servlets. I'll fix that and try again. Our lecturer told us we should finish this lab within three hours, and here I am (and many others) a week later still trying to figure it out. I know it's not difficult task, but for some reason I just can't get this one working. I'll move all my java out of the jsps and try again, Although I won't get that done before the (extended) deadline. Repeat lab for me so :-D Thanks for your advice. – mal Mar 30 '14 at 15:27
  • ok, check `cokkies` may be null at `out.println("

    Found Cookies Name and Value

    "); for (int i = 0; i < cookies.length; i++){`
    – Abhishek Nayak Mar 30 '14 at 16:55
  • Did I say "Hot Rembo" ?? In any case, thank you. I commented out that section and everything worked. Care to write an answer I can accept? – mal Mar 30 '14 at 18:18

1 Answers1

1

check cokkies may be null in bottom of your jsp for (int i = 0; i < cookies.length; i++){ line of code:

<%
        Cookie cookie2 = null;
        Cookie[] cookies2 = null;
        // Get an array of Cookies associated with this domain
        cookies2 = request.getCookies();
        if( cookies2 != null ){
           out.println("<h2> Found Cookies Name and Value</h2>");
           for (int i = 0; i < cookies.length; i++){ //Here cookies may be null
              cookie2 = cookies2[i];
              out.print("Name : " + cookie2.getName( ) + ",  ");
              out.print("Value: " + cookie2.getValue( )+" <br/>");
           }
       }else{
           out.println("<h2>No cookies founds</h2>");
       }
        %>

this answer may help you for how to use/retrive cokkies in jsp using jstl, you can avoid some NullPointerException in this way.


see also:

how to avoid java code in jsp

how to use if else in jstl

how to loop in jstl

Community
  • 1
  • 1
Abhishek Nayak
  • 3,732
  • 3
  • 33
  • 64
  • 1
    Many thanks for your help Rembo. You've helped me clear up a lot of silly mistakes. – mal Apr 01 '14 at 12:55