0

次の html ページ、サーブレット クラス、Bean クラスが、wildfly 8 で実行される Eclipse プロジェクトに実装されています。

私が抱えている問題は、いくつかの値でサーブレットを呼び出すたびに、Bean クラスの追加操作がゼロを返すことです。私は些細なことを正しくしていないことを知っています。追加操作から正しい値を取得するには、何を変更する必要がありますか。

AddServlet.java

 import java.io.IOException;
 import java.io.PrintWriter;
 import javax.ejb.EJB;
 import javax.servlet.ServletException;
 import javax.servlet.annotation.WebServlet;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import ejb.AddEjb;

@WebServlet("/AddServlet")

public class AddServlet extends HttpServlet {
  private static final long serialVersionUID=1L;
  @EJB

AddEjb bean;
  public AddServlet() {
    super();
  }
  protected void doPost(HttpServletRequest request,
  HttpServletResponse response) throws ServletException,
  IOException {
    PrintWriter out=response.getWriter();
    int i=Integer.parseInt(request.getParameter("t1"));
    int j=Integer.parseInt(request.getParameter("t2"));
    bean.setI(i);
    bean.setJ(j);
    bean.add();
    out.print("Addition using bean is test EJB : " + bean.getK());
  }
}

AddEjb.java

package ejb;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;


@Stateless
@LocalBean
public class AddEjb
{
    private int i,j,k;

    public AddEjb() {

    }

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
        System.out.println("i set" + this.i);
    }

    public int getJ() {
        return j;
    }

    public void setJ(int j) {
        this.j = j;
        System.out.println("j set" + this.j);
    }


    public int getK() {
        System.out.println("K returned" + this.k);
        System.out.println("K returned" + k);
        return this.k;
    }


    public void setK(int k) {
        this.k = k;
        System.out.println("k set" + this.k);
    }

    public void add()
    {
        this.k = this.i + this.j;
        System.out.println("k set" + this.k);
    }


}

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>First EJB</title>
</head>
<body>
    <form action="AddServlet" method="post">
        Enter 1st Number : <input type="text" name="t1"><br>
        Enter 2nd Number : <input type="text" name="t2"><br>

        <input type=submit>
    </form>
</body>
</html>

以下はsysoutログです

18:14:20,601 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.2.0.Final "Tweek" started in 9104ms - Started 296 of 349 services (92 services are lazy, passive or on-demand)
18:14:46,936 INFO  [stdout] (default task-2) i set78
18:14:46,942 INFO  [stdout] (default task-2) j set22
18:14:46,945 INFO  [stdout] (default task-2) k set0
18:14:46,949 INFO  [stdout] (default task-2) K returned0
18:14:46,950 INFO  [stdout] (default task-2) K returned0
4

2 に答える 2

1

注釈は、この@StatelessBean のインスタンスを交換可能に使用できることをコンテナーに伝えるためにあります。リクエストをステートレス Bean に送信すると、コンテナーは Bean プールから Bean インスタンスを選択します。2 つのリクエストが同じインスタンスによって処理されるという保証はありません。

ここで見られる動作は、「set」リクエストを送信すると、それぞれがいくつかの Bean インスタンスによって処理され、「get」メソッドを呼び出すと、まったく異なるインスタンスによって処理されるということです。どのインスタンスを取得するかはコンテナー次第であり、EJB 仕様では定義されていません。

@Ayhan が言うように、呼び出し間で会話状態を維持したい場合は、@Statefulセッション Bean を使用する必要があります。この状態をクライアント間で共有する必要がある場合は、おそらく@SingletonBean が必要です。

于 2015-07-28T05:51:12.783 に答える