【问题标题】:Unable to access Java Bean in Servlet, getAttribute() returns nullServlet中无法访问Java Bean,getAttribute()返回null
【发布时间】:2016-07-21 21:46:28
【问题描述】:

我是在 Servlet 中使用 Java Bean 的新手,并且在从 HttpServletRequest 对象访问 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 - 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>

【问题讨论】:

    标签: spring jsp tomcat servlets javabeans


    【解决方案1】:

    我认为我已经解决了这个问题。我相信我不正确地使用了整个 bean。仍然有可能我使用 HttpSession 和 HttpServletRequest 和 HttpServletResponse 的全部目的是错误的,所以如果我有人请指教。

    我的问题是我试图使用 jsp 标签来加载我的 bean,如下所示:

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

    它将我的 bean 设置为“请求”的范围,但这个请求基本上会在下一页加载时被清除,从而导致一个空值。我已经重组了我的代码以允许会话处理我在页面之间传递的对象。我不确定这是否是一种好习惯,因为我经常听到会话应该只在绝对必要的情况下保存对象。我在其他地方读到过,您也可以使用 cookie 来保存这些信息,但会话似乎更干净。

    这是我修改后的代码供其他人参考:

    在之前的 servlet - ValidateLogin 中,我使用 PickProcess 对象设置会话属性,其中包含我的 FromStation(和所有其他扫描字段)对象:

    /**
     * 
     */
    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 中,我可以在不使用 ${bean.beanvalue} 的标签的情况下使用表达式语言访问 bean directyle(有关此的更多信息:Which variables can be accessed with the ${...} syntax in a Struts tag in a JSP page? ) 这是我在 station.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">
    <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>
    

    此时,由于我在 ValidateLogin servlet 中设置了属性:

    session.setAttribute("pickProcess", pickProcess);
    

    然后我可以在任何出现此会话的地方检索它:

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

    如果没有收到空值,我无法检索会话属性。

    【讨论】:

      【解决方案2】:

      我认为设置属性有问题。我没有在你设置属性的地方找到。您必须使用您的请求对象在 JSP 或 Servlet 中设置您的属性。

      您提到您使用 Scanner 设置变量。但它必须与请求对象一起设置。是你做的吗?然后你会用 request.getAttribute() 方法得到它。

      希望对您有所帮助。

      【讨论】:

      • 我认为这就是我通过设置 ' 所做的'但也许我错了。我想我已经设计了一个解决方案,见上文。
      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多