gpt4 book ai didi

validation - 在客户端中删除输入时跳过验证器 - 这是否符合 JSF 规范?

转载 作者:行者123 更新时间:2023-12-04 11:54:09 24 4
gpt4 key购买 nike

我有一个带有标记为 required="true" 的输入文本组件的页面并有一个自定义 Validator在服务器端。

现在作为客户端,我提交了没有该组件呈现的 HTML 元素的页面(这可以通过使用浏览器的内置 DOM 元素检查器从 DOM 树中删除元素来轻松实现)。表单已成功提交,无需对此所需组件进行服务器端验证。

这是按照 JSF 规范吗?有没有办法指定页面中的验证器即使发布的页面不包含它们也要执行?

最佳答案

这确实符合规范。这是来自 UIInput#validate() javadoc 的相关摘录(强调我的):

Retrieve the submitted value with getSubmittedValue(). If this returns null, and the value of the ALWAYS_PERFORM_VALIDATION_WHEN_REQUIRED_IS_TRUE context-param is true (ignoring case), examine the value of the "required" property. If the value of "required" is true, continue as below. If the value of "required" is false or the required attribute is not set, exit without further processing. If the context-param is not set, or is set to false (ignoring case), exit without further processing. (This indicates that no value was submitted for this component.)



空输入将发送空字符串,而不是 null .完全没有输入将发送 null , 不是空字符串。

因此,您可以通过添加以下上下文参数来禁用观察到的行为:
<context-param>
<param-name>javax.faces.ALWAYS_PERFORM_VALIDATION_WHEN_REQUIRED_IS_TRUE</param-name>
<param-value>true</param-value>
</context-param>

请注意,此上下文参数是自 JSF 2.3 以来的新参数,并已向后移植到 Mojarra 2.2.16、2.1.29-10 和 1.2_15-06。旧版本不支持它。另见 JSFSPEC-1433the expert group discussion about this issue .

这是否有害取决于业务逻辑。一个设计得体的模型(业务逻辑和/或数据模型),不考虑 null正如预期的那样,会在其他地方导致空指针异常,或 SQL 约束违规( NOT NULL ),这通常会以 HTTP 500 错误响应结束。但是如果模型真的考虑 null作为预期的情况,那么它很可能是模型中的一个错误。 View (JSF 页面)旨在仅呈现模型,然后对它几乎无能为力。

如果业务逻辑或数据模型真的不能改可以考虑 null作为异常(exception)情况(即永远不要假设/接受给定值 null ),并且您碰巧使用 JPA,那么最好的办法是添加 @NotNull在属性(property)上。虽然 JSF 将绕过对其的验证,但 JPA 仍将对其进行验证,从而仍然导致异常和 HTTP 500 错误。在这种情况下,我只是想知道为什么 DB 列没有 NOT NULL约束放在首位。或者,做 class level validation .

应该注意的是,MyFaces 会在此记录如下警告:

Mar 16, 2016 8:55:52 AM org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils decodeUIInput
WARNING: There should always be a submitted value for an input if it is rendered, its form is submitted, and it was not originally rendered disabled or read-only. You cannot submit a form after disabling an input element via javascript. Consider setting read-only to true instead or resetting the disabled value back to false prior to form submission.
Component : {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /test.xhtml][Class: javax.faces.component.html.HtmlBody,Id: j_id_5][Class: javax.faces.component.html.HtmlForm,Id: j_id_6][Class: javax.faces.component.html.HtmlInputText,Id: j_id_7] Location: /test.xhtml at line 22 and column 33}

关于validation - 在客户端中删除输入时跳过验证器 - 这是否符合 JSF 规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17773979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com