2013-10-31 19 views
5

我試圖通過JavaScript向Struts2後端發送一個字段的值,但它返回NullpointerException如何將對象從前端傳遞到Struts2?

<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 
} 
+0

問題是在js中序列化,並在java中反序列化。所以你應該認爲是正確的序列化傳遞給java,是正確的字符串後正確的java反序列化 – farmer1992

+0

問題是,我不知道如何弄清楚這一點? – J888

+1

你用什麼框架來解析HTTP請求中的參數給Java類? – leesei

回答

1

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

Struts2 Documentation

+0

您不需要使用'ModelDriven'。 –

2
  • 您需要將表格轉換成JSON(如here)發送到後端
  • 然後 - 在Java你需要反序列化JSON到一個Java對象(例如xample,Jackson
2

你可以像Alexey說的那樣做,或者你可以按照這種方法。您可以使用接口ServletRequestAware和ServletResponseAware,然後使用request.getParameter()來獲取傳遞的值。以下是如何做到這一點的例子。

Action類支柱配置

​​

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); 
    } 
+0

謝謝,如果通過了10個不同的值,這是否工作? – J888

+0

它將所有你需要做的就是在get調用中正確傳遞它,並使用request.getParameter() – karthick

+0

來檢索它:var URL =「hello.action?param = sandy&param2 = xxx」; Java:request.getParameter('param2') – karthick

2

您是否使用了框架,或只是一個普通的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> 

正如在其他職位,雖然提到的,你就必須獲得(和在崗的地點或獲取得到的數據),除非你做了單獨的所有參數一些分開的字符串列表。這並不是一件荒謬的事情,因爲你需要將所有這些值分離到它們自己的java變量中。

編輯:

以上回答居然說,你需要做什麼,但也許這將有助於更清楚。在你定義動作的struts配置文件中,如

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

確保在那裏有params攔截器。它將使服務器將參數映射到設置者。那麼你不需要爲你發送的每件東西做getparameter調用。

此外,網址應該是類似於.../payslip.action!pay?payslipid = 1234 & employeeid = 1234如果您已將它映射爲與上面類似。這告訴它使用payslip.class和付費功能。

+1

實際上,我使用的是Struts2,這就是爲什麼struts2被定義爲問題的標籤,而且我有一堆參數不僅僅是payslipid – J888

+0

對不起,我沒注意到struts標籤。我正在研究一個非常大的struts項目,所以我想我可能已經在上面解決了您的問題。 – dhockey

+1

多數民衆贊成在此非常感謝,但唯一的問題是,我將被迫在我的行動類中使用一長串變量,所以如果我想發送他們到另一個類需要在我的函數調用中有一長串參數列表或創建一個新的對象,並將它們全部放入該對象變量中,有沒有辦法解決它? – J888

3

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

+0

這就是我想說的。然而,它不清楚爲什麼目前的方法不起作用。 –

+0

@RavindraHV夥計們,這是否意味着發送請求直接採取行動,而不是使用JavaScript,如果不是,你會給我一個例子PLZ – J888

+0

http://www.mkyong.com/struts2/struts-2-modeldriven-example/ – Code2Interface

2

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

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

參數名稱穿過OGNL運行時評估哪些應該發現在valueStack參考表達。

你有NullPointerException,因爲你沒有初始化或注入依賴到OGNL引用的引用的對象。由於您使用的是嵌套的Bean,因此所有嵌套的屬性都應該可以訪問和初始化(或者至少Struts2知道如何創建這些對象),並且屬於置於值棧的top上的操作類。

2
  1. 實現員工& 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> 
2

添加在動作標籤輸入參數;它允許您將struts動作類的參數與struts的形式/..jsp聯繫起來。XML

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

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 

} 

,因爲,這是一個隱藏的變量值棧不是你可以嘗試通過這種方式的一部分。

如果這不是你的問題;我認爲你必須將這個bean注入到Action Class中。 @Inject Employee;將Bean放入Action類會有所幫助。

同時調試valuestack。

相關問題