3

申し訳ありませんが、本当に本当に基本的な質問...

ページに表示する「掲示板スレッド」のリストがあります。それらのいずれかをクリックして、そのスレッドの詳細を表示するページにリダイレクトできるようにしたいと考えています。しばらくググっても苦労します...

(ちなみに私はPrimeFacesを使っています)

私の「リスト」ページからの関連コードは次のとおりです。

<p:commandLink value="#{thread.title}" action="#{messageboardBean.showThread()}"> 
    <f:param name="threadId" value="#{thread.id}" />
</p:commandLink>

(h:form 要素にあります)

これは私の名前付き Bean の一部です (他の方法は正常に動作します)

...
    @ManagedProperty(value="#{param.threadId}")
    private Long threadId;
...
    public String showThread() {
        System.out.println("id is " + getThreadId());
        return "messageboard/list";
    }
...

ご覧のとおり、私のメソッドはまだ実装されていませんが、呼び出されていません。誰かが理由を教えてください。

ちなみに、同じ(または同様の)問題で h:link も試しました。

ありがとう!

更新 - 解決済み

以下のヘルプのおかげで、これが私の解決策です (「メッセージボード」を「ディスカッション」に名前を変更しました)。

リンクはこのコードを使用して生成されます

値: ページに何を表示するか、私の場合、ディスカッション結果のタイトル: edit.xhtml を参照し、アクセスしたい face ファイル ...[request] パラメータは「threadId」と呼ばれます私の「スレッド」オブジェクトにid属性の値があります。

edit.xhtml ページには、これがあります

<f:metadata>
    <f:viewParam name="threadId" value="#{viewDiscussionBean.threadId}" />
    <f:event type="preRenderView" listener="#{viewDiscussionBean.loadDiscussion}" />
</f:metadata>

「threadId」は最初のページのパラメーター名と同じであり、viewDiscussionBean の threadId プロパティにバインドされていることに注意してください。

次に、Bean にすべてのパラメーターを設定したら、viewDiscussionBean の loadDiscussion メソッドを呼び出します。これには threadId プロパティがあるため、これを行うことができます (以下を参照)。

私のviewDiscussionBeanには次の管理プロパティがあります(viewParamタグがこれを設定すると思いますが、その逆ではありません)。

@ManagedProperty(value="#{param.threadId}")
private Long threadId; 

private Discussion thread;

したがって、設定が完了すると、このメソッドを実行できます (ID があるため)。

public String loadDiscussion() {
    thread = mbDao.find(threadId);
    return "edit";
}

これは、DAO (Hibernate を使用) を使用してその ID を持つディスカッション スレッドを検索し、それを Bean に設定するだけです。その後...

私の edit.xhtml ページでは、次のようなものを使用してディスカッション スレッドの値にアクセスできます。

<h:outputText value="#{viewDiscussionBean.thread.message}" />

出来上がり!ありがとう。

4

2 に答える 2

3

UICommandアクションが呼び出されない原因は多数考えられます。それらはすべてここで見つけることができます: commandButton/commandLink/ajax アクション/リスナー メソッドが呼び出されていないか、入力値が更新されていない適切に保存されていない、など。

特定の機能要件に関しては、を使用することをお勧めします<h:link>。コマンド リンクは、特定のケースでは URL にスレッド ID を含むブックマーク可能な URL で終わらない POST 要求を発行します。A<h:link>は、ブックマーク可能で検索ボットによるインデックス付けが可能な完全なリンクを作成します。

例えば

<h:link value="#{thread.title}" outcome="messageboard/list"> 
    <f:param name="threadId" value="#{thread.id}" />
</h:link>

これには、フォームもアクション メソッドも必要ありません。@ManagedPropertyそれを に関連付けられた Beanに移動するか、より細かい検証/変換を可能にするビューでmessageboard/listそれを置き換えるだけで済みます。<f:viewParam>messageboard/list

以下も参照してください。

于 2012-04-26T22:57:38.987 に答える
1

おそらくBalusC回答と使用方法を使用することをお勧めします<h:link>。しかし、私はあなたが見ている行動についていくつかの考えを持っています.

Primefaces <p:commandLink>(のような<p:commandButton>) は、デフォルトで ajax を使用します。したがって、アクションから結果を返すことによる実際のナビゲーションはありません。これにより、アクションが呼び出されていないように見える可能性があります。に追加ajax=falseしてみてください<p:commandLink>

を使用する<h:link>と、リンクがクリックされたときではなく、リンクがレンダリングされたときにナビゲーションが解決されます。あなたの例を変更する:

<h:link value="#{thread.title}" outcome="#{messageboardBean.showThread()}"> 
    <f:param name="threadId" value="#{thread.id}" />
</h:link>

showThread()リンクを含むビューがレンダリングされているときに呼び出されます(と思います)。適切なタイミングでチェックしていないと、メソッドが呼び出されているように見えることもあります。

どちらの場合も、これは System.out へのメッセージがまったく表示されない理由を説明していませんが、フェイルセーフであると考えて試してみましたが、まだ出力が表示されていないことはわかっています。コンテナー、構成、起動方法など。

于 2012-04-27T12:53:54.600 に答える