我对在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
没有值。
答案 0 :(得分:3)
在验证和更新模型值阶段期间还会评估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')}" />
注意:组件的readonly
和disabled
属性也会以这种方式处理。出于特定目的,请改用CSS display: none
。
<h:inputText ... style="display:none" />
(注意:这是一个启动示例,使用style
属性是HTML / CSS透视图中的错误做法,更喜欢使用具体的CSS文件styleClass
虽然我想知道这背后的具体功能要求,但这对用户体验很不利。也许你只是在没有先学习JSF specification,更不用说JSF source code?
的情况下随意进行实验