【问题标题】:Redirect if a f:viewParam is empty如果 f:viewParam 为空,则重定向
【发布时间】:2015-04-24 03:55:11
【问题描述】:

如果f:viewParam 为空,我会执行重定向(或错误)吗?

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

当我添加required="true" 时,没有任何反应。有哪些选择?

【问题讨论】:

标签: jsf redirect error-handling jsf-2.2 viewparams


【解决方案1】:

当我添加 required="true" 时,什么都没有发生

您需要&lt;h:message(s)&gt; 来显示与给定(输入)组件关联的面孔消息。您可能已经知道如何为&lt;h:inputText&gt; 执行此操作。您可以对 &lt;f:viewParam&gt; 执行完全相同的操作。

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

如果f:viewParam 为空,我会执行重定向(或错误)吗?

不直接使用标准 JSF 验证工具。您需要在&lt;f:viewAction&gt; 中手动完成这项工作(您需要确保上面没有任何验证器/转换器,否则由于验证/转换错误而不会被调用;您也可以使用&lt;f:event type="preRenderView"&gt;)。

<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,那么您可以使用 &lt;o:viewParamValidationFailed&gt; 标记来达到目的,而无需额外的支持 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>

另见:

【讨论】:

    【解决方案2】:

    您可以在页面中添加过滤器 (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>
    

    另外,在使用过滤器时,我建议使用转发而不是重定向。

    【讨论】:

      猜你喜欢
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多