我是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网格中显示。因此我选择了这种方法。我应该采用什么更好的方法。
感谢。
答案 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>