会话 bean returns 错误的值
Session bean returns the wrong value
我在运行在 wildfly 8 上的 eclipse 项目中实现了以下 html 页面、servlet class 和 bean class。
我遇到的问题是每次我用一些值调用 servlet 时,bean 中的添加操作 class returns a zero。我知道我没有做正确的微不足道的事情。我应该更改什么才能从添加操作中获得正确的值。
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>
以下是系统输出日志
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
你的ejb是无状态的。
更改 ejb 有状态
@Stateless
注释是用来告诉容器这个 bean 的实例可以互换使用。当你向无状态bean发送请求时,容器从bean池中选择一个bean实例,并不能保证任何两个请求都由同一个实例服务。
您在这里看到的行为是,当您发送 "set" 请求时,它们每个都由一些 bean 实例提供服务,然后当您调用 "get" 方法时,它们由一个完全不同的例子。您获得哪个实例取决于容器,并且在 EJB 规范中没有定义。
如果您想在调用之间保持对话状态,如@Ayhan 所说,您应该使用 @Stateful
会话 bean。如果您需要在客户端之间共享此状态,您可能需要一个 @Singleton
bean。
我在运行在 wildfly 8 上的 eclipse 项目中实现了以下 html 页面、servlet class 和 bean class。
我遇到的问题是每次我用一些值调用 servlet 时,bean 中的添加操作 class returns a zero。我知道我没有做正确的微不足道的事情。我应该更改什么才能从添加操作中获得正确的值。
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>
以下是系统输出日志
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
你的ejb是无状态的。 更改 ejb 有状态
@Stateless
注释是用来告诉容器这个 bean 的实例可以互换使用。当你向无状态bean发送请求时,容器从bean池中选择一个bean实例,并不能保证任何两个请求都由同一个实例服务。
您在这里看到的行为是,当您发送 "set" 请求时,它们每个都由一些 bean 实例提供服务,然后当您调用 "get" 方法时,它们由一个完全不同的例子。您获得哪个实例取决于容器,并且在 EJB 规范中没有定义。
如果您想在调用之间保持对话状态,如@Ayhan 所说,您应该使用 @Stateful
会话 bean。如果您需要在客户端之间共享此状态,您可能需要一个 @Singleton
bean。