我正在填充<s:select>
来自数据库。动作类是模型驱动的。
@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value="struts-default")
public final class TestAction extends ActionSupport implements Serializable, ValidationAware, Preparable, ModelDriven<Transporter>
{
@Autowired
private final transient SharableService sharableService=null;
private static final long serialVersionUID = 1L;
private Transporter transporter; //Getter and setter
private Long transporterId; //Getter and setter.
private List<Transporter> transporters; //Getter only.
@Action(value = "Test",
results = {
@Result(name=ActionSupport.SUCCESS, location="Test.jsp"),
@Result(name = ActionSupport.INPUT, location = "Test.jsp")},
interceptorRefs={@InterceptorRef(value="defaultStack", params={"validation.validateAnnotatedMethodOnly", "true", "validation.excludeMethods", "load"})})
public String load() throws Exception
{
return ActionSupport.SUCCESS;
}
@Validations(
requiredFields={@RequiredFieldValidator(fieldName="transporterId", type= ValidatorType.FIELD, key = "transporter.required")})
@Action(value = "testInsert",
results = {
@Result(name=ActionSupport.SUCCESS, location="Test.jsp", params={"namespace", "/admin_side", "actionName", "Test"}),
@Result(name = ActionSupport.INPUT, location = "Test.jsp")},
interceptorRefs={@InterceptorRef(value="defaultStack", params={"validation.validateAnnotatedMethodOnly", "true"})})
public String insert() {
System.out.println("Selected item in the drop box : "+transporterId);
return ActionSupport.SUCCESS;
}
@Override
public void prepare() throws Exception {
transporters=sharableService.getTransporterList();
}
@Override
public Transporter getModel() {
return transporter;
}
}
以下是<s:select>
:
<s:select id="transporterId"
name="transporterId"
list="transporters"
value="transporterId"
listKey="transporterId"
listValue="transporterName"
headerKey="" headerValue="Select"
listTitle="transporterName"/>
这完美地工作。
我需要<s:select>
在另一个实现ModelDriven<ZoneTable>
.
表结构简单,transporter->zone_table->country->state->city
. 这些表之间存在一对多的关系。
我们怎样才能有一个模型驱动的动作类实现ModelDrven<ZoneTable>
,其中Transporter
可以映射到<s:select>
,比如?
@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value="struts-default")
public final class ZoneAction extends ActionSupport implements Serializable, ValidationAware, Preparable, ModelDriven<ZoneTable>
{
@Autowired
private final transient ZoneService zoneService=null;
@Autowired
private final transient SharableService sharableService=null;
private ZoneTable entity=new ZoneTable(); //Getter and setter.
private Long transporterId; //Getter and setter.
private List<Transporter> transporters; //Getter only.
@Override
public ZoneTable getModel() {
return entity;
}
@Override
public void prepare() throws Exception {
transporters=sharableService.getTransporterList();
}
}
这样做是行不通的。它不会transporterId
在提交时设置 的值,因为动作类正在实现ModelDriven<ZoneTable>
而ModelDriven<Transporter>
不像第一种情况。
这可能使用模型驱动的方法吗?
编辑:
ZoneTable.java
public class ZoneTable implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "zone_id", nullable = false)
private Long zoneId;
@Column(name = "zone_name", length = 45)
private String zoneName;
@JoinColumn(name = "transporter_id", referencedColumnName = "transporter_id")
@ManyToOne(fetch = FetchType.LAZY)
private Transporter transporterId;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "zoneTable", fetch = FetchType.LAZY)
private Set<ZoneCharge> zoneChargeSet;
@OneToMany(mappedBy = "zoneId", fetch = FetchType.LAZY)
private Set<Country> countrySet;
//Getters and setters + constructors.
}
Zone.jsp
<s:form namespace="/admin_side" action="Zone" validate="true" id="dataForm" name="dataForm" cssClass="search_form general_form">
<s:label key="label.zone.name" for="zone"/>
<s:textfield id="zoneName" name="zoneName" cssClass="validate[required, maxSize[45], minSize[2]] text-input text"/>
<s:fielderror fieldName="zoneName"/>
<s:label key="label.transporter.name" for="transporterId"/>
<s:select id="transporterId" name="transporterId" list="transporters" value="transporterId" listKey="transporterId" listValue="transporterName" headerKey="" headerValue="Select" listTitle="transporterName"/>
<s:fielderror fieldName="transporterId"/>
<s:text name="label.submit"/>
<s:submit id="btnSubmit" name="btnSubmit" value="Submit" action="AddZone"/>
</s:form>
由于这篇文章已经有很多代码,所以我不在ZoneAction.java
这里发布动作类。如果需要,可在此处获得。