1

I am new to using Java Beans in Servlets and am having problem accessing a bean from a HttpServletRequest object. When I use getAttribute() it returns null. Here is my code:

Station.jsp - JSP:

<!-- 
    @author - Dylan Stout 
    7/19/2016

    Description: Station Screen -- Takes scanner input to three fields: fromStation, toStation, toLoad
    Javascript is used to handle cursor position,incrementing fields, and button-press for load releasing. 
    PickProcess java bean holds the session information necessary to verify and send/recieve messages to wrxj 
    back-end. 

    Each input field is it's own form so no handling for carriage returns is needed (symbol guns usually
    send carriage return after scan) 

 -->
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<jsp:useBean id="pickProcess" class="com.wynright.scanui.model.PickProcess" scope="session"/>
<jsp:useBean id="fromStation" class="com.wynright.scanui.model.FromStation" scope="request"/>
<jsp:useBean id="toStation" class="com.wynright.scanui.model.ToStation" scope="request"/>
<jsp:useBean id="toLoad" class="com.wynright.scanui.model.ToLoad" scope="request"/>
<html>
<head>
<meta name="viewport" content="width=240, height=320, user-scalable=no,
initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
<link type="text/css" rel="stylesheet" href="css/scanui.css">
<script type="text/javascript" src="scripts/jquery-3.1.0.min.js"></script>
<script type="text/javascript"  src="scripts/formController.js"></script>
<script type="text/javascript"  src="scripts/station.js"></script>
<noscript>JavaScript is off. Please enable to use ScanUI.</noscript>
<title>Station Pick - Scan UI</title>
</head>
<% 
if(fromStation.hasErrors()){ 
%>
<body OnLoad="onBodyLoad();focusFromStation();">
<% 
}else if(toStation.hasErrors()) { 
%>
<body OnLoad="onBodyLoad();focusToStation();">
<% 
}else if(toLoad.hasErrors()){ 
%>
<body OnLoad="onBodyLoad();focusToLoad();">
<% 
}else{ 
%>
<body OnLoad="onBodyLoad();focusNext();">
<% 
}
%>

<table cellpadding=4 cellspacing=2>
        <th bgcolor="#CCCCFF" colspan=2><font size=2>Station Pick</font></th>

        <tr bgcolor="#c8d8f8">
            <td valign=top><form name="fromStation" action="ValidateFromStation" method=post>
                    From Station: <input type="text" name="value"
                        value='<%=pickProcess.getFromStation()%>' size=5 maxlength=5 tabindex="1"> 
                        <br> 
                    <font size=2 color=red><%=fromStation.getErrorMsg("fromStation")%></font>

                </form></td>
            <td valign=top><form name="toStation" action="validateToStation.jsp" method=post>
                    To Station: <input type="text" name="value"
                        value='<%=pickProcess.getToStation()%>' size=5 maxlength=5 tabindex="2"> 
                        <br>
                    <font size=2 color=red><%=toStation.getErrorMsg("toStation")%></font>
                </form></td>
        </tr>
        <tr bgcolor="#c8d8f8">
            <td valign=top colspan="2"><form name="toLoad" action="validateToLoad.jsp" method=post>
                    To Load: <input type="text" name="value"
                        value='<%=pickProcess.getToLoad()%>' size=34 maxlength=30 tabindex="3"> 
                        <br>
                    <font size=2 color=red><%=toLoad.getErrorMsg("toLoad")%></font>
                </form></td>
        </tr>
    </table>



</body>
</html>

ValidateFromStation - Servlet:

/**
 * 
 */
package com.wynright.scanui.action;

import java.io.IOException;

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

import org.apache.log4j.Logger;

import com.scanui.model.FromStation;

/**
 * @author dystout
 * Date: Jul 21, 2016
 *
 * Description: TODO
 */
public class ValidateFromStation extends HttpServlet{

    /**
     * 
     */
    private static final long serialVersionUID = 6201980136409592032L;

protected static Logger logger = Logger.getLogger(ValidateFromStation.class); 

protected FromStation fromStation = null; 

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

