2011-12-23 106 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