`
yourenyouyu2008
  • 浏览: 282252 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jsf动态页面

    博客分类:
  • jsf
阅读更多

所谓动态页面就是指页面上的字段是不固定的,比如常见的动态参数,根据不同的情况同一个页面会显示不同的字段。

一般来说是将动态参数以key value的形式存储在数据库中,动态参数由两部分组成,1)动态参数定义,即指定情况下应该有哪些参数,2)动态参数值存储,即将用户输入的value与key对应起来存储和显示。

 

动态参数定义需要code,name,可选择列表

public class ReportParameterDefinition

    private String code;

    private String name;//用来显示

//Eg: 1;Int., 2;Dom, 3;Both

    private String optionItems;

 

动态参数值

public class ReportParameter

    private String code;//与ReportParameterDefinition的code对应

    private String value;//用户输入的值

 

页面上通过 c标签来动态生成jsf标签。

c标签本质上不是jsf标签,他不会生成对应的jsf组件,但他可以用来控制jsf组件的生成,c:forEach里面的jsf组件相当于直接在页面上写了多遍jsf组件,不同于ui:Repeat,ui:Repeat本身是jsf组件,他里面的其他jsf组件只有一份,不会根据循环的遍数生成多个jsf组件。

c标签被faceslet重新定义,用来动态生成jsf组件,每次请求的第6阶段会首先执行c标签来更新jsf组件树中的组件

<c:if
  test="#{report.globalReport.reportDefinition.parameterDefinitions !=null}">
  <c:forEach
   items="#{report.globalReport.reportDefinition.parameterDefinitions}"
   var="row1">
   <h:panelGroup>
    <h:outputText value="#{row1.name}" />
   </h:panelGroup>
   <h:panelGroup>
     <c:if test="#{!row1.options}">
      <h:inputText value="#{report.reportParameterMap[row1.code].valueName}"
       label="#{row1.name}" required="true">
       <a4j:support event="onblur" ajaxSingle="true"
        reRender="param_#{row1.code}_Decorate" />
      </h:inputText>
     </c:if>
     <c:if test="#{row1.options}">
      <rich:comboBox
       value="#{report.reportParameterMap[row1.code].value}"
       label="#{row1.name}" enableManualInput="false" required="true">
       <c:forEach items="#{row1.optionItems}" var="row2">
        <f:selectItem itemLabel="#{row2.key}" itemValue="#{row2.value}" />
       </c:forEach>
      </rich:comboBox>
     </c:if> 
   </h:panelGroup>

  </c:forEach>
 </c:if>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics