繁体   English   中英

如果af:viewParam为空,则重定向

[英]Redirect if a f:viewParam is empty

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

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

当我添加required="true" ,没有任何反应。 有什么选择?

当我添加required="true" ,没有任何反应

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

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

如果f: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>

也可以看看:

您可以向页面添加过滤器( 过滤请求 ):

@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>

此外,使用过滤器时,我建议使用前向而不是重定向。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM