簡體   English   中英

如何將對象從前端傳遞給Struts2?

[英]How to pass an object from front-end to Struts2?

我試圖通過JavaScript向Struts2后端發送一個字段的值,但它返回NullpointerException

<input type="hidden" id="employee.payslip.id" name="employee.payslip.id" value="5"/>
....

提交表單后,請求將被發送到以下JavaScript方法以發送到后端。

 function payslipPayment(){

     var formValues = $('#myform').serialize();
     ....
     xmlhttp.open("get","../payslip/pay?"+formValues,false);
     xmlhttp.send();

 }

請求將被創建並發送如下

http://localhost/payslip/pay/employee.payslip.id=5&employee.payslip.year=2013&....

但是在后端,當我嘗試顯示值時,它返回NullPointerException

Java的

public class payslip {

 private Employee employee;

 public String pay{
    System.out.println("Id:"+employee.payslip.id):
    System.out.println("Year:"+employee.payslip.year;
    ...
 }

 getter and setter 

}

public class Employee {
   private Payslip payslip;
   ....
   getter and setter
}

public class Payslip{
  private long id;
  ...
  getter and setter
}

空指針異常表示未初始化員工或工資單。 如果你使用struts2,那么使用param攔截器和模型驅動的方法應該可以解決你的問題。

  • 您需要將表單轉換為json(如此 )並發送到后端
  • 然后 - 在java中你需要將json反序列化為java對象(例如,使用Jackson

您可以像Alexey所說的那樣做,或者您可以遵循這種方法。 您可以使用ServletRequestAware和ServletResponseAware接口,然后使用request.getParameter()來獲取傳遞的值。 以下是如何執行此操作的示例。

動作類struts配置

<action name="hello" method="execute"
            class="com.home.struts2.HelloAction">
            <result name="success">hello.jsp</result> 
        </action>

行動類

 public class HelloAction extends ActionSupport implements ServletRequestAware,ServletResponseAware{
        HttpServletResponse response;
        HttpServletRequest request;

        public String execute() {

             System.out.println("AjaxCall" + request.getParameter("param"));
              String infoXml = "Parameter passed: " + request.getParameter("param");
              response.setContentType("text/html");
                response.setHeader("Cache-Control", "no-cache");
                try {
                    response.getWriter().write(infoXml);
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }

                return null;

        }

        public void setServletResponse(HttpServletResponse response) {
            this.response = response;
        }

        public void setServletRequest(HttpServletRequest request) {
            this.request = request;
        }

        public HttpServletRequest getServletRequest() {
            return this.request;
        }

    }

JavaScript的

var xmlHttp;
function sendreq(){  

        var URL = "hello.action?param=sandy";
        try{
            xmlHttp=new XMLHttpRequest();
        }catch (e){
            try{
                xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
            }catch (e){
                try{
                    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
                }catch (e){
                    alert("Your browser does not support AJAX!");
                    return false;
                }
            }
        }

        xmlHttp.onreadystatechange = showMessage;

        xmlHttp.open("GET", URL, true);

        xmlHttp.send(null);
    }

您使用的是框架,還是只是普通的servlet? 如果你使用像struts這樣的框架,那么所有這些答案都太復雜了。

我認為你只是通過它的外觀使用映射的servlet,這意味着上面的答案是正確的通過url傳遞命名參數。 您可以使用post隱藏這些命名參數,而不是使用。

這是我如何使用servlet來做到這一點。 但是,如果我是你並且做了一個完整的項目,我會使用JSF,以便更輕松地傳遞數據。

java的

public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
    String payslipID = request.getParameter("payslipid");
}

JS

<script>
var payslipid = $('#employee_payslip_id')
xmlhttp.open("POST","../payslip/pay",false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("payslipid="+payslipid);
</script>

正如在另一篇文章中提到的那樣,除非你做了一些單獨的字符串列表,否則你必須單獨獲取(並在post或get data中)所有參數。 這樣做並不是一件荒謬的事情,因為無論如何你都需要將所有這些值分成他們自己的變量。

編輯:

上面的答案實際上說明了你需要做什么,但也許有助於使它更清晰。 在struts配置文件中,您可以在其中定義操作,例如

<action class="org.example.Payslip" name="payslip">
            <interceptor-ref name="params"/>
            <result name="success">/success.jsp</result>
</action>

確保那里有params攔截器。 它將使服務器將params映射到setter。 然后,您不需要為發送的每個內容執行getparameter調用。

此外,網址應該是... / payslip.action!pay?payslipid = 1234&employeeid = 1234如果您將其映射如上。 這告訴它使用payslip.class和pay函數。

Struts2使用params攔截器來填充HTTP請求提交的表單值。

建議使用POST方法,因此如果您有敏感數據,並且您希望它不會反映在URL中。

攔截器使用參數名稱來傳遞OGNL運行時以評估應該在valueStack 找到引用的valueStack

您有NullPointerException因為您沒有初始化或將依賴項注入到OGNL評估引用的對象。 因為您正在使用嵌套bean,所以應該可以訪問和初始化所有嵌套屬性(或者至少Struts2知道如何創建這些對象),並且屬於放置在值堆棧top的操作類。

  1. 實現Employee和Payslip的可序列化接口。 另外,確保兩者都有空構造函數。

  2. 為其他日志啟用struts2 devMode。 啟用后,您將看到OGNL異常,特別是哪個字段提供了問題。 這個錯誤必須非常直接地處理。 http://www.mkyong.com/struts2/struts-2-development-mode-example/

  3. 我想用於該操作的攔截器堆棧存在一些問題,只需嘗試使用defaultStack。

 <action name="payslip/pay" class="..."> <interceptor-ref name="defaultStack"/> <result name="success">/success.jsp</result> <result name="input">/error.jsp</result> </action> 

在action標簽中添加輸入參數; 它允許您將參數從struts操作類傳遞到表單/ .jsp

在struts.xml

<action name="..." class="UserAction">
 <param name="id"></param>
 <result name="input">/WEB-INF/jsp/User.jsp</result>
</action>

動作類

public class UserAction {
private int id;

// this is called by the struts.xml to set the value
public void setId(int id) {
this.id = id;
}

//a getter is needed as well to display value in the .jsp

}

因為,它是一個隱藏的變量,不是valuestack的一部分,你可以嘗試這樣傳遞它。

如果這不是你的問題; 我認為你必須將bean注入Action類。 @Inject員工; bean進入Action類會有所幫助。

還調試valuestack。

您需要使用ModelDriven接口。 實現ModelDriven並覆蓋其方法,然后使用modelDriven方法返回對象。

Struts2文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM