怎么样在JSF应用请求值之前获取参数值?
怎么样在JSF应用请求值之前获取参数值?
JSF 应用请求值之前获取参数值
实现者:^^cngdcn^^ (48380277)
整理:Samland
问题描述:
我要实现维护"类型", 类型以typename和typeid作为组合主键. 而typeid值存在层次关系,
所以设置typeparent作为指向上级typeid的指针.
因此在相同的typename情况下, typeparent可以指向typeid.
举例说明:
typenametypeidtypeparent
企业E
国有企业GE说明:国有企业属于企业
私营企业SE
个体户T
事业单位U
中学M
高中SM说明:高中属于中学
初中JM
中专中技TM
中级技工GT
中专师范CT
那么在列表点击"编辑"某一个记录时, 必须传递参数typename和typeid, 以此获得记录
详细内容提供修改, 并且, 以_typename_作为参数生成typeparent下拉选择列表, 提供
选择后赋予记录的typeparent属性.
-----------------------------------
<h:selectOneMenu value="#{typeallForm.oaTypeall.typeparent }">
<f:selectItem itemValue="" itemLabel="(请选择)"/>
<f:selectItems value="#{typeallForm.parentTypes}" />
</h:selectOneMenu>
public SelectItem[] getParentTypes(){
TypeAll typeall = new TypeAll();
this.parentTypes = typeall.getSelectItem(this.typeName);
if (this.parentTypes==null) this.parentTypes = new SelectItem[0];
return this.parentTypes;
}
-----------------------------------
在生成编辑页面时,因为typeName参数已经赋予了typeallForm的typeName属性,
因此getParentTypes()方法可以正常返回下拉列表.
问题是, 当提交的时候,
却在getParentTypes()方法出现typeName=null的现象,从而无法继续执行save的ActionEvent.
源代码如下:
-----------------------------------
<h:inputHidden value="#{typeallForm.typeName }"></h:inputHidden>
<h:inputHidden value="#{typeallForm.oaTypeall.typename }"></h:inputHidden>
<h:inputHidden value="#{typeallForm.oaTypeall.typeid }"></h:inputHidden>
<h:commandButton action="#{typeallForm.save }" value="提交"></h:commandButton>
-----------------------------------
解决办法:
1. 为selectOneMenu加上validator, 并且为#{typeallForm.typeName }加上id和immedate属性
-----------------------------------
<h:selectOneMenu value="#{typeallForm.oaTypeall.typeparent }" validator="#{typeallForm.saveState}">
<f:selectItem itemValue="" itemLabel="(请选择)"/>
<f:selectItems value="#{typeallForm.parentTypes}" />
</h:selectOneMenu>
<h:inputHidden id="typeName" value="#{typeallForm.typeName }" immediate="true"></h:inputHidden>
-----------------------------------
2. 在typeallForm中增加saveState方法
public void saveState(FacesContext context,UIComponent component,Object value){
component.findComponent("typeName").processUpdates(context);
}
原因:
分析中.欢迎参与讨论.