这是我在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
只是将“ contactoModif.puesto”设置为该对象。其他的是空的。
这是我的对象:
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
}
}
我尝试使用“ contactoModif.nombre”,“ contactoModif.empresa”和“ contactoModif.lugarNac”进行了相同的操作,只是设置了“ contactoModif.nombre”(另一时间是按字母顺序排列的,因为这是由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()。
最佳答案
好吧,我不知道为什么这种方式不起作用,但是我尝试了以下方法:
<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,感谢他们编辑我的代码以显示颜色并使其更加清晰。