这是我在jsp中的表单。当我提交它时,在服务器日志中我可以看到所有参数及其值,但是当我执行对象的println时,只是设置了最后一个(按字母顺序)。
<s:form action="contactos-modificar" method="POST" name="editarContacto">
<s:hidden name="contactoModif.id" value="%{contactoEditar.id}"/>
<div id="top">
<label for="contactoModif.nombre">Nombre</label><br/>
<s:textfield cssClass="large" name="contactoModif.nombre" value="%{contactoEditar.nombre}" />
</div>
<div id="izq">
<label for="contactoModif.lugarNac">Lugar de nacimiento</label><br/>
<s:textfield cssClass="large" name="contactoModif.lugarNac" value="%{contactoEditar.lugarNac}" />
<br/>
<label for="contactoModif.empresa">Empresa</label><br/>
<s:textfield cssClass="large" name="contactoModif.empresa" value="%{contactoEditar.empresa}"/>
<br/>
<label for="localizacion">Localización</label><br/>
<s:textfield cssClass="large" name="contactoModif.localizacion" value="%{contactoEditar.localizacion}"/>
</div>
<div id="dcha">
<label for="contactoModif.fechaNac">Fecha de nacimiento</label><br/>
<s:textfield cssClass="large" name="contactoModif.fechaNac" value="%{contactoEditar.fechaNac}"/>
</br>
<label for="contactoModif.puesto">Puesto</label><br/>
<s:textfield cssClass="large" name="contactoModif.puesto" value="%{contactoEditar.puesto}"/>
<br/>
<label for="contactoModif.direccion">Dirección</label><br/>
<s:textarea cssClass="direccion" name="contactoModif.direccion"><s:property value="contactoEditar.direccion"/></s:textarea>
</div>
<div id="bot">
<label for="contactoModif.notas">Notas</label><br/>
<s:textarea cssClass="notas" name="contactoModif.notas"><s:property value="contactoEditar.notas"/></s:textarea>
<br/>
<s:submit cssClass="submit" value="Guardar cambios"/>
</div>
服务器日志:
2012-12-08 12:39:42,148 DEBUG com.opensymphony.xwork2.interceptor.I18nInterceptor.debug:68 - intercept '//contactos-modificar' {
2012-12-08 12:39:42,149 DEBUG com.opensymphony.xwork2.interceptor.I18nInterceptor.debug:68 - applied invocation context locale=es_ES
2012-12-08 12:39:42,150 DEBUG com.opensymphony.xwork2.interceptor.I18nInterceptor.debug:68 - before Locale=es_ES
2012-12-08 12:39:42,181 DEBUG com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:68 - Entering nullPropertyValue [target=[org.letter.ltr.action.ContactosAction@17805ad, com.opensymphony.xwork2.DefaultTextProvider@c6ede2], property=struts]
2012-12-08 12:39:42,184 DEBUG com.opensymphony.xwork2.util.LocalizedTextUtil.debug:68 - Resource bundles reloaded
2012-12-08 12:39:42,188 DEBUG org.apache.struts2.interceptor.FileUploadInterceptor.debug:68 - Bypassing //contactos-modificar
2012-12-08 12:39:42,188 DEBUG com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.debug:68 - Setting static parameters {}
2012-12-08 12:39:42,189 DEBUG com.opensymphony.xwork2.interceptor.ParametersInterceptor.debug:68 - Setting params NONE
2012-12-08 12:39:42,189 DEBUG com.opensymphony.xwork2.interceptor.ParametersInterceptor.debug:68 - Setting params contactoModif.direccion => [ fffffff ] contactoModif.empresa => [ ccccccc ] contactoModif.fechaNac => [ 11-11-1111 ] contactoModif.id => [ 124 ] contactoModif.localizacion => [ dddddd ] contactoModif.lugarNac => [ bbbbbb ] contactoModif.nombre => [ aaaaaa ] contactoModif.notas => [ ggggggg ] contactoModif.puesto => [ eeeeeee ]
2012-12-08 12:39:42,189 DEBUG com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:68 - Entering nullPropertyValue [target=[org.letter.ltr.action.ContactosAction@17805ad, com.opensymphony.xwork2.DefaultTextProvider@c6ede2], property=contactoModif]
2012-12-08 12:39:42,190 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Property: direccion
2012-12-08 12:39:42,190 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Class: org.letter.ltr.model.ContactoPerfil
2012-12-08 12:39:42,191 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - field-level type converter for property [direccion] = none found
2012-12-08 12:39:42,191 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - global-level type converter for property [direccion] = none found
2012-12-08 12:39:42,192 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@78e377]
2012-12-08 12:39:42,192 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Creating converter with name [string]
2012-12-08 12:39:42,193 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Converter of Type [com.opensymphony.xwork2.conversion.impl.StringConverter] with name [string], created!
2012-12-08 12:39:42,193 DEBUG com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:68 - Entering nullPropertyValue [target=[org.letter.ltr.action.ContactosAction@17805ad, com.opensymphony.xwork2.DefaultTextProvider@c6ede2], property=contactoModif]
2012-12-08 12:39:42,262 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Property: empresa
2012-12-08 12:39:42,263 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Class: org.letter.ltr.model.ContactoPerfil
2012-12-08 12:39:42,263 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - field-level type converter for property [empresa] = none found
2012-12-08 12:39:42,264 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - global-level type converter for property [empresa] = none found
2012-12-08 12:39:42,264 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@78e377]
2012-12-08 12:39:42,265 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Creating converter with name [string]
2012-12-08 12:39:42,266 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Converter of Type [com.opensymphony.xwork2.conversion.impl.StringConverter] with name [string], created!
2012-12-08 12:39:42,267 DEBUG com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:68 - Entering nullPropertyValue [target=[org.letter.ltr.action.ContactosAction@17805ad, com.opensymphony.xwork2.DefaultTextProvider@c6ede2], property=contactoModif]
2012-12-08 12:39:42,268 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Property: fechaNac
2012-12-08 12:39:42,268 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Class: org.letter.ltr.model.ContactoPerfil
2012-12-08 12:39:42,269 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - field-level type converter for property [fechaNac] = none found
2012-12-08 12:39:42,269 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - global-level type converter for property [fechaNac] = none found
2012-12-08 12:39:42,269 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@78e377]
2012-12-08 12:39:42,270 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Creating converter with name [string]
2012-12-08 12:39:42,270 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Converter of Type [com.opensymphony.xwork2.conversion.impl.StringConverter] with name [string], created!
2012-12-08 12:39:42,271 DEBUG com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:68 - Entering nullPropertyValue [target=[org.letter.ltr.action.ContactosAction@17805ad, com.opensymphony.xwork2.DefaultTextProvider@c6ede2], property=contactoModif]
2012-12-08 12:39:42,272 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Property: id
2012-12-08 12:39:42,272 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Class: org.letter.ltr.model.ContactoPerfil
2012-12-08 12:39:42,273 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - field-level type converter for property [id] = none found
2012-12-08 12:39:42,273 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - global-level type converter for property [id] = none found
2012-12-08 12:39:42,274 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@78e377]
2012-12-08 12:39:42,274 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Creating converter with name [number]
2012-12-08 12:39:42,275 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Converter of Type [com.opensymphony.xwork2.conversion.impl.NumberConverter] with name [number], created!
2012-12-08 12:39:42,275 DEBUG com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:68 - Entering nullPropertyValue [target=[org.letter.ltr.action.ContactosAction@17805ad, com.opensymphony.xwork2.DefaultTextProvider@c6ede2], property=contactoModif]
2012-12-08 12:39:42,276 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Property: localizacion
2012-12-08 12:39:42,329 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Class: org.letter.ltr.model.ContactoPerfil
2012-12-08 12:39:42,329 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - field-level type converter for property [localizacion] = none found
2012-12-08 12:39:42,330 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - global-level type converter for property [localizacion] = none found
2012-12-08 12:39:42,331 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@78e377]
2012-12-08 12:39:42,331 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Creating converter with name [string]
2012-12-08 12:39:42,331 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Converter of Type [com.opensymphony.xwork2.conversion.impl.StringConverter] with name [string], created!
2012-12-08 12:39:42,333 DEBUG com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:68 - Entering nullPropertyValue [target=[org.letter.ltr.action.ContactosAction@17805ad, com.opensymphony.xwork2.DefaultTextProvider@c6ede2], property=contactoModif]
2012-12-08 12:39:42,334 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Property: lugarNac
2012-12-08 12:39:42,334 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Class: org.letter.ltr.model.ContactoPerfil
2012-12-08 12:39:42,335 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - field-level type converter for property [lugarNac] = none found
2012-12-08 12:39:42,335 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - global-level type converter for property [lugarNac] = none found
2012-12-08 12:39:42,336 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@78e377]
2012-12-08 12:39:42,337 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Creating converter with name [string]
2012-12-08 12:39:42,337 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Converter of Type [com.opensymphony.xwork2.conversion.impl.StringConverter] with name [string], created!
2012-12-08 12:39:42,338 DEBUG com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:68 - Entering nullPropertyValue [target=[org.letter.ltr.action.ContactosAction@17805ad, com.opensymphony.xwork2.DefaultTextProvider@c6ede2], property=contactoModif]
2012-12-08 12:39:42,338 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Property: nombre
2012-12-08 12:39:42,339 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Class: org.letter.ltr.model.ContactoPerfil
2012-12-08 12:39:42,339 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - field-level type converter for property [nombre] = none found
2012-12-08 12:39:42,340 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - global-level type converter for property [nombre] = none found
2012-12-08 12:39:42,340 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@78e377]
2012-12-08 12:39:42,341 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Creating converter with name [string]
2012-12-08 12:39:42,341 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Converter of Type [com.opensymphony.xwork2.conversion.impl.StringConverter] with name [string], created!
2012-12-08 12:39:42,342 DEBUG com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:68 - Entering nullPropertyValue [target=[org.letter.ltr.action.ContactosAction@17805ad, com.opensymphony.xwork2.DefaultTextProvider@c6ede2], property=contactoModif]
2012-12-08 12:39:42,343 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Property: notas
2012-12-08 12:39:42,343 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Class: org.letter.ltr.model.ContactoPerfil
2012-12-08 12:39:42,395 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - field-level type converter for property [notas] = none found
2012-12-08 12:39:42,395 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - global-level type converter for property [notas] = none found
2012-12-08 12:39:42,396 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@78e377]
2012-12-08 12:39:42,397 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Creating converter with name [string]
2012-12-08 12:39:42,397 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Converter of Type [com.opensymphony.xwork2.conversion.impl.StringConverter] with name [string], created!
2012-12-08 12:39:42,398 DEBUG com.opensymphony.xwork2.conversion.impl.InstantiatingNullHandler.debug:68 - Entering nullPropertyValue [target=[org.letter.ltr.action.ContactosAction@17805ad, com.opensymphony.xwork2.DefaultTextProvider@c6ede2], property=contactoModif]
2012-12-08 12:39:42,399 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Property: puesto
2012-12-08 12:39:42,400 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - Class: org.letter.ltr.model.ContactoPerfil
2012-12-08 12:39:42,400 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - field-level type converter for property [puesto] = none found
2012-12-08 12:39:42,401 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - global-level type converter for property [puesto] = none found
2012-12-08 12:39:42,401 DEBUG com.opensymphony.xwork2.conversion.impl.XWorkConverter.debug:68 - falling back to default type converter [com.opensymphony.xwork2.conversion.impl.XWorkBasicConverter@78e377]
2012-12-08 12:39:42,402 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Creating converter with name [string]
2012-12-08 12:39:42,402 DEBUG com.opensymphony.xwork2.ObjectFactory.debug:68 - Converter of Type [com.opensymphony.xwork2.conversion.impl.StringConverter] with name [string], created!
2012-12-08 12:39:42,404 DEBUG org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.debug:68 - Validating //contactos-modificar with method modificarContacto.
2012-12-08 12:39:42,424 DEBUG com.opensymphony.xwork2.validator.ValidationInterceptor.debug:68 - Invoking validate() on action org.letter.ltr.action.ContactosAction@17805ad
2012-12-08 12:39:42,425 DEBUG com.opensymphony.xwork2.interceptor.PrefixMethodInvocationUtil.debug:68 - cannot find method [validateModificarContacto] in action [org.letter.ltr.action.ContactosAction@17805ad]
2012-12-08 12:39:42,425 DEBUG com.opensymphony.xwork2.interceptor.PrefixMethodInvocationUtil.debug:68 - cannot find method [validateDoModificarContacto] in action [org.letter.ltr.action.ContactosAction@17805ad]
2012-12-08 12:39:42,426 DEBUG com.opensymphony.xwork2.DefaultActionInvocation.debug:68 - Executing action method = modificarContacto
Just&#34; contactoModif.puesto&#34;被设置为对象。其他的都是空的。
这是我的目标:
public class ContactoPerfil {
private static final long serialVersionUID = 1L;
private int id=0;
private String nombre="";
private String fechaNac="";
private String lugarNac="";
private String empresa="";
private String puesto="";
private String direccion="";
private String localizacion="";
private String notas="";
public int getId(){
return id;
}
public String getNombre(){
return nombre;
}
public String getFechaNac(){
return fechaNac;
}
public String getLugarNac(){
return lugarNac;
}
public String getEmpresa(){
return empresa;
}
public String getPuesto(){
return puesto;
}
public String getDireccion(){
return direccion;
}
public String getLocalizacion(){
return localizacion;
}
public String getNotas(){
return notas;
}
public void setId(int id){
this.id = id;
}
public void setNombre(String nombre){
this.nombre = nombre;
}
public void setFechaNac(String fechaNac){
this.fechaNac = fechaNac;
}
public void setLugarNac(String lugarNac){
this.lugarNac = lugarNac;
}
public void setEmpresa(String empresa){
this.empresa = empresa;
}
public void setPuesto(String puesto){
this.puesto = puesto;
}
public void setDireccion(String direccion){
this.direccion = direccion;
}
public void setLocalizacion(String localizacion){
this.localizacion = localizacion;
}
public void setNotas(String notas){
this.notas = notas;
}
@Override
public String toString(){
//code
}
}
我试过&#34; contactoModif.nombre,&#34; contactoModif.empresa&#34;和&#34; contactoModif.lugarNac&#34;同样的事情发生了,只是&#34; contactoModif.nombre&#34;设置了(另一次是按字母顺序排列的最后一个,因为它是由struts2转换的最后一个)。
在行动中:
public class ContactosAction extends ActionSupport implements SessionAware,ServletRequestAware{
private ContactoPerfil contactoModif;
@Action(value="contactos-modificar",
results={
@Result(name="success", type="stream", params={"contentType","text/html","inputName","inputStream"}),
@Result(name="error", type="stream", params={"contentType","text/html","inputName","inputStream"})}
)
public String modificarContacto() throws Exception{
//code
}
public void setContactoModif(ContactoPerfil c){
this.contactoModif=c;
}
}
Struts版本:2.3.4
我需要帮助,它让我发疯,对我来说解决这个问题非常重要,如果我不能使用struts2方式,我想我会使用html表单和getServletRequest()。
答案 0 :(得分:1)
嗯,我不知道为什么这样做不起作用,但我尝试了这个:
<label for="contactoModif.nombre">Nombre</label><br/>
<input type="text" class="large" name="contactoModif.nombre" value="<s:property value="contactoEditar.nombre"/>"/>
在行动中:
public ContactoPerfil getContactoModif(){
return contactoModif;
}
现在它可以工作,我收到表单的所有字段,并且所有字段都存储在对象中。 我只是更改了字段并添加了“get”方法(我认为只需要“set”方法来获取表单中的值),其余的代码是相同的。
PS:谢谢MohanaRao SV,编辑我的代码以显示颜色并使其更清晰。