动态JSF UI组件生成

时间:2013-12-11 10:31:31

标签: java xml jsf dynamic

我正在尝试解决以下问题:

假设我有一个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

提前致谢。

1 个答案:

答案 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概念,这非常简单。