0

いくつかのパラメーターを取得しようとしています (現在は 2 つですが、他の xhtml ではおそらくもっと必要になるでしょう)。

index.html ページには、パラメーター user_id と section_id を持つ Threads.xhtml ページへのリンクがあります。

<h:dataTable value="#{Sections.sections}" var="Section">
    <h:column>
        <h:form>
            <h:link value="#{Section.section_label}" outcome="Threads">
                <f:param name="user_id" value="#{LoginIn.user_id}"/>
                <f:param name="section_id" value="#{Section.section_id}"/>
            </h:link>
        </h:form>
    </h:column>
</h:dataTable>

リンクをクリックすると、次のようになります。

Project/faces/Threads.xhtml?user_id=5&section_id=2

だからそれは良いです:)。

ここで、ページ Threads.xhtml に、パラメーター user_id および section_id を使用して、ページ NewThread.xhtml へのリンク (index.xhtml のように dataTable ではなく 1 つのリンク - 新しいセクションを作成する) があります。

<h:form>
    <h:link value="#{msg.create_new_thread}" outcome="NewThread">
        <f:param name="user_id" value="#{param.user_id}"/>
        <f:param name="section_id" value="#{param.section_id}"/>
    </h:link>
</h:form>

リンクをクリックすると、たとえば次のようになります。

Project/faces/NewThread.xhtml?user_id=5&section_id=2

だからそれもいいです:)。

ここで、次のようにして、user_id と section_id の NewThread.xhtml ページの値を確認します。

<h:outputText value="User_id: #{param.user_id}"/><br/>
<h:outputText value="Section_id: #{param.section_id}"/><br/>

そして、ページの値に次のように表示されます。

User_id: 5
Section_id: 2

じゃあ良いよ :)。しかし今、Java コード NewThread.java でこれらの値を取得しようとすると、null のみが返されます。

FacesContext facesContext = FacesContext.getCurrentInstance();
String user_id = (String) facesContext.getExternalContext().getRequestParameterMap().get("user_id");
String section_id= (String) facesContext.getExternalContext().getRequestParameterMap().get("section_id");
//For test:
System.out.println("User_id: " + user_id);
System.out.println("Section_id: " + section_id);

そしてコンソールで私は持っています:

User_id: null
Section_id: null

toString() メソッドも試しましたが、役に立ちませんでした。

セクションの 1 つへのリンクをクリックすると、index.xhtml に戻ります。2 番目のセクション (任意のユーザーによるもの、例: user_id=5)、Threads.xhtml に移動します。

Project/faces/Threads.xhtml?user_id=5&section_id=2

Threads.xhtml には、2 番目のセクションのスレッドのリストがあります (ただし、xhtml コードのこの部分は関係ありません)。

<h:dataTable value="#{Threads.threads}" var="Thread">
    <h:column>
        <h:link value="#{Thread.thread_label}" outcome="Threads">
            <f:param name="thread_id" value="#{Thread.thread_id}"/>
        </h:link>
    </h:column>
</h:dataTable>

そして、Threads.java の Java コードについては、次のようになります。

FacesContext facesContext = FacesContext.getCurrentInstance();
String section_id = (String) facesContext.getExternalContext().getRequestParameterMap().get("section_id");
System.out.println("Section_id: " + section_id);

そしてコンソールで私は持っています:

Section_id: 2

それで何?一度は機能しますが、別の場合は機能しません。

編集:

忘れてごめんなさい。NewThread.xhtml の commandButton を使用して、NewThread.java にアクセスします。

<h:commandButton value="#{msg.add_thread}" action="#{NewThread.AddThread}"/>

NewThread.java の AddThread メソッドを呼び出します。AddThread メソッドの (try-catch の) try で、パラメーターを取得しようとしています。

私はすでにfaces-config.xmlにも追加しました:

<managed-bean>
    <managed-bean-name>Threads</managed-bean-name>
    <managed-bean-class>forum.Threads</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>NewThread</managed-bean-name>
    <managed-bean-class>forum.NewThread</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
4

2 に答える 2

4

をクリックするh:commandButtonと、新しいリクエストが作成されます。問題は、パラメータがこのリクエストに渡されていないことです。

したがって、リクエストスコープのBean NewThreadでリクエストパラメータからデータを取得する場合は、h:commandButtonからのリクエストにもパラメータを含める必要があります。これを試して:

<h:commandButton value="#{msg.add_thread}" action="#{NewThread.AddThread}">
    <f:param name="user_id" value="#{param.user_id}"/>
    <f:param name="section_id" value="#{param.section_id}"/>
</h:commandButton>

JSF 2を使用しているので、ページ間を移動するためのincludeViewParameters = trueトリックf:metadataと一緒に使用すると便利な場合があります。次の質問を確認してください:f:viewParam

于 2013-01-06T14:08:25.017 に答える
2

エリアスが言うように、コマンド ボタンをクリックすると、新しいリクエスト (投稿) があり、これには前のリクエストからの get パラメーターは含まれません。

別の解決策は、上記のビュー パラメーターをOmniFacesのo:formコンポーネントと組み合わせて使用​​することです。このコンポーネントには、すべてのビュー パラメーターを GET パラメーターとして自動的に保持する属性があります。

<o:form includeViewParams="true">

これには、ユーザーが URL でこれらのパラメーターを表示し続けるという追加の利点があるため、ブラウザーのアドレス バーで Enter キーを押してコピーまたはページを更新すると、期待どおりに動作し続けます。

于 2013-01-06T14:49:54.357 に答える