2011-12-23 115 views
1

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

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

TestAction它扩展了抽象类TestParent。

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

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

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

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

谢谢。

+0

你可以显示两个动作?请更新您的帖子,并附上行动代码 – 2011-12-23 12:48:16

+0

我已经添加了两项操作。请帮忙 – Megna 2011-12-27 05:15:18

回答

1

当谈到Struts2时,我认为这是一种错误配置,因为我已经多次遇到他的问题,每次我通常忘记为必要的数据创建获取者,或者没有让他们上市。我也总是使用一个名为ActionHelper的抽象类来扩展ActionSupport并为拦截器实现所有必要的接口。

1)

请确保您的干将这个样子,并扩展抽象类的类没有被重载:

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

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

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

2)

我的同事与电网的工作,我知道他有问题,得到的数据,因为它使一个AJAX调用另一个操作,返回被显示必要的数据。请确保将sj:grid配置为使用正确的操作,并返回正确的数据。

3.)

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

4)

如果不解决这个问题(这我真的不指望),请贴在这里所涉及的所有代码,然后我们可以帮助你。

0

这里是代码。我已经将TestParent从抽象类改为普通类。现在执行方法写在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> 
+0

你做了什么就做了一个'TestParent' POJO.I没有看到有任何'TestParent'的使用。对于你的动作正在做什么POJO进行分类并不好,并且可以在你的动作类中启动POJO 。 – 2011-12-27 06:15:45

+0

那么我有它的执行方法和一些抽象方法,因为它是一个抽象类,它甚至没有工作。 – Megna 2011-12-29 05:50:40