6

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

ジャワ:

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
}
4

8 に答える 8

3

Null ポインター例外は、従業員または給与明細が初期化されていないことを意味します。struts2 を使用している場合は、param インターセプターとモデル駆動型アプローチを使用すると問題が解決するはずです。

于 2013-11-08T17:57:01.753 に答える
2
  • フォームを json に変換し (ここのように)、バックエンドに送信する必要があります
  • 次に-Javaでは、jsonをJavaオブジェクトに逆シリアル化する必要があります(たとえば、Jacksonを使用)
于 2013-11-07T04:24:01.430 に答える
2
  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>
于 2013-11-10T06:54:06.170 に答える
2

フレームワークを使用していますか、それとも単純なサーブレットを使用していますか? Struts のようなフレームワークを使用している場合、これらの答えはすべて複雑すぎます。

見た目から、マップされたサーブレットだけを使用していると思います。つまり、上記の答えは、URL を介して名前付きパラメーターを渡すことについて正しいことを意味します。これらの名前付きパラメーターは、get ではなく post を使用してもう少し隠すことができます。

サーブレットだけを使用してそれを行う方法は次のとおりです。ただし、私があなたであり、完全なプロジェクトを行っている場合、データの受け渡しを容易にするために JSF を使用します。

ジャワ

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 呼び出しを行う必要がなくなります。

また、上記のようにマッピングした場合、URL は .../payslip.action!pay?payslipid=1234&employeeid=1234 のようになります。これにより、payslip.class と pay 関数を使用するように指示されます。

于 2013-11-07T16:16:02.203 に答える
2

Struts2 はparamsインターセプターを使用して、HTTP 要求によって送信されたフォーム値を設定します。

メソッドを使用することをお勧めしPOSTます。機密データがあり、それを URL に反映させたくない場合。

パラメーター名は、インターセプターがOGNLランタイムを通過して式を評価するために使用され、valueStack.

NullPointerException参照がOGNLによって評価されるオブジェクトへの依存関係を初期化または注入しなかったためです。ネストされた Bean を使用しているため、ネストされたすべてのプロパティにアクセスして初期化する必要があり (または、少なくとも Struts2 がこれらのオブジェクトの作成方法を認識している必要があります)、top値スタックの に配置されるアクション クラスに属している必要があります。

于 2013-11-09T19:41:46.663 に答える
2

add input param in action tag; that lets you communicate the parameter from struts action class to the form/.jsp

struts.xml

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

Action class

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

}

since, it's a hidden variable not part of valuestack you can try passing it this way.

if this is not your problem; I think you have to inject the bean into the Action Class. @Inject Employee; bean into Action class would help.

Also debug the valuestack.

于 2013-11-12T21:24:50.930 に答える
2

アレクセイが言ったようにするか、このアプローチに従うことができます。インターフェイス ServletRequestAware および ServletResponseAware を使用してから、request.getParameter() を使用して、渡された値を取得できます。以下は、これを行う方法の例です。

アクション クラス ストラット構成

<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);
    }
于 2013-11-07T05:50:49.567 に答える