欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

richfaces ajax特性的一点小提示(为什么数据传不到后台去?)

程序员文章站 2024-03-12 19:44:56
...

问题描述:

页面文件:

<h:outputText value="类型:" id="assessType_inputtext"></h:outputText>
<h:selectOneListbox size="1" id="assessTypeId"
	value="#{agcExceptionDataBackBean.assessTypeId}">
	<f:selectItems value="#{agcExceptionDataBackBean.agcSelectItems}"/>
	<a4j:support event="onchange" reRender="outputPanelId" />
</h:selectOneListbox>
<h:panelGrid columns="3"
	rendered="#{agcExceptionDataBackBean.view}">
	<h:outputText value="容量:" id="realAdjustCapacity_outputtext" />
	<h:inputText id="realAdjustCapacity_inputtext"
		value="#{agcExceptionDataBackBean.currentAgcExceptionData.realAdjustCapacity}">
		<a4j:support  ajaxSingle="true"
			event="onblur" reRender="realAdjustCapacity_message" />
	</h:inputText>
	<a4j:outputPanel id="realAdjustCapacity_message"
		ajaxRendered="true" styleClass="pfoutpanel">
		<h:message for="realAdjustCapacity_inputtext"></h:message>
	</a4j:outputPanel>
</h:panelGrid>
<a4j:commandButton value="保存"
	action="#{agcExceptionDataBackBean.createAgcExceptionData}"
	styleClass="pfbutton">
</a4j:commandButton>

 
ManagerBean的方法:

public boolean isView() {
	if (getAssessTypeId() != null) {
		AssessType type = assessTypeService.get(assessTypeId);
		CommonGenerator gen = commonGeneratorService
				.getByGeneratorCode(generatorCode);
		if (type != null
				&& type.getAssessTypeName().equals("不达标")) {
			return true;
		}
	}
	return false;
}

public Long getAssessTypeId() {
	return assessTypeId;
}

 根据”类型“来判断”容量“这个panelGrid是否显示
当容量显示时,并输入数据如:100
当点保存,照理说会把容量的数据100传到后台去。
但是它并没有传。
跟了一下代码,原来在ApplyRequestValue这个生命周期中h:panelGrid 的processDecode
系统会先去检查h:panelGrid是否渲染,而此时的类型数据assessTypeId还没更新到模型中去(是在UpdateModel生命周期执行)。
所以getAssessTypeId()返回null
isView()也有返回false
因此就不会processDecode容量,因此它的数据也就不会传到后台

 

解决方法:

可以改变getAssessTypeId()方法:

public Long getAssessTypeId() {
	if (assessTypeId == null) {
		String temp = FacesContext.getCurrentInstance()
				.getExternalContext().getRequestParameterMap().get(
						"formId:assessTypeId");
		if (temp != null) {
			assessTypeId = Long.valueOf(temp);
		}
	}
	return assessTypeId;
}

 上面的方法,把数据提前取出来。
我觉得不是王道,不知道有没有更好的方法?

 

生命周期图:

 

 

相关标签: Ajax richfaces F#