无法在servlet中获取“正确”的有状态会话bean

时间:2011-12-24 11:55:21

标签: java-ee servlets jsf-2 jboss ejb-3.1

首先:祝大家圣诞快乐:)

我在servlet中收到有状态会话bean时遇到了一些问题。只应由JSF设置的值为空。我所拥有的是一个JSF页面+一个有状态会话bean +临时属性bean类+ servlet:

首先是JSF2.0页面的一部分:

    <h:form id="set_args">
        <h2>Prosze wprowadzic wartosci: (w przyszlosci...)</h2>
        <div class="group">
            <h:outputLabel for="start" value="Wybierz punkt startowy:" />
            <h:inputText id="start" value="#{properties.start}" />
        </div>
        <div class="group">
            <h:outputLabel for="stop" value="Wybierz punkt docelowy:" />
            <h:inputText id="stop" value="#{properties.end}" />
        </div>
        <div class="group">
            <h:commandButton id="start_sim"
                action="#{SimulationBean.setValues()}" value="Rozpocznij" />
        </div>
    </h:form>

Propeties类:

import javax.enterprise.context.RequestScoped;
import javax.inject.Named;

@RequestScoped
@Named
public class Properties {

private String start;
private String end;

public String getStart() {
    return start;
}

public void setStart(String start) {
    this.start = start;
}

public String getEnd() {
    return end;
}

public void setEnd(String end) {
    this.end = end;
}

}

然后是EJB:

@Named("SimulationBean")
@Stateful
@SessionScoped
@NamedQueries({ @NamedQuery(name = "findAllJunctions", query = "SELECT j FROM Junction") })
public class SimulationBean implements SimulationBeanLocal {

@Inject
private Properties properties;

private String start;

private String end;

public String getStart() {
    return start;
}

public void setStart(String start) {
    this.start = start;
}

public String getEnd() {
    return end;
}

public void setEnd(String end) {
    this.end = end;
}

public void setValues() {
    this.start = this.properties.getStart();
    this.end = this.properties.getEnd();
    System.out.println("Print VALUES:");
    System.out.println(this.properties.getStart());
    System.out.println(this.properties.getEnd());
}

和servlet:

@WebServlet("/SimulationServlet")
@EJB(name="SimulationBean", beanInterface = SimulationBeanLocal.class)
public class SimulationServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void processRequest(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    Context c;
    try {
        c = new InitialContext();
        SimulationBeanLocal bean = (SimulationBeanLocal) c.lookup("java:module/SimulationBean");

当我调用servlet时,我在&#34; start&#34;中得到一个空值。结束&#34;结束&#34;属性。 Everthing包装在WAR中。

我做错了什么?:)我将欣赏任何线索。 感谢。

1 个答案:

答案 0 :(得分:0)

与JSF表单提交的HTTP请求明确地调用servlet。由于Properties bean是请求作用域,因此每个HTTP请求都将创建一个新实例,而不是像您期望的那样重用先前HTTP请求中的实例。相反,您需要访问在有状态EJB或其他范围比请求范围更广的bean中设置的值。

但总而言之,整个结构有点奇怪和令人困惑。你在这里混合了几个概念和责任。由于功能要求根本没有详细阐述,因此无法提出正确的方法。