【问题标题】:Struts action inheritanceStruts 动作继承
【发布时间】:2012-01-26 18:19:39
【问题描述】:

我是 struts 2 的新手。我有一个关于 struts 动作类继承的问题。

对于一个应用程序,我使用 struts2-jquery 插件来利用 jquery 网格标记。我有一个简单的 struts 动作类,叫做

扩展抽象类TestParent的TestAction。

TestParent 扩展了 ActionSupport,它具有受保护的变量,如 gridmodel、sord、records 等及其 getter 和 setter。它还有execute方法,gridmodel数据通过抽象方法加载,由子类实现。

当 TestAction 扩展 TestParent 时,它实现了抽象方法 getGridData 并从 DB 中获取数据。 TestAction 映射在 struts.xml 中。当我在服务器上运行它时出现问题。网格是空的,但控制台显示了我在 TestParent 的执行方法和 TestAction 的 getGridData 中打印的所有网格数据。 gridmodel 是 Map 对象列表类型。

当我删除继承并在 TestAction 中包含所有网格参数和执行方法时,网格会显示数据。 struts中的java继承有问题吗?

我有许多需要在 jquery 网格中显示的报告。因此我选择了这种方法。我应该采用什么更好的方法。

谢谢。

【问题讨论】:

  • 你能同时显示这两个动作吗?请使用操作代码更新您的帖子
  • 是的,我已经添加了这两个操作。请帮忙

标签: struts2


【解决方案1】:

对于 Struts2,我认为这是一个错误配置,因为我多次遇到他的问题,而且每次我通常都忘记为必要的数据创建 getter,或者没有将它们公开.我也总是使用一个名为 ActionHelper 的抽象类,我在其中扩展 ActionSupport 并为拦截器实现所有必要的接口。

1.)

请确保您的 getter 看起来像这样,并且没有在扩展抽象类的类中被覆盖:

public List<Map> getGridData() {
            ...
    return gridData;
}

我从未尝试在抽象类中定义 execute() 方法,如果这是一个问题,您可以在子类中重写它并返回 super.execute()。

还请确保返回正确的结果。

2.)

我的同事使用网格,我知道他在获取数据时遇到了问题,因为它发出了 AJAX 调用,要求另一个操作返回显示的必要数据。请确保 sj:grid 配置为使用正确的操作,返回正确的数据。

3.)

使用调试器。目前您使用控制台,但只需在子类中的操作中设置断点并调试代码。当你在那里时,你可以看到所有的变量。

4.)

如果这不能解决问题(我真的没想到),请在此处粘贴所有涉及的代码,然后我们可以为您提供帮助。

【讨论】:

    【解决方案2】:

    这里是代码。我已经将 TestParent 从抽象类更改为普通类。现在execute方法写在TestAction中。虽然我运行了这个,但网格并没有被填充,但我看到控制台带有用 getGridData 方法编写的打印语句。

    TestParent.java

     public class TestParent extends ActionSupport{
    
    protected List<Map<String, Object>> gridModel;
    
    protected Integer rows = 0;
    
    protected Integer page = 0;
    
    protected String sord;
    
    protected String sidx;
    
    protected String searchField;
    
    protected String searchString;
    
    protected String searchOper;
    
    protected Integer total = 0;
    
    protected Integer records = 0;
    
    public List<Map<String, Object>> getGridModel() {
        return gridModel;
    }
    
    public void setGridModel(List<Map<String, Object>> gridModel) {
        this.gridModel = gridModel;
    }
    
    public Integer getRows() {
        return rows;
    }
    
    public void setRows(Integer rows) {
        this.rows = rows;
    }
    
    public Integer getPage() {
        return page;
    }
    
    public void setPage(Integer page) {
        this.page = page;
    }
    
    public String getSord() {
        return sord;
    }
    
    public void setSord(String sord) {
        this.sord = sord;
    }
    
    public String getSidx() {
        return sidx;
    }
    
    public void setSidx(String sidx) {
        this.sidx = sidx;
    }
    
    public String getSearchField() {
        return searchField;
    }
    
    public void setSearchField(String searchField) {
        this.searchField = searchField;
    }
    
    public String getSearchString() {
        return searchString;
    }
    
    public void setSearchString(String searchString) {
        this.searchString = searchString;
    }
    
    public String getSearchOper() {
        return searchOper;
    }
    
    public void setSearchOper(String searchOper) {
        this.searchOper = searchOper;
    }
    
    public Integer getTotal() {
        return total;
    }
    
    public void setTotal(Integer total) {
        this.total = total;
    }
    
    public Integer getRecords() {
        return records;
    }
    
    public void setRecords(Integer records) {
        this.records = records;
    }
    
     }
    

    TestAction.java

    public class TestAction extends TestParent{
    @Override
    public String execute(){
    
            int to = (rows * page);
        int from = to - rows;
        gridModel = getGridData();
    
        records = getTotalNumberOfRecords();
    
        //calculate the total pages for the query
        total =(int) Math.ceil((double)records / (double)rows);
    
        return SUCCESS;
    }
    
    
    protected List<Map<String, Object>> getGridData() {
        String sql = "Select * from Sales.Customer";
        List<Map<String, Object>> map =null;
        try {
            map = DBConnect.getResult(sql, DBType.MAIN_DB);
            System.out.println("gridModel data :");
            for(Map<String,Object> m :map){
                System.out.print("Customer_ID : "+m.get("Customer_ID")+" ");
                System.out.println("FirstName : "+m.get("FirstName"));
            }
        } catch (DBException e) {
            System.out.println(e.getMessage());
        }
    
        return map;
    }
    
    protected Integer getTotalNumberOfRecords() {
    
        String sql = "select count(*) as count from Sales.Customer";
        int count = 0;
        try {
            List<Map<String, Object>> map = DBConnect.getResult(sql,
                    DBType.MAIN_DB);
            count = (Integer) map.get(0).get("count");
            System.out.println("no of records : " + count);
        } catch (DBException e) {
            System.out.println(e.getMessage());
        }
        return count;
    }
     }
    

    在 struts.xml 中:

     <action name="testList" class="com.mis.struts.action.TestAction">
            <result name="success" type="json" />
        </action>
    

    test.jsp:

      <%@ taglib prefix="s" uri="/struts-tags"%>
      <%@ taglib prefix="sj" uri="/struts-jquery-tags"%>
      <%@ taglib prefix="sjg" uri="/struts-jquery-grid-tags"%>
    
      <sjg:grid
        id="gridtable"
        caption="Customers"
        dataType="json"
        href="testList"
        pager="true"
        gridModel="gridModel"
        rowList="10,15,20"
        rowNum="15"
        rownumbers="true"
        multiselect="true"     
        viewrecords="true"          
    >
        <sjg:gridColumn name="Customer_ID" index="Customer_ID" title="ID" formatter="integer" sortable="false" hidden="true" />
        <sjg:gridColumn name="FirstName" index="FirstName" title="First Name" sortable="true" search="true"/>
        <sjg:gridColumn name="LastName" index="LastName" title="Last Name" sortable="false"/>
        <sjg:gridColumn name="Address" index="Address" title="Address" sortable="false"/>
        <sjg:gridColumn name="Email" index="Email" title="Email"  sortable="false"/>
    </sjg:grid>
    

    【讨论】:

    • 你所做的是把TestParent 变成了一个 POJO。我看不到 TestParent 的任何用途。声明任何 POJO 是不是不好你正在做什么并且可以初始化你POJO 在你的动作类中。
    • 好吧,我有执行方法和一些抽象方法,因为它是一个抽象类,即使在那时它也不起作用。
    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    相关资源
    最近更新 更多