4

af:viewParamが空の場合、リダイレクト (またはエラー) を実行できますか?

<f:metadata>
    <f:viewParam name="accountId" value="#{accountMB.id}"/>
</f:metadata>

を追加required="true"しても何も起こりません。オプションは何ですか?

4

2 に答える 2

8

を追加required="true"しても何も起こりません

<h:message(s)>特定の (入力) コンポーネントに関連付けられた顔メッセージを表示する必要があります。でそれを行う方法はすでにご存知でしょう<h:inputText>。についてもまったく同じことができます<f:viewParam>

<f:metadata>
    <f:viewParam id="foo" ... required="true" />
</f:metadata>
...
<h:message for="foo" />

af:viewParamが空の場合、リダイレクト (またはエラー) を実行できますか?

標準の JSF 検証機能を直接使用するわけではありません。手動でジョブを実行する<f:viewAction>必要があります (バリデーター/コンバーターがないことを確認する必要があります。そうしないと、検証/変換エラーのために呼び出されません。代わりに を使用できます<f:event type="preRenderView">)。

<f:metadata>
    <f:viewParam value="#{bean.foo}" />
    <f:viewAction action="#{bean.checkFoo}" />
</f:metadata>

public String checkFoo() {
    if (foo == null || foo.isEmpty()) {
        return "some.xhtml"; // Redirect to that page.
    } else {
        return null; // Stay on current page.
    }
}

HTTP エラーの送信は以下のように行うことができます (この例では HTTP 400 エラーが送信されます)。

public void checkFoo() {
    if (foo == null || foo.isEmpty()) {
        FacesContext context = Facescontext.getCurrentInstance();
        context.getExternalContext().responseSendError(400, "Foo parameter is required");
        context.responseComplete();
    }
}

JSF ユーティリティ ライブラリOmniFaces<o:viewParamValidationFailed>を使用する場合は、追加のバッキング Bean ロジックを必要とせずに、まさにその目的のためにタグを使用できます。

ビュー パラメータの検証でリダイレクトを送信すると失敗します:

<f:metadata>
    <f:viewParam ... required="true">
        <o:viewParamValidationFailed sendRedirect="some.xhtml" />
    </f:viewParam>
</f:metadata>

ビュー パラメーターの検証に失敗したときに HTTP 400 エラーを送信する:

<f:metadata>
    <f:viewParam ... required="true">
        <o:viewParamValidationFailed sendError="400" />
    </f:viewParam>
</f:metadata>

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

于 2015-04-24T07:34:15.787 に答える
1

ページにフィルターを追加できます ( Filtering requests ):

@WebFilter(filterName = "MyFilter")
public class MyFilter implements Filter {

@Override
public void doFilter(ServletRequest request, ServletResponse response,  FilterChain chain)
  throws IOException, ServletException {

  if (request.getParameterMap().get("accountId") == null){
     // do redirect
     return;
    }
   chain.doFilter(request, response); 
  }

}

また、web.xml ファイルでフィルターを宣言することを忘れないでください。

<filter>
  <filter-name>MyFilter</filter-name>
  <filter-class>my.filter.classpath.MyFilterclass</filter-class>
</filter>
<filter-mapping>
  <filter-name>MyFilter</filter-name>
  <url-pattern>/url/to/my/page.xhtml</url-pattern>
</filter-mapping>

また、フィルターを使用する場合は、リダイレクトよりもフォワードを使用することをお勧めします。

于 2015-04-24T07:43:30.680 に答える