我有一点(我希望)试图使用Struts2 jQuery插件中的Doubleselect元素。我没有问题跟随sample,当我添加新记录(向数据库添加新记录)时,行为是预期的,但是当我尝试编辑现有记录时,第二个选择不加载存储的值正在编辑的记录。
任何帮助?
代码和配置如下:
JSP代码
<s:form id="ingresoForm" action="saveIngreso" method="post" validate="true" cssClass="well form-horizontal">
<s:hidden key="ingreso.id"/>
<s:hidden key="cliente" id="cliente"/>
<div class="type-text">
<label for="cliente">Cliente: </label>
<s:url var="remoteurl" action="ajax/clienteProyectoSelectSource"/>
<sj:select
href="%{remoteurl}"
id="clienteSelect"
onChangeTopics="reloadsecondlist"
name="ingreso.cliente.id"
list="clientes"
listKey="id"
listValue="nombre"
emptyOption="false"
headerKey="-10"
headerValue="Por favor seleccione un cliente"/>
</div>
<div class="type-text">
<label for="Proyecto">Proyecto: </label>
<sj:select
href="%{remoteurl}"
id="proyectoSelect"
formIds="ingresoForm"
reloadTopics="reloadsecondlist"
name="ingreso.proyecto.id"
list="proyectos"
listKey="id"
listValue="nombre"
emptyOption="false"
/>
</div>
行动守则
public class ClienteProyectoSelectSourceAjaxAction extends BaseAction {
private List<Cliente> clientes;
private List<Proyecto> proyectos;
private String cliente;
private GenericManager<Cliente, Long> clienteManager;
@Override
public String execute() {
clientes = clienteManager.getAll();
if (cliente != null && cliente.length() > 0 && !cliente.equals("-10")) {
proyectos = clienteManager.get(new Long(cliente)).getProyectos();
}
return Action.SUCCESS;
}
行动宣言
<package name="example" extends="json-default" namespace="/ajax">
<action name="clienteProyectoSelectSource" class="com.queres.smtm.webapp.action.ajax.ClienteProyectoSelectSourceAjaxAction">
<result type="json"/>
</action>
</package>
Ingreso实体(模型)
@Entity
@Table(name = "ingreso")
public class Ingreso extends BaseObject {
// Campos comunes
private Long id;
private TipoIngreso tipo;
private String observaciones;
private BigDecimal importe;
private BigDecimal tipoIVA;
private Date fechaPrevistaCobro;
private Date fechaEfectivaCobro;
// Campos para facturas
private String numeroFactura;
private Cliente cliente;
private Proyecto proyecto;
private TipoServicio servicio;
private Date fechaEmision;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Enumerated(EnumType.STRING)
public TipoIngreso getTipo() {
return tipo;
}
public void setTipo(TipoIngreso tipo) {
this.tipo = tipo;
}
public String getObservaciones() {
return observaciones;
}
public void setObservaciones(String observaciones) {
this.observaciones = observaciones;
}
public BigDecimal getImporte() {
return importe;
}
public void setImporte(BigDecimal importe) {
this.importe = importe;
}
public BigDecimal getTipoIVA() {
return tipoIVA;
}
public void setTipoIVA(BigDecimal tipoIVA) {
this.tipoIVA = tipoIVA;
}
@Temporal(javax.persistence.TemporalType.DATE)
@Field
public Date getFechaPrevistaCobro() {
return fechaPrevistaCobro;
}
public void setFechaPrevistaCobro(Date fechaPrevistaCobro) {
this.fechaPrevistaCobro = fechaPrevistaCobro;
}
@Temporal(javax.persistence.TemporalType.DATE)
@Field
public Date getFechaEfectivaCobro() {
return fechaEfectivaCobro;
}
public void setFechaEfectivaCobro(Date fechaEfectivaCobro) {
this.fechaEfectivaCobro = fechaEfectivaCobro;
}
public String getNumeroFactura() {
return numeroFactura;
}
public void setNumeroFactura(String numeroFactura) {
this.numeroFactura = numeroFactura;
}
@ManyToOne
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
@ManyToOne
public Proyecto getProyecto() {
return proyecto;
}
public void setProyecto(Proyecto proyecto) {
this.proyecto = proyecto;
}
@Enumerated(EnumType.STRING)
public TipoServicio getServicio() {
return servicio;
}
public void setServicio(TipoServicio servicio) {
this.servicio = servicio;
}
@Temporal(javax.persistence.TemporalType.DATE)
@Field
public Date getFechaEmision() {
return fechaEmision;
}
public void setFechaEmision(Date fechaEmision) {
this.fechaEmision = fechaEmision;
}
@Override
public int hashCode() {
int hash = 3;
hash = 43 * hash + (this.numeroFactura != null ? this.numeroFactura.hashCode() : 0);
hash = 43 * hash + (this.fechaEmision != null ? this.fechaEmision.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Ingreso other = (Ingreso) obj;
if ((this.numeroFactura == null) ? (other.numeroFactura != null) : !this.numeroFactura.equals(other.numeroFactura)) {
return false;
}
if (this.fechaEmision != other.fechaEmision && (this.fechaEmision == null || !this.fechaEmision.equals(other.fechaEmision))) {
return false;
}
return true;
}
@Override
public String toString() {
return "Ingreso{" + "id=" + id + ", tipo=" + tipo + ", observaciones=" + observaciones + ", importe=" + importe + ", tipoIVA=" + tipoIVA + ", fechaPrevistaCobro=" + fechaPrevistaCobro + ", fechaEfectivaCobro=" + fechaEfectivaCobro + ", numeroFactura=" + numeroFactura + ", cliente=" + cliente + ", proyecto=" + proyecto + ", servicio=" + servicio + ", fechaEmision=" + fechaEmision + '}';
}
}
提前谢谢
答案 0 :(得分:0)
问题解决了。似乎jquery-plugin工作得很好,像往常一样,错误发生在键盘和椅子之间......
我忘了为第二个选择加载数据列表,因此jquery无法选择适当的值。
因此,解决方案是确保在用户编辑元素时加载第二个列表(proyectos)。
我在JSP上添加了一个标志(cliente)作为隐藏元素并从主操作中预加载它,因此我可以从Ajax Action中检查是否需要填充第二个列表。
Ingreso Action(视图的主要操作)
public class IngresoAction extends BaseAction implements Preparable {
private String cliente;
public String edit() {
if (id != null) {
ingreso = ingresoManager.get(id);
cliente = Long.toString(ingreso.getCliente().getId());
} else {
ingreso = new Ingreso();
}
return SUCCESS;
}
public String getCliente() {
return cliente;
}
public void setCliente(String cliente) {
this.cliente = cliente;
}
<...>