gpt4 book ai didi

validation - 为什么需要 ="true"渲染时未触发 ="false"

转载 作者:行者123 更新时间:2023-12-04 04:34:10 27 4
gpt4 key购买 nike

我对在 facelet 中解析 html 标签有一些疑问。让我们有包含以下内容的facelet

<h:inputText id="username"
title="My name is: "
value="#{hello.name}"
required="true"
requiredMessage="Error: A name is required."
rendered="false"
maxlength="25" />
<h:commandButton id="submit" value="Submit" action="response">
</h:commandButton>

提交后点击我还没有 Error: A name is required .为什么? username只是没有渲染,在 submit 之后单击 username 中没有值.

最佳答案

rendered属性也在验证和更新模型值阶段进行评估。如需证据,请查看 javax.faces.component.UIInput source code (行号按照 Mojarra 2.2.0):

696     public void processValidators(FacesContext context) {
697
698 if (context == null) {
699 throw new NullPointerException();
700 }
701
702 // Skip processing if our rendered flag is false
703 if (!isRendered()) {
704 return;
705 }
...
...
...
735 public void processUpdates(FacesContext context) {
736
737 if (context == null) {
738 throw new NullPointerException();
739 }
740
741 // Skip processing if our rendered flag is false
742 if (!isRendered()) {
743 return;
744 }

解释很简单:这是一种防止篡改(欺骗/黑客攻击)HTTP 请求的保护措施,其中最终用户故意操纵 HTTP 请求以尝试设置值和/或调用隐藏输入/命令的操作,他们很可能根本不允许这样做更新或调用,例如仅在用户具有管理员角色时显示的删除按钮:
<h:commandButton value="Delete" ... rendered="#{request.isUserInRole('ADMIN')}" />

注意:组件的 readonlydisabled属性也以这种方式处理。对于您的特定目的,请使用 CSS display: none相反。
<h:inputText ... style="display:none" />

(注意:这是一个启动示例,在 HTML/CSS 中使用 style 属性是不好的做法,更喜欢 styleClass 和具体的 CSS 文件)

虽然我想知道这背后的具体功能要求,但这对 UX 不利。也许您只是在没有先研究 JSF specification 的情况下随意尝试。更不用说 JSF source code ?

关于validation - 为什么需要 ="true"渲染时未触发 ="false",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20039698/

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