Struts动作继承

时间:2011-12-23 10:57:53

标签: struts2

我是struts 2的新手。我对struts动作类的继承有疑问。

对于我正在使用struts2-jquery插件的应用程序来使用jquery网格标记。我有一个名为

的简单struts动作类
  

TestAction,它扩展了抽象类TestParent。

     

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:1)

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

1。)

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

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

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

请确保返回正确的结果。

2。)

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

3。)

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

4。)

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

答案 1 :(得分:0)

这是代码。我已将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>