我有一个<h:selectOneMenu>
。根据选择的内容,将显示众多 <div>
之一与选择相关的内容将被隐藏。
每个<div>
有一些<h:inputText>
写入不同的@ViewScoped
bean 。其中一些 <div>
甚至可以写入 bean 中的相同属性。
例如。
<div>
<h:outputLabel for="list" value="Items"/>
<div>
<h:message for="list"/>
<h:selectOneMenu id="list" value="#{bean.selectedItem}" >
<f:selectItem itemLabel="Select one"></f:selectItem>
<f:selectItems value="bean.someItemsList" />
</h:selectOneMenu>
</div>
</div>
<div id="item1">
<!-- some other input fields -->
<div>
<h:message for="item1input1"/>
<h:inputText id="item3input1" value="bean.thisIsTheSameProperty" />
</div>
</div>
<div id="item2">
<!-- some other input fields -->
</div>
<div id="item3">
<!-- some other input fields -->
<div>
<h:message for="item3input1"/>
<h:inputText id="item3input1" value="bean.thisIsTheSameProperty" />
</div>
</div>
问题:当我选择一个项目时,将显示 <div>
(例如 <div id="item1">
),还有另一个隐藏的 <div>
(例如 <div id="item3">
)写入相同的 bean 属性(例如 value="bean.thisIsTheSameProperty"
),并且此属性用 javax.validation.constraints.@NotNull
进行注释,即使我为此输入字段赋予一个值,当我提交表单时,我认为 JSF 也会运行隐藏的 <div>
(通常没有输入集)。
我在调试过程中看到的情况:提交表单时,我看到 bean 的 setter 将被调用两次。第一次将使用我输入的正确值设置 bean 属性,但第二次将使用空值调用 setter 。所以验证会因为@NotNull而失败。
我的假设是 JSF 尝试设置 Bean 值两次,其中一次针对所示 <div>
上的输入字段第二次为隐藏<div>
(因为它们指向相同的 bean 属性),但对于隐藏 bean,没有设置输入字段(它们为 null)。
我显示/隐藏 <div>
取决于从 <h:selectOneMenu>
中选择的项目,使用 jQuery 。
例如。
$('#item1').show();
$('#item1').hide();
$('#item2').show();
$('#item2').hide();
$('#item3').show();
$('#item3').hide();
有没有办法让JSF不考虑隐藏<div>
到底是什么?
最佳答案
您似乎假设隐藏输入(通过 CSS 隐藏)不会提交到服务器。这个假设是错误的,顺便说一句,它是一个普通的 html 东西,根本与 JSF 无关。
参见例如Stop an input field in a form from being submitted
但是,它仍然允许通过浏览器开发工具进行客户端操作来“攻击”您的应用程序。与所有大肆宣传的 javascript UI 框架相反,JSF 是一个成熟的' MVC framework ' 内置了针对 client-side manipulation/tampering and CSRF, XSS 的保护为此,您需要其他框架中的 OWASP 相关功能。 (这一点和其他因素使得 JSF(带有 PrimeFaces、OmniFaces 和 DeltaSpike)对我来说仍然是一个快速开发面向业务的应用程序的出色框架。)
您最好使用ajax
conditionally render one div or the other但你不能 'update' the divs当它们被定义为你拥有它们时。
另请参阅:
关于javascript - 提交时禁用 JSF 表单字段验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54558725/