    fromStation = (FromStation)request.getSession(false).getAttribute("fromStation");           
    fromStation.setValue(request.getParameter("value"));
    if(fromStation.validate()){ 
        logger.debug("From Station Validated: " + fromStation.getValue());
        RequestDispatcher rd = request.getRequestDispatcher("Station.jsp"); 
        rd.include(request, response);
    }else{ 
        logger.debug("From Station INVALID, not validated: " + fromStation.getValue()); 
        RequestDispatcher rd = request.getRequestDispatcher("Station.jsp"); 
        rd.include(request,response); 
    }
}

}

FromStation Java Bean:

package com.wynright.scanui.model;

import java.util.Hashtable;

import com.daifukuamerica.wrxj.application.Application;
import com.daifukuamerica.wrxj.application.PropertiesStack;
import com.daifukuamerica.wrxj.custom.piolax.dataserver.PiolaxPickServer;
import com.daifukuamerica.wrxj.jdbc.DBCommException;
import com.daifukuamerica.wrxj.jdbc.DBException;
import com.daifukuamerica.wrxj.jdbc.DBResultSet;

import com.wynright.scanui.connectionFactory.DBConnection;

public class FromStation extends ScanField{


    @Override
    public boolean validate(){ 

        if(value.equals("")){ 
            errors.put("fromStationNumber", "Please scan/enter valid station"); 
        }

        String sql = "SELECT SDESTINATIONSTATION FROM ORDERHEADER WHERE SDESTINATIONSTATION = '" + getValue() + "'"; 
        DBResultSet results = null; 

        if(DBConnection.getWrxjConnection().isConnectionActive()){ 
            try {
                 results= DBConnection.getWrxjConnection().execute(sql, null);
            } catch (DBCommException | DBException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
        }

        if(results != null && results.getRowCount()!=0){ 
            isValidated = true; 
        }

        //TODO -- Add WRXJ server validate (JSON)

        return isValidated; 
    }

}

Tomcat 7 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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>RFUI</display-name>

  <listener>
    <listener-class>com.wynright.scanui.connectionFactory.DBConnectionService</listener-class>
</listener>

  <servlet>
    <servlet-name>ValidateFromStation</servlet-name>
    <servlet-class>com.wynright.scanui.action.ValidateFromStation
      </servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ValidateFromStation</servlet-name>
    <url-pattern>/ValidateFromStation/*</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>ValidateLogin</servlet-name>
    <servlet-class>com.wynright.scanui.action.ValidateLogin
      </servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ValidateLogin</servlet-name>
    <url-pattern>/ValidateLogin/*</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>ValidatePickingFromStation</servlet-name>
    <servlet-class>com.wynright.scanui.action.ValidatePickingFromStation
      </servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ValidatePickingFromStation</servlet-name>
    <url-pattern>/ValidatePickingFromStation/*</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>ValidatePickingToStation</servlet-name>
    <servlet-class>com.wynright.scanui.action.ValidatePickingToStation
      </servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ValidatePickingToStation</servlet-name>
    <url-pattern>/ValidatePickingToStation/*</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>ValidateSerialNumber</servlet-name>
    <servlet-class>com.wynright.scanui.action.ValidateSerialNumber
      </servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ValidateSerialNumber</servlet-name>
    <url-pattern>/ValidateSerialNumber/*</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>ValidateToLoad</servlet-name>
    <servlet-class>com.wynright.scanui.action.ValidateToLoad
      </servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ValidateToLoad</servlet-name>
    <url-pattern>/ValidateToLoad/*</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>ValidateToStation</servlet-name>
    <servlet-class>com.wynright.scanui.action.ValidateToStation
      </servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ValidateToStation</servlet-name>
    <url-pattern>/ValidateToStation/*</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>
DatumPlane
  • 191
  • 1
  • 2
  • 15

2 Answers2

0

I think that I have solved this issue. I believe I was using the entire bean inproperly. It is still possible that I am using the whole purpose of HttpSession and HttpServletRequest and HttpServletResponse wrong, so if I am someone please advise.

My problem was that I was trying to use the jsp tag to load my bean like so:

<jsp:useBean id="fromStation" class="com.wynright.scanui.model.FromStation" scope="request"/>

which sets my bean as a scope of "request" but this request will essentially be cleared on the next page load, thus resulting in a null value. I have restructured my code to allow the session to handle my objects passed between pages. I am not sure if this is good practice as I have often heard that session should only hold objects if absolutely necessary. I read elsewhere you can also use cookies to hold this information, but session seemed a lot cleaner.

Here is my revised code for other's reference:

In previous servlet - ValidateLogin I set the session attribute with a PickProcess object which holds my FromStation (and all other scanfield) object(s) within it:

/**
 * 
 */
package com.wynright.scanui.action;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import com.daifukuamerica.wrxj.dataserver.standard.StandardUserServer;
import com.daifukuamerica.wrxj.jdbc.DBException;
import com.wynright.scanui.core.UserSession;
import com.wynright.scanui.model.PickProcess;

/**
 * @author dystout
 * Date: Jul 21, 2016
 *
 * Description: TODO
 */
public class ValidateLogin extends HttpServlet{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    protected static Logger logger = Logger.getLogger(ValidateLogin.class); 

