2011-12-24 4 views
2

初の「右」ステートフルセッションBeanを取得できませんでした:私はあなたにすべてのメリークリスマスを望む:)は、サーブレット内のすべての

サーブレットでステートフルセッションBeanを受けながら、私はいくつかの問題を持っています。単にJSFによって設定されるべき値はnullです。私が持っていることはJSFページ+ 1つのステートフルセッションBean +一時的なプロパティBeanクラス+サーブレットです:

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" end "end"プロパティでnull値が取得されます。 EverthingはWARにパックされています。

私は本当に間違っているのですか?:)私は手がかりを感謝します。おかげさまで

+0

質問には関係ありません:私はSFSBで '@ NamedQueries'を使うべきではありません。 JPAの責任であり、ここで説明するようにJPA EntityまたはMapped Superclassで '@ NamedQueries' /' @ NamedQuery'を使用する必要があります:[NamedQuery(Java EE 6)](http://docs.oracle.com/javaee/6/api /javax/persistence/NamedQueries.html)。 WesołychŚwiąt:-) –

+0

はい、あなたは絶対に正しいです、それは使用されていないので、捨てるべきですが、私は単純に投稿していませんでした。 – visionary

答えて

0

サーブレットは、JSFフォーム送信とは異なるHTTPリクエストによって明確に呼び出されます。 Properties Beanはリクエストスコープであるため、すべてのHTTPリクエストは新しいインスタンスを作成し、以前のHTTPリクエストからインスタンスを再利用しません。代わりに、ステートフルEJBまたは要求スコープよりも広いスコープを持つ他のBeanに設定されている値にアクセスする必要があります。

しかし、全体的には、構造全体が幾分奇妙で混乱しています。ここでいくつかのコンセプトと責任を混在させています。機能上の要求事項は全く問題に詳述されていないので、適切なアプローチを提案することはできません。

+0

お返事ありがとうございました まずは自分がしたいことを説明します。 JSF(私がすでに持っている)に何かの開始値と終了値を入力できるフォームが必要です(実際にはルートですが、問題はありません)。その後、PropertiesクラスをステートフルBeanに挿入し、そのBean(値がすでに設定されているBean)をSevletで複数回取得します。 SimulationBeanクラスでは、Beanが初めて呼び出されるときにPropertiesクラスの値を覚えています(JSFボタンのアクションが "setValues()"メソッドを起動します)。 – visionary

関連する問題