2011-12-24 2 views
2

Прежде всего: Я желаю всем вам счастливого Рождества :)Не удалось получить «правильный» сессионного компонента в сервлет

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

Первая часть 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> 

Класс СВОЙСТВ:

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

И когда я вызываю сервлет, я получаю нулевые значения в свойствах «end» end «end». Everthing упакован в WAR.

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

+0

Не имеет отношения к вопросу: Я не должен использовать '@ NamedQueries' в SFSB. Ответственность JPA и '@ NamedQueries' /' @ NamedQuery' должны использоваться в сущности JPA или Mapped Superclass, как описано здесь: [NamedQuery (Java EE 6)] (http://docs.oracle.com/javaee/6/api /javax/persistence/NamedQueries.html). Wesołych Świąt :-) –

+0

Да, вы абсолютно правы, он никогда не используется и должен быть выброшен, но я просто не делал этого раньше. – visionary

ответ

0

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

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

+0

Большое спасибо за ответ, Во-первых, я объясню, что я хочу делать. Мне нужна форма в JSF (которая у меня уже есть), где вы можете вводить значения Start и End что-то (на самом деле это маршрут, но это не имеет значения). Затем введите класс свойств в компонент с состоянием и получите этот компонент (тот же компонент, где уже установлены значения) несколько раз в sevlet. В классе SimulationBean я помню значения из класса Properties, когда компонент запускается в первый раз (действие кнопки JSF вызывает метод setValues ​​() "). – visionary

Смежные вопросы