【发布时间】:2016-04-06 23:36:50
【问题描述】:
我的意图只是通过一个 servlet 调用一个对话范围的 bean。 bean 本身应该将其属性 ticketnumber 增加到 4。
这是 servlet:
@WebServlet
public class ConversationServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Inject
private GreetingTicket ticket;
@Override
public void init() throws ServletException {
System.out.println("Init");
ticket.beginConversation();
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("DoGet");
PrintWriter writer = response.getWriter();
response.setContentType("text/html");
ticket.addTicketNumber();
System.out.println(ticket.getTicketNumber());
writer.println("<h1>" + ticket.getTicketNumber() + "</h1>");
if (ticket.getTicketNumber() == 4) {
System.out.println("END!");
ticket.endConversation();
}
writer.flush();
writer.close();
}
}
GreetingTicket 类是会话范围的 CDI-Bean:
@ConversationScoped
public class GreetingTicket implements Serializable {
@Inject
Conversation conversation;
private static final long serialVersionUID = 1L;
private int ticketNumber;
public GreetingTicket() {
System.out.println("greeting Ticket");
}
public int getTicketNumber() {
return ticketNumber;
}
public void setTicketNumber(int ticketNumber) {
this.ticketNumber = ticketNumber;
}
public void addTicketNumber() {
ticketNumber++;
System.out.println("TicketNumber increased to "+ticketNumber);
}
public void beginConversation() {
if (conversation.isTransient()) {
System.out.println("Conversation Begin!");
conversation.begin();
}
}
public void endConversation() {
if (!(conversation.isTransient())) {
System.out.println("Conversation End!");
conversation.end();
}
}
}
现在的结果是 GreetingTicket 的 ticketnumber 在每个请求中总是只计数为 1 - 为什么?
【问题讨论】:
-
换句话说,每次开始一个新的对话。
-
是的,我怎样才能避免这种情况?
-
有一个 URL 查询参数 cid,需要从客户端传递到服务器。你通过了吗?
-
no ..我将如何在 servlet 中做到这一点?
标签: servlets cdi conversation-scope