我正在尝试解决以下问题:
假设我有一个settings.xml文件,如下所示:
<SETTINGS>
<username fieldType="TextField" possibleValues="*">username_value</username>
<roletype fieldType="DropDownList" possibleValues="normal,admin,agent">admin</roletype>
<active fieldType="RadioButtons" possibleValues="true,false">true</active>
<SETTINGS>
我想要实现的目标如下: 1-当我的页面首次加载时,它将解析此xml文件,并根据fieldType和possibleValues布置UI组件。 2-加载我的UI组件后,我应该能够配置我的字段的值,这将最终保存在我的settings.xml文件中。
是否存在可以执行此操作的现成库?或者我是否需要自己编写代码?
注意:我只能使用JSF 1.x
提前致谢。
答案 0 :(得分:0)
首先,我建议将XML文件的结构更改为:
<SETTINGS>
<controls>
<control label="username" fieldType="TextField">
<values></values>
<selvalue></selvalue>
</control>
<control label="roletype" fieldType="DropDownList">
<values>
<value>normal</value>
<value>admin</value>
<value>agent</value>
</values>
<selvalue></selvalue>
</control>
<control label="active" fieldType="RadioButtons">
<values>
<value>true</value>
<value>false</value>
</values>
<selvalue></selvalue>
</control>
现在使用JAXB
将此XML文件parase到不同的类别,其中每个xml选项卡将作为一个独立的类。
喜欢:
设置:
private List<Control> controls;
控制:
String label; // Attribute
String fieldType; // Attribute
Values values; //Property
String selValue; //Property
值:
List<Value> values; ////Property
价值:
String value; //Property
DynaCritSearchBean:Bean类
Settings settings;
将数据加载到相应的类后,使用以下逻辑在XHTML文件中动态创建屏幕:
<h:panelGrid>
<c:forEach var="control"
items="#{dynaCritSearchBean.settings.controls}">
<h:panelGroup>
<h:outputText value="#{control.label}" />
</h:panelGroup>
<h:panelGroup>
<c:choose>
<c:when test="#{control.fieldType eq 'TextField'}">
<h:inputText value="#{control.selvalue}" />
</c:when>
<c:when test="#{control.fieldType eq 'DropDownList'}">
<h:selectOneMenu value="#{control.selvalue}">
<f:selectItem itemValue="" itemLabel="--select--" />
<c:forEach var="selOneValue" items="#{control.values.values}">
<f:selectItem itemValue="#{selOneValue}"
itemLabel="#{selOneValue}" />
</c:forEach>
</h:selectOneMenu>
</c:when>
<!-- Same as above logic for Radio button -->
</c:choose>
</h:panelGroup>
</c:forEach>
</h:panelGrid>
提交表单后,所有选定/输入的值都会设置为每个控件的相应selValue
。
现在,为了恢复XML,您可以使用相同的JAXB
概念,这非常简单。