2

h:linkタグまたは単にタグを使用して実装しようとした 3 つのリンクを含む 3 つのページがあります<a>。しかし、どちらの場合も、ページに移動するたびに、これらのリンクに接続されているメソッドが呼び出されます。

<a>タグの実装は次のとおりです。

<a href="#{bean.gotoMySrchie()}">           
    <h:graphicImage library="images" name='vo2/FavPlus.png' />
</a>

<a href="#{bean.gotoMySearches()}">         
    <h:graphicImage library="images" name='vo2/SearchesPlus.png' />
</a>

<a href="#{bean.gotoMyBids()}">         
    <h:graphicImage library="images" name='vo2/BidsPlus.png' />
</a> 

実装は次のh:linkようになります。

<h:link title="Searches" id="searchesLogo" value="" outcome="#{bean.gotoMySearches()}">
    <h:graphicImage library="images" name='vo2/SearchesPlus.png' />
</h:link>

問題は、これらのアクション メソッドのそれぞれがデータベースを呼び出しており、これは呼び出しの完全な無駄です。実際に何かを行うためにアクションメソッドを使用しながら、JSF2でページ間を移動する方法はありますが、これらのメソッドを呼び出す必要がないときにこれらのメソッドが呼び出されることはありませんか?

4

1 に答える 1

4
<a href="#{bean.gotoMySrchie()}">           
<h:link ... outcome="#{bean.gotoMySearches()}">

これらは値式として呼び出されます。これは、JSF レンダリング レスポンス フェーズで HTML 出力を生成する際に、戻り値をそこに出力する必要があるためです。それらの戻り値はhref、結果の HTML 出力と同様に使用されます。Web ブラウザーでページを右クリックし、[ソースを表示] を実行して、属性の値を確認しhrefます。これらのメソッドが を返しStringた場合、正確にその文字列がそこに出力されていることがわかります。

これらは、予想に反して、ポストバックの結果として、JSF 呼び出しアプリケーション フェーズ中にメソッド式として呼び出されません。これは単なる根本的な誤解です。<h:commandXxx action>ポストバック中にアクションを呼び出すには、代わりに必要です。

<h:form>
    <h:commandLink ... action="#{bean.gotoMySearches()}" />
</h:form>

ただし、これは GET リクエストではなく POST リクエストを起動するため、他の多くの結果が生じる可能性があります。

デフォルトではプレーン リンクをクリックすると、POST リクエストではなく GET リクエストが送信されます。この特定のケースでは良いことであるGET を使用し続けたい場合は@PostConstruct、ターゲット ページに関連付けられたバッキング Beanのメソッドでデータベース ジョブを実行する必要があります。 .

<h:link ... outcome="/searches">
    <h:graphicImage ... />
</h:link>
@Named
@RequestScoped // Or @ViewScoped
public class SearchesBean {

    @PostConstruct
    public void init() {
        // Here.
    }

    // ...
}

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

于 2016-02-21T18:38:14.157 に答える