所谓动态页面就是指页面上的字段是不固定的,比如常见的动态参数,根据不同的情况同一个页面会显示不同的字段。
一般来说是将动态参数以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>