如果 f:viewParam 为空则重定向
Redirect if a f:viewParam is empty
如果 f:viewParam
为空,我可以进行重定向(或错误)吗?
<f:metadata>
<f:viewParam name="accountId" value="#{accountMB.id}"/>
</f:metadata>
当我添加 required="true"
时,没有任何反应。有哪些选择?
When I add required="true"
, nothing happens
您需要 <h:message(s)>
来显示与给定(输入)组件关联的面孔消息。您可能已经知道如何为 <h:inputText>
做到这一点。您可以对 <f:viewParam>
.
执行完全相同的操作
<f:metadata>
<f:viewParam id="foo" ... required="true" />
</f:metadata>
...
<h:message for="foo" />
Сan I do a redirect (or error) if a f:viewParam
is empty?
不直接使用标准 JSF 验证工具。您需要在 <f:viewAction>
中手动完成这项工作(您需要确保上面没有任何 validators/converters,否则由于 validation/conversion 错误;您也可以使用 <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, then you can use the <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>
另请参阅:
- What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?
您可以向页面添加过滤器 (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>
此外,在使用过滤器时,我建议使用转发而不是重定向。
如果 f:viewParam
为空,我可以进行重定向(或错误)吗?
<f:metadata>
<f:viewParam name="accountId" value="#{accountMB.id}"/>
</f:metadata>
当我添加 required="true"
时,没有任何反应。有哪些选择?
When I add
required="true"
, nothing happens
您需要 <h:message(s)>
来显示与给定(输入)组件关联的面孔消息。您可能已经知道如何为 <h:inputText>
做到这一点。您可以对 <f:viewParam>
.
<f:metadata>
<f:viewParam id="foo" ... required="true" />
</f:metadata>
...
<h:message for="foo" />
Сan I do a redirect (or error) if a
f:viewParam
is empty?
不直接使用标准 JSF 验证工具。您需要在 <f:viewAction>
中手动完成这项工作(您需要确保上面没有任何 validators/converters,否则由于 validation/conversion 错误;您也可以使用 <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, then you can use the <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>
另请参阅:
- What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?
您可以向页面添加过滤器 (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>
此外,在使用过滤器时,我建议使用转发而不是重定向。