现在的位置: 首页 > 综合 > 正文

struts2 使用json与extjs进行数据交互

2017年10月15日 ⁄ 综合 ⁄ 共 3798字 ⁄ 字号 评论关闭

首先推荐一个很强大的EXTJS4学习论坛--USPCAT
http://pcat.s23-213.myverydz.com/?fromuid=1585

在默认时,<result>标签的type属性值是“dispatcher”(实际上就是转发,forward)。开发人员可以根据自己的需要指定不同的类型,如redirect、stream等。如下面代码所示:

<result name="save" type="redirect">

/result.jsp

</result>

复习转发与重定向的区别:重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重定向后,request内的对象将无法使用。 怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,浏览器中URL仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择转发。
转发和重定向的区别 不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

而若要在struts2 中使用json,首先要导入

json-lib-2.1.jar

struts2-json-plugin-2.1.8.jar

struts2-junit-plugin-2.1.8.jar

然后

<package name="struts2" extends="json-default">
<action name="getJson" class="com.holley.action.GetJson">
<result name="success" type="json"/>
</action>
</package>

没有jsp跳转页面。注意此时extends="json-default",not extends="struts-default"

struts会将action中所有的field转化为json数据,如:action类中有一个private PageBean p,而PageBean类中有private int totalProperty;private List root;当然所有的field都要设置getter与setter;而在extjs代码中如果我要获取json数据 totalProperty和 root,书写如下:p.totalProperty,p.root;

以下是一个使用EXTJS和struts实现表格分页查询的例子:

EXTJS代码:

Ext.onReady(function(){

var proxy=new Ext.data.HttpProxy({url:"getJson.action"});
//Record 定义记录结果
var Human=Ext.data.Record.create([
{name:"Hid",type:"int",mapping:"hid"},
{name:"Name",type:"string",mapping:"name"},
{name:"Sex",type:"string",mapping:"sex"},
{name:"Education",type:"string",mapping:"edu"},
{name:"Memo",type:"string",mapping:"memo"}
]);
//Reader
var reader = new Ext.data.JsonReader(
{totalProperty:"pageBean.totalProperty",root:"pageBean.root"},
Human);
//Store
var store = new Ext.data.Store({
proxy:proxy,
reader:reader
});
store.load({params:{start:0,limit:6}});
//列模型
var cm=new Ext.grid.ColumnModel([
{header:"ID",width:40,dataIndex:"Hid"},
{header:"姓名",width:80,dataIndex:"Name",tooltip:"您的姓名"},
{header:"性别",width:40,dataIndex:"Sex",align:"center"},
{header:"学历",width:80,dataIndex:"Education",align:"center"},
{id:"memo",header:"备注",dataIndex:"Memo"}
]);
var grid = new Ext.grid.GridPanel({
title:"中国公民",
width:650,
autoHeight:true,
cm:cm,
store:store,
renderTo:"a",//这个要render到jsp页面中某个元素上去
autoExpandColumn:"memo",//自动伸展,占满剩余区域
bbar:
new Ext.PagingToolbar({
store:store,
pageSize:6,
displayInfo:true,
displayMsg:"本页显示第{0}条到第{1}条的记录,一共{2}条",
emptyMsg:"没有记录"
}),
tbar:[{
xtype:"label",
text:"ID"
},{
xtype:"textfield",
id:"id"
},{
xtype:"label",
text:"姓名"
},{
xtype:'numberfield',
id:"name"
},{
xtype:"button",
text:"查询",
handler: query
}]
});
function query() {
store.on('beforeload', function() { //Ext.data.JsonStore读入数据之前的事件,store不需要在写baseParams,因为会覆盖掉. (每次调用都载入此函数,'load'则第一次不调用外,其余都调用).
var id = Ext.getCmp("id");
var name = Ext.getCmp("name");
this.baseParams = {
queryvalue : id.getValue(),
queryvalue2 : name.getValue(),
};
});
store.load({params:{start:0,limit:6}});
}
});

action代码:

public class GetJson extends ActionSupport {
private int totalProperty;
private List<Human> list;
private int start;
private int limit;
private PageBean pageBean;

public PageBean getPageBean() {
return pageBean;
}
public void setPageBean(PageBean pageBean) {
this.pageBean = pageBean;
}
public int getTotalProperty() {
return totalProperty;
}
public void setTotalProperty(int totalProperty) {
this.totalProperty = totalProperty;
}
public List<Human> getList() {
return list;
}
public void setList(List<Human> list) {
this.list = list;
}

public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getLimit() {
return limit;
}
public void setLimit(int limit) {
this.limit = limit;
}
@Override
public String execute() throws Exception {

list = new ArrayList<Human>();
int end = start + limit;
if(end>86)
end=86;
totalProperty=86;
for (int i = start; i <end; i++) {

list.add(new Human(i, "路人甲", "保密", "大学", "测试数据"));
}
pageBean=new PageBean(totalProperty, list);
return SUCCESS;
}
}

抱歉!评论已关闭.