我在portlet页面中有一个带有两个下拉菜单的表单;每次用户从第一个菜单中选择一个值时,我都想提交表单,这样我就可以填充第二个表单。当用户在提交表单之前单击调用设置区分参数的JavaScript的按钮时,将处理实际提交。
这是来自页面的动作bean,它成功地重定向到JSP inserisciOrganoEnteBando :
<bean id="aggiungiEnteOrganoBando" class="it.milano.comune.pi.nomine.service.AggiungiEnteOrganoBando">
<property name="sessionForm" value="true" />
<property name="commandName" value="aggiungiEnteOrganoBandoForm" />
<property name="commandClass" value="it.milano.comune.pi.nomine.backoffice.model.AggiungiEnteOrganoBandoForm" />
<property name="formView" value="gestisciOrganiEntiBando" />
<property name="successView" value="inserisciOrganoEnteBando" />
<property name="entiOrganiDao" ref="entiOrganiDao" />
<property name="entiDao" ref="entiDao" />
</bean>
在onSubmitRender
控制器中使用此AggiungiEnteOrganoBando
方法
protected ModelAndView onSubmitRender(RenderRequest request, RenderResponse response, Object obj, BindException exceptions)
throws Exception {
PortletSession session = request.getPortletSession();
Map results = (Map) session.getAttribute("results");
ModelAndView mav = new ModelAndView(getSuccessView(), "results", results);
Map listaEnti= (Map)results.get("listaEnti");
mav.addObject("listaEnti", listaEnti);
return mav;
}
这是来自JSP inserisciOrganoEnteBando 的表单:
<form id="insertEnteOrganoBandoForm" name="insertEnteOrganoBandoForm" method="POST" class="form-search"
action='<portlet:actionURL>
<portlet:param name="action" value="insertEnteOrganoBando" />
</portlet:actionURL>'
>
<label for="id_ente">Ente</label>
<select id="id_ente" name="id_ente" onchange="realSubmit('KO')">
<option value="" label="Seleziona ente"/>
<c:forEach var="lie" items="${listaEnti}">
<option value="<c:out value="${lie.key}"/>" label="<c:out value="${lie.value}"/>" />
</c:forEach>
</select><br>
<label for="id_ente_organo">Organo</label>
<select id="id_ente_organo" name="id_ente_organo">
<option value="" label="Seleziona organo"/>
<c:forEach var="leo" items="${listaEntiOrgani}">
<option value="<c:out value="${leo.key}"/>" label="<c:out value="${leo.value}"/>" />
</c:forEach>
</select><br>
<label for="descrizione">Descrizione</label>
<textarea id="descrizione" name="descrizione"></textarea><br>
<input type="hidden" id="tipoSubmit" name="tipoSubmit"/>
<input type="hidden" id="id_bando" name="id_bando" value="<%= id_bando %>"/>
<input type="button" id="confirmInsertEnteOrganoBando" name="confirmInsertEnteOrganoBando" class="wpsButtonText btn" value="Aggiungi"
onclick="realSubmit('OK')"/>
</form>
变量* id_bando *, listaEnti 和 listaEntiOrgani 都正确地从前一个控制器传递到JSP,第一个下拉列表正确填充,而第二个下拉列表正确填充按预期是空的。
这是JavaScript:
<script type="text/javascript">
var realSubmit = function(stato){
$("#tipoSubmit").val(stato);
document.forms["insertEnteOrganoBandoForm"].submit();
};
</script>
我使用变量tipoSubmit
检查用户是否确实提交了表单,或者只是从第一个下拉菜单中选择了一个元素。
这是表单对象:
public class InsertEnteOrganoBandoForm {
private Long id_ente;
private Long id_ente_organo;
private String descrizione;
private String tipoSubmit;
private Long id_bando;
public Long getId_ente() {
return id_ente;
}
public void setId_ente(Long id_ente) {
this.id_ente = id_ente;
}
public Long getId_ente_organo() {
return id_ente_organo;
}
public void setId_ente_organo(Long id_ente_organo) {
this.id_ente_organo = id_ente_organo;
}
public String getDescrizione() {
return descrizione;
}
public void setDescrizione(String descrizione) {
this.descrizione = descrizione;
}
public String getTipoSubmit() {
return tipoSubmit;
}
public void setTipoSubmit(String tipoSubmit) {
this.tipoSubmit = tipoSubmit;
}
public Long getId_bando() {
return id_bando;
}
public void setId_bando(Long id_bando) {
this.id_bando = id_bando;
}
}
这是动作bean:
<bean id="insertEnteOrganoBando" class="it.milano.comune.pi.nomine.service.InsertEnteOrganoBando">
<property name="sessionForm" value="true" />
<property name="commandName" value="insertEnteOrganoBandoForm" />
<property name="commandClass" value="it.milano.comune.pi.nomine.backoffice.model.InsertEnteOrganoBandoForm" />
<property name="formView" value="inserisciOrganoEnteBando" />
<property name="successView" value="inserisciOrganoEnteBando" />
<property name="bandiEntiOrganiDao" ref="bandiEntiOrganiDao" />
<property name="entiOrganiDao" ref="entiOrganiDao" />
<!-- <property name="validator" ref="insertEnteOrganoBandoValidator" />-->
</bean>
暂时禁用验证程序,正确初始化并注入DAO并将bean映射到:
<entry key="insertEnteOrganoBando" value-ref="insertEnteOrganoBando" />
我的问题是,当从formBackingObject
控制器调用InsertEnteOrganoBando
方法时,sessionForm
对象为null
,甚至不是空格式。
protected Object formBackingObject(PortletRequest request) throws Exception {
PortletSession session = request.getPortletSession();
InsertEnteOrganoBandoForm sessionForm = (InsertEnteOrganoBandoForm) session.getAttribute("InsertEnteOrganoBandoForm");
if (sessionForm != null)return sessionForm;
return super.formBackingObject(request);
}
这个结构与我在我的portlet中用于每个其他页面/控制器/表单/ ...的结构完全相同而没有问题。我检查了拼写错误或不同案件的所有名称,一切都很好。
我错过了什么?
PS:我知道AJAX,但我不能使用它,我正在使用Java 4,Spring 2,IBM WebSphere 6,Eclipse,IE9,我无法进入Java调试模式,只有JavaScript。提前致谢
答案 0 :(得分:0)
我找到了解决方案。经常出现这种情况,这是我的一个简单错误。
我的表单对象中的下拉字段id_ente
和id_ente_organo
为Long,但在我的JSP中,我输入的值为""
,<option value="" label="Seleziona organo"/>
的默认选项。
对于Spring来说,这并没有很好地发挥作用,在表单提交时没有按照我的预期将该字段设置为null
并且无声地失败。
设置默认值-1为我完成了这项工作:<option value="-1" label="Seleziona organo"/>