    protected UserSession user = new UserSession(); 

    protected int loginCode = -1; 

    protected StandardUserServer userServer = null;

    private PickProcess pickProcess = null; 



    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{ 
        pickProcess = new PickProcess(); 
        HttpSession session = request.getSession(); 
        user.setSessionId(session.getId()); 
        user.setUserName(request.getParameter("userName"));
        user.setPassword(request.getParameter("password"));     

        if(validateLogin("'" + user.getUserName().toString() + "'", user.getPassword().toString() , user.getSessionId())){ 
            //validate login - redirect (add pickPrcess to session) 
            logger.debug("Login Successful for: " + user.getUserName() + " Session ID: " + user.getSessionId());
            RequestDispatcher rd = request.getRequestDispatcher("station.jsp"); 
            pickProcess.setUserName(user.getUserName());
            session.setAttribute("pickProcess", pickProcess);
            session.setAttribute("user", user);
            rd.include(request, response);
        }else{ 
            // retry login with error code
            logger.debug("Login Unsuccessful for: " + user.getUserName()); 
            RequestDispatcher rd = request.getRequestDispatcher("login.jsp"); 
            request.setAttribute("user", user);
            rd.include(request,response); 


        }


    }

    public boolean validateLogin(String username, String password, String sessionId){ 

        InetAddress ip = null; 
        String machineName = ""; 
        try {
            ip = InetAddress.getLocalHost();
            machineName = ip.getHostName(); 
        } catch (UnknownHostException e) {
            logger.error("*** Could not determine host IP Address during login validation ***");
            logger.error(e.getMessage());
        } 

        if(ip!=null){ 
            user.setIpAddress(ip.getHostAddress());
            user.setMachineName(machineName);
        }else{ 
            logger.error("Unable to retrieve IP Address");
        }


        try {
            logger.debug("Attempting to login user: " + username);
            loginCode = userServer.validateLogin(username, password, "'" + machineName + "'", "'" + user.getIpAddress() + "'");
        } catch (DBException e) {
            logger.error("Error validating login, Database problem exists.");
            e.printStackTrace();
        } 

        if(loginCode == userServer.LOGIN_OKAY){ 
            user.setValidated(true); 
        }else{ 
            switch(loginCode){ 
            case -1:
                user.setLoginError("Login Invalid");
                break;
            case -2: 
                user.setLoginError("Login has Expired"); 
                break;
            case -3:
                user.setLoginError("Login is in use"); 
                break; 
            }
        }

    //  return user.isValidated(); 

    //TODO DEBUG 
        return true; 

    }

