我有这个本地网址:
http://localhost:8084/Name/faces/Blah.xhtml?flkatid=AAA
这是来自 facelet 的一个段,它检查参数“flkatid”并将其分配给 bean:
<f:metadata>
<f:viewParam name="flkatid"
id="flkatid"
value="#{floKatBean.flkatid}"
required="true"
requiredMessage="URL incomplete"
validator="#{floKatBean.validateFlKatId}"
validatorMessage="URL incomplete or invalid"
>
</f:viewParam>
<f:event type="preRenderView" listener="#{floKatBean.init}"/>
<f:event type="preRenderView" listener="#{floBean.holFloListe}"/>
</f:metadata>
floKatBean.flkatid 是一个整数,因此 URL 无效。显示一个页面,说明:
flkatid: 'AAA' 必须是由一位或多位数字组成的数字。 flkatid:“AAA”必须是介于 -2147483648 和 2147483647 之间的数字 示例:9346
JSF 检查参数本身,因为它知道 bean 元素是一个整数。仅当参数为整数时才会调用自定义验证器。
是否可以让服务器返回 HTTP 错误代码,例如403(禁止)不离开“标准 JSF 世界”(或切换到 RichFaces、MyFaces、SmileyFaces 或其他)?我在 f:viewParam 中找不到任何“失败”页面的内容。也许别处?
最佳答案
你可以做一个 ExternalContext#responseSendError()
验证器内部。但这要求将该值声明为 String
而不是 Integer
还有那个required="true"
已被删除,所有这些都是为了防止 JSF 默认验证机制进行空/空检查和来自 String
的转换。至 Integer
.
<f:metadata>
<f:viewParam name="flkatid" value="#{floKatBean.flkatid}"
validator="#{floKatBean.validateFlKatId}"
validatorMessage="URL incomplete or invalid"
/>
...
</f:metadata>
和
public void validate(FacesContext context, UIComponent component, Object value)
throws ValidatorException, IOException
{
if (value == null || !((String) value).matches("\\d+")) {
context.getExternalContext().responseSendError(
403, (String) component.getAttributes().get("validatorMessage"));
}
}
您可以在
init()
中进行转换方法代替。this.flkatidInteger = Integer.valueOf(this.flatkid);
关于jsf 2.0 在 GET 参数验证失败后返回 http 错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6186121/