Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 如何以编程方式禁用JSF组件_Jsf 2_Richfaces - Fatal编程技术网

Jsf 2 如何以编程方式禁用JSF组件

Jsf 2 如何以编程方式禁用JSF组件,jsf-2,richfaces,Jsf 2,Richfaces,我们有一个JSF应用程序,它根据存储在数据库中的某些配置显示字段,因此组件没有在.xhtml页面中定义,但必须以编程方式生成,例如在本例中: 组件在面板中生成: <rich:tab id="someTab" header="#{msg['someHeader']}" immediate="true"> <rich:messages/> <h:panelGrid id="generatedComponentsContainer"/> </r

我们有一个JSF应用程序,它根据存储在数据库中的某些配置显示字段,因此组件没有在.xhtml页面中定义,但必须以编程方式生成,例如在本例中:

组件在面板中生成:

<rich:tab id="someTab" header="#{msg['someHeader']}" immediate="true">
    <rich:messages/>
    <h:panelGrid id="generatedComponentsContainer"/>
</rich:tab>
根据某些情况,这些组件必须显示为禁用状态,因此,如果需要,我使用以下代码禁用它们中的每一个:

if (!showEnabled) { text.getAttributes().put("disabled", "true"); }
此方法适用于UIInput和HtmlInputTextarea,但不适用于UICalendar,引发IllegalArgumentException参数类型不匹配

如何禁用日历


我还一直在想,这段代码是否只是在客户端禁用了组件,而在服务器端启用了组件。这可能是一种安全威胁,因为有人可以通过Javascript启用组件并将表单提交给服务器。我不确定这是否可能,如果我错了,请告知。

进一步研究后,我注意到有一些类扩展了我们在项目中使用的类。这些类有一个用于disabled属性的getter/setter,该属性还禁用服务器端的组件。我以编程方式禁用组件并在浏览页面以允许编辑和提交时删除disabled属性,对此进行了测试。提交表单时,这些值在请求中设置,但在服务器端被忽略。Bean值保持不变

我们使用的课程包括:

HtmlInputTextarea代替UIInput

HtmlInputText代替UIInput

我们已经在使用UICalendar了,这符合我们的目的

代码示例:

HtmlInputText text = (HtmlInputText) ctx.getApplication().createComponent(
ctx, HtmlInputText.COMPONENT_TYPE, "javax.faces.component.html.HtmlInputText");

if (!showEnabled) { text.setDisabled(true); }
调试HtmlInputText的内容时,可以看到名为stateHelper的ComponentStateHelper对象,该对象将组件的禁用状态存储在其他数据中。它的超级界面是国家所有者:

此接口由需要保存其状态的类实现 在请求之间

我知道组件的服务器端状态存储在这个对象中,但我不确定它是否只存储在这里或更多的点中,甚至我对其用途的解释是否正确。专家的反馈将非常有用

HtmlInputText text = (HtmlInputText) ctx.getApplication().createComponent(
ctx, HtmlInputText.COMPONENT_TYPE, "javax.faces.component.html.HtmlInputText");

if (!showEnabled) { text.setDisabled(true); }
public interface StateHolder