drop-down-menu - 在 Struts2 的模型驱动操作类中使用下拉列表

标签 drop-down-menu struts2 model-driven

我正在填充 <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 。这些表之间存在一对多的关系。

我们怎样才能有一个模型驱动的 Action 类来实现 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这里。如果需要,可以使用 here .

最佳答案

您需要一个转换器将 transporterId 转换为 Transporter 对象。事情是这样的:

package com.converter;

public class TransporterConverter extends StrutsTypeConverter {

    @Override
    public Object convertFromString(Map map, String[] strings, Class type) {

        String value = strings[0]; // The value of transporterId submitted from the jsp

        if (value != null && value.length() > 0) {
            try {
                Long longVal = Long.valueOf(value);
                //Integer intVal = Integer.valueOf(value);
                if (type == Transporter.class) {
                    Transporter data = find_transporter_from_the_back_by_transporter_id_using_longVal;
                    return data;
                }
            } catch (Exception ex) {}
        }
        return null;
    }

    @Override
    public String convertToString(Map map, Object o) {

        if ((o instanceof Transporter)) {
            Transporter data = (Transporter) o;
            //return the id of the Transporter Object
        }
        return null;
    }
}

接下来要做的是将此类映射到名为 xwork-conversion.properties 的文件中。该文件必须位于您的类路径中,即 classes 目录中。在xwork-conversion.properties

中输入以下条目
package_of_transporter_class.Transporter=com.converter.TransporterConverter

我还没有测试过,但我认为它应该有效。

如果您需要有关类型转换器如何工作的更多信息,请关注 this url .

关于drop-down-menu - 在 Struts2 的模型驱动操作类中使用下拉列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20947872/

相关文章:

php - 如何通过带有嵌套集模型的 php <ul> <li> 标签自动创建菜单

javascript - 如何根据动态下拉菜单选择显示YouTube视频?

javascript - HTML 中的无效字符阻止我的菜单切换?

java - Struts 2 中的全局异常处理

java - 多个提交按钮安全风险

java - 定义一个类的不同方法使用的变量和类的最有效方法是什么?

css - 样式子菜单 CSS

java - 使用 JSP 页面映射列表并在 Action 类中获取值。它将结果列表作为 Action 类中的笛卡尔积

java - 如何在struts2表单中使用搜索和保存按钮?

java - 使用 JSP 时如何使用 Struts 2 ModelDriven 接口(interface)访问 POJO 中的属性?