Не удалось получить «правильный» сессионный компонент с состоянием в сервлете - PullRequest
2 голосов
/ 24 декабря 2011

Прежде всего: я желаю вам всем счастливого Рождества:)

У меня возникла проблема при получении сессионного компонента с состоянием в сервлете.Просто значения, которые должны быть установлены JSF, равны нулю.У меня есть страница JSF + один сессионный компонент с сохранением состояния + временный класс компонента Properties + сервлет:

Первая часть страницы 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());
}

И сервлет:

@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");

И когда я вызываю сервлет, я получаю нулевые значения в конце "start"конечные "свойства.В WAR все упаковано.

Я что-то не так делаю? :) Я буду признателен за любые подсказки.Спасибо.

1 Ответ

0 голосов
/ 24 декабря 2011

Сервлет явно вызывается другим HTTP-запросом, нежели отправка формы JSF. Поскольку bean-компонент Properties является областью действия запроса, каждый HTTP-запрос будет создавать новый экземпляр и не будет повторно использовать экземпляр из предыдущих HTTP-запросов, как вы, вероятно, ожидаете. Вместо этого вам нужно получить доступ к значениям, которые были установлены в EJB с отслеживанием состояния или в другом bean-компоненте, область действия которого шире, чем область запроса.

Но все вместе, вся конструкция несколько странная и запутанная. Вы смешиваете несколько понятий и обязанностей здесь. Поскольку функциональные требования в этом вопросе вообще не разработаны, невозможно предложить правильный подход.

...