2016-07-21 28 views
1

Ich bin neu in Java-Beans in Servlets und habe Probleme beim Zugriff auf eine Bean von einem HttpServletRequest-Objekt. Wenn ich getAttribute() verwende, wird null zurückgegeben. Hier ist mein Code:Kann Java-Bean in Servlet nicht zugreifen, gibt GetAttribute() Null zurück

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

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

Antwort

-1

Ich denke, es ist ein Problem, mit dem Attribut festlegen. Ich habe nicht gefunden wo du dein Attribut gesetzt hast. Sie müssen Ihr Attribut innerhalb von JSP oder Servlets mit Ihrem Anfrageobjekt festlegen.

Sie haben erwähnt, dass Sie Ihre Variablen mit Scanner einstellen. Aber es muss mit Anfrageobjekt eingestellt werden. Hast du das gemacht? Dann erhalten Sie es mit request.getAttribute() -Methode.

Ich hoffe, es hilft.

+0

Ich dachte, dass dies ist, was ich tat, indem Sie die '' Aber vielleicht bin ich verwechselt. Ich denke, ich habe trotzdem eine Lösung gefunden, siehe oben. – DatumPlane

0

Ich denke, dass ich dieses Problem gelöst habe. Ich glaube, ich habe die ganze Bohne falsch verwendet. Es ist immer noch möglich, dass ich den ganzen Zweck von HttpSession und HttpServletRequest und HttpServletResponse falsch benutze, also wenn ich jemand bin, rate bitte.

Mein Problem war, dass ich die jsp Tag zu verwenden versuchte, meine Bohne zu laden, wie so:

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

die meine Bohne als Rahmen der „Anfrage“ setzt aber diese Anforderung wird im Wesentlichen auf die gelöscht werden nächste Seite wird geladen, was zu einem Nullwert führt. Ich habe meinen Code neu strukturiert, damit die Sitzung meine Objekte zwischen den Seiten verarbeiten kann. Ich bin mir nicht sicher, ob dies eine gute Übung ist, da ich oft gehört habe, dass die Sitzung nur Objekte enthalten sollte, wenn dies absolut notwendig ist. Ich habe an anderer Stelle gelesen, Sie können auch Cookies verwenden, um diese Informationen zu speichern, aber die Sitzung schien viel sauberer.

Hier ist meine überarbeitete Code als Referenz des anderen:

In früheren Servlet - ValidateLogin ich die Session-Attribut mit einem PickProcess Objekt festgelegt, die meine FromStation (und alle anderen Scanfeld) Objekt (e) innerhalb gilt:

/** 
* 
*/ 
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; 
    } 


} 

Da ist in meinem JSP station.jsp ich bin dann in der Lage, die Bohne directyle zuzugreifen, ohne den Tag mit $ mit {} bean.beanvalue Expression language (für weitere Informationen zu diesem Thema: Which variables can be accessed with the ${...} syntax in a Struts tag in a JSP page?) Hier ist der Code, den ich in meiner Station verwendet habe. jsp für den Zugriff auf die Werte:

<!-- 
    @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> 

An diesem Punkt, da ich das Attribut in meinem ValidateLogin Servlet mit ein:

session.setAttribute("pickProcess", pickProcess); 

dann kann ich abrufen es überall in dieser Sitzung anwesend ist mit:

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

Ich kann das Sitzungsattribut nicht abrufen, ohne einen Nullwert zu erhalten.