    public ValidateLogin(){ 
        userServer = new StandardUserServer("OracleDB");
    }


    public StandardUserServer getUserServer() {
        return userServer;
    }


    public void setUserServer(StandardUserServer userServer) {
        this.userServer = userServer;
    }


}

Then in my JSP station.jsp I am then able to access the bean directyle without using the tag using ${bean.beanvalue} using Expression language (for more information on this: Which variables can be accessed with the ${...} syntax in a Struts tag in a JSP page?) Here is the code I used in my station.jsp to access the values:

<!-- 
    @author - Dylan Stout 
    7/19/2016

    Description: Station Screen -- Takes scanner input to three fields: fromStation, toStation, toLoad
    Javascript is used to handle cursor position,incrementing fields, and button-press for load releasing. 
    PickProcess java bean holds the session information necessary to verify and send/recieve messages to wrxj 
    back-end. 

    Each input field is it's own form so no handling for carriage returns is needed (symbol guns usually
    send carriage return after scan) 

 -->
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="viewport" content="width=240, height=320, user-scalable=no,
initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
<link type="text/css" rel="stylesheet" href="css/scanui.css">
<script type="text/javascript" src="scripts/jquery-3.1.0.min.js"></script>
<script type="text/javascript"  src="scripts/formController.js"></script>
<script type="text/javascript"  src="scripts/station.js"></script>
<noscript>JavaScript is off. Please enable to use ScanUI.</noscript>
<title>Station Pick - Scan UI</title>
</head>
<body onload="onBodyLoad()">
<table cellpadding=4 cellspacing=2 id="stationTable">
        <th bgcolor="#CCCCFF" colspan=2><font size=2>Station Pick : ${pickProcess.userName}</font></th>
        <tr bgcolor="#c8d8f8">
            <td valign=top>
                <form name="fromStation" action="${pageContext.request.contextPath}/ValidateFromStation" method=post id="fromStationForm">
                    From Station: <input type="text" name="value" id="fromStation" value='${pickProcess.fromStation}' size=5 maxlength=5 tabindex="1"> 
                    <font size=2 color=red><br> ${fromStation.error}</font>
                </form>
            </td>
            <td valign=top>
                <form name="toStation" action="${pageContext.request.contextPath}/ValidateToStation" method=post id="toStation">
                    To Station: <input type="text" name="value" value='${pickProcess.toStation}' size=5 maxlength=5 tabindex="2"> 
                    <font size=2 color=red><br> ${toStation.error}</font>
                </form>
            </td>
        </tr>
        <tr bgcolor="#c8d8f8">
            <td valign=top colspan="2"><form name="toLoad" action="${pageContext.request.contextPath}/ValidateToLoad" method=post id="toLoad">
                    To Load: <input type="text" name="value"
                        value='${pickProcess.toLoad}' size=34 maxlength=30 tabindex="3"> 
                    <font size=2 color=red><br> ${toLoad.error}</font>
                </form></td>
        </tr>
    </table>



</body>
</html>

At this point, since I set the attribute in my ValidateLogin servlet with:

session.setAttribute("pickProcess", pickProcess);

I can then retrieve it anywhere this session is present with:

PickProcess pickProcess = (PickProcess)session.getAttribute("pickProcess"); 

I am not able to retrieve the session attribute without receiving a null value.

Community
  • 1
  • 1
DatumPlane
  • 191
  • 1
  • 2
  • 15
-1

I think there is a problem with setting the attribute. I didn't find in your where you set your attribute. You have to set your attribute within JSP or Servlets with your request object.

You have mentioned that you set your variables using Scanner. But It has to set with request object. Did you do that? Then you will get it with request.getAttribute() method.

Hope it helps.

M_Gandhi
  • 108
  • 2
  • 10
  • I thought that this is what I was doing by setting the '' But maybe I am mistaken. I think I have devised a solution regardless, see above. – DatumPlane Jul 25 '16 at 18:18