1

自分のアクションが実行されないという問題がありh:commandLinkます。原因が何であるかについてのBalusCの非常に有用な投稿を確認し、それを11番まで追跡することができました。

同じ要求/応答チェーン内のフィルターまたはサーブレットがFacesServletの要求を何らかの方法でブロックしていないことを確認してください。

問題を引き起こしていると思われるフィルターがあります-フィルターを取り外して再試行することでこれを見つけました。残念ながら、私はフィルターを作成しませんでした。さらに残念なことに、私はそれらについてほとんど知識がありません。h:commandLinkそれで、このフィルターをアクションファイアリングに適用しないようにする良い方法があるかどうか疑問に思っていますか?doFilter()メソッドに次のパラメーターが渡されるのがわかります。

ServletRequest request
ServletResponse response
FilterChain chain 

したがって、私の最初の本能は、これらのパラメーターの1つで使用できるものがあるかどうかを確認することです。これにより、これは私のからのクリックであることがわかりますh:commandLink。もしそうなら、私はdoFilter()メソッド内のすべてのコードをバイパスすることになります。それが可能かどうか、またはこれを行うための良い方法かどうかはわかりませんが、それが最初に頭に浮かぶことです。

しかし、これを処理するための適切な方法があるかどうかもここで尋ねたいと思いますか?それとも、これは、修正を検討する必要があるかもしれないフィルター自体に何らかの問題があることを示していますか?そのような情報は役に立ちます。

ところで、私はおそらくactionListener私のBeanでメソッドを起動するためにを使用できることを知っていますが、これは私が理解しているように悪い設計なので、これを避けたいと思います。

4

1 に答える 1

0

ソリューションが解決したら、これを更新すると言いました。したがって、私の最初の質問に対する答えは、それは可能だということです。しかし、それを行う方法はあまり良い設計ではありません。

警告 - この最初のオプションは非常にハックであり、これを行うことはお勧めしません - 完全を期すために追加するだけです。h:commandLinkこれを行う 1 つの方法は、"skipFilter" のような IDを与えることです。次に、フィルタでこの ID を確認します。これは で確認できます#HttpServletRequest.getParameterNames()。次に、リクエストがこの ID からのものであることがわかった場合にフィルターをスキップするロジックを追加します。

もう 1 つのオプションは、単に ajax を使用することです。次に、フィルターにロジックを追加して、リクエストが ajax であるかどうかを確認し、そうであればフィルターをバイパスします。if("partial/ajax".equalsIgnoreCase(#HttpServletRequest.getHeader("Faces-Request")))

少しハッキーではありません。

しかし、これは私のプロジェクトのフィルターで既に行われていたことなので、自分で追加していませんでした。

もう 1 つのオプションは、BalusC が推奨するフィルターの修正または交換です。これは私の場合のオプションではないため、フィルターの制約内で作業する必要があります。だから私はただajaxを使います。私は持っていますh:commandLink

<h:commandLink action="#{orderInvoiceBean.navToPdfAction}" value="-EXTRA INVOICE LINK- #{invoice.customerTrxId}" >   
   <f:setPropertyActionListener target="#{orderInvoiceBean.orderInvoiceNative}" value="#{invoice}"/>
   <f:ajax/>  
</h:commandLink>

このようにして、 orderInvoiceNative プロパティが最初に設定され、次に ajax アクションが発生し、必要に応じてその値にアクセスできます。

ただし、もう 1 つ問題がありました。テキストではなく、バイナリ応答を表示する必要があります。そしてもちろん、ajax はこれを正確に許可していません。しかし、私は ajax を使用することを余儀なくされました。じゃあ何をすればいいの?

さて、私は ajax アクションで nav ルールをトリガーし、次のページに移動するだけです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
   <h:body binding="#{orderInvoiceBean.orderInvoicePdf}"/>
</html>

このページ アクションによって新しい要求が作成されるので、応答でバイナリ ファイルを返すことができます。その結果、リンクをクリックしたページにとどまり、ファイルのダウンロード ダイアログが表示されます。最初に恐れていたように、バイナリ ファイルの応答を送信する前に空白のページに移動することはありません。新しいページに移動するナビゲーション ルールを呼び出しても、ブラウザの URL は変更されません。

これが誰かに役立つことを願っています。

于 2013-03-29T14:00:46.190 に答える