0

私はJSFが初めてです。アプリケーションは動作していますが、コントローラーを使用しているときにブラウザーのリンクと混同されます。ところで、私のアプリには PrimeFaces もあるので、p:タグに驚かないでください。コントローラーがそれらの間でリダイレクトを行う「リスト」ページと「表示」ページがあるとします。最初に私はhttp://localhost:8080/y/r/conversation/list.xhtmlページにいます。line で作成されたリンクがあります<p:commandLink action="#{lazyConversationBean.doShow(conv)}" ajax="false" value="View"/>。ここでは、lazyConversationBean がコントローラーとして機能します。方法があります:

public String doShow(Conversation c) {
    this.setSelectedConversation(c);
    return "view";
}

http://localhost:8080/y/r/conversation/list.xhtml正しいhttp://localhost:8080/y/r/conversation/view.xhtmlページであっても、そこから再び……にリダイレクトされました(ブラウザに表示されます)。そこにリンクがあり<p:commandButton action="#{lazyConversationBean.doList()}" ajax="false" value="Back to list"/>、コントローラーにはメソッドがあります:

public String doList() {
    return "list";
}

そこからリダイレクトされました...ええ、あなたは正しいと思います... http://localhost:8080/y/r/conversation/view.xhtml(これもブラウザが表示するものです)それが正しいhttp://localhost:8080/y/r/conversation/list.xhtmlページであっても。

ブラウザのリンクエリアは、現在表示中のページよりも常に一歩遅れているように見えます。これについてGoogleにクエリを実行する方法がわからないため、これが誤った動作であるかどうかさえわかりません:D テストのために、この短いチュートリアルを実行しました。ここでは、netbeansがエンティティの1つでコードのスタック全体を作成し、動作は同じなので、PrimeFaces マジックとは関係ありません。

なぜそれが起こるのか、そしてそれを修正する方法を教えてもらえますか? ユーザーは正しいリンクをコピーするのが好きです ;)

4

1 に答える 1

2

これは問題ではありません。フレームワークはそのように行われます。それを回避するには、さまざまな方法があります。たとえば、次のようにアクションを作成して追加できます。

public String doShow(Conversation c)
{
    this.setSelectedConversation(c);
    return "view" + "?faces-redirect=true";
}

<p:commandLink action="#{lazyConversationBean.doShow(conv)}" ajax="false" value="View"/>

アクション ビューへのリダイレクトが強制されるため、ブラウザの URL が変更されます。

編集:faces-config.xmlナビゲーションのソリューションは次のとおりです(に注意して<redirect />ください):

<navigation-rule>
    <navigation-case>
        <from-outcome>outcome1</from-outcome>
        <to-view-id>/outcome1.xhtml</to-view-id>
        <redirect />
    </navigation-case>
    <navigation-case>
        <from-outcome>outcome2</from-outcome>
        <to-view-id>/outcome2.xhtml</to-view-id>
        <redirect />
    </navigation-case>
</navigation-rule>
于 2012-11-20T22:26:45.383 に答える