2016-07-21 8 views
1

サーブレットでJava Beansを使用するのが初めてで、HttpServletRequestオブジェクトからBeanにアクセスする際に問題があります。 getAttribute()を使用すると、nullが返されます。ここに私のコードは次のとおりです。ServletのJava Beanにアクセスできない、getAttribute()がnullを返します。

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 - サーブレット

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

答えて

-1

私は属性を設定に問題があると思います。私はあなたの属性を設定した場所で見つけられませんでした。リクエストオブジェクトを使用して、JSPまたはサーブレット内で属性を設定する必要があります。

Scannerを使用して変数を設定したことに言及しました。しかし、それは要求オブジェクトで設定する必要があります。あなたはそれをやりました?その後、request.getAttribute()メソッドで取得します。

希望します。

+0

私はこれを ''と設定することでやっていると思いました。間違い。上記を参照して、私は解決策を考案したと思います。 – DatumPlane

0

私はこの問題を解決したと思います。私は正しく豆を全部使っていたと思う。私はHttpSessionとHttpServletRequestとHttpServletResponseの間違った目的を使用している可能性がありますので、もし私が誰かなら助言してください。

私の問題は、私はそうのように私のBeanをロードするためのJSPタグを使用しようとしていたということでした。「要求」の範囲として、私のBeanを設定しますが、この要求は、本質的にクリアされます

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

次のページが読み込まれ、結果としてヌル値が返されます。セッション間でオブジェクト間の受け渡しを処理できるようにコードを再構成しました。私はしばしばセッションが絶対に必要な場合だけオブジェクトを保持すべきであると聞いたので、これが良い練習であるかどうかはわかりません。私は他の場所でこの情報を保持するためにクッキーを使用することもできますが、セッションはきれいに見えました。私はその中に私のFromStation(および他のすべてのscanfield)オブジェクトを保持しているPickProcessオブジェクトとのセッション属性を設定ValidateLogin - 以前のサーブレットで

:ここ

が相手の参照のための私の改訂コードですここで:

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


} 

はその後、私のJSP station.jspに私はその後、(Which variables can be accessed with the ${...} syntax in a Struts tag in a JSP page?これについての詳細)式言語を使用して$ {bean.beanvalue}を使用してタグを使用せずに豆directyleにアクセスすることができています私の局で使用したコードです。

session.setAttribute("pickProcess", pickProcess); 

私はそれがどこかこのセッションが持つ存在で取得することができます。私は私のValidateLoginサーブレットに属性を設定するので、この時点で

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

:JSPは値にアクセスするには:

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

null値を受け取らずにセッション属性を取得できません。

関連する問題