Hibernate3.3.2+Spring2.5.5+Struts2.1.6+Extjs3.0.0 Annotations方式快速开发框架(下)
五、整合Struts2、Extjs
将struts-2.1.6\lib目录下的struts2-codebehind-plugin-2.1.6.jar、struts2-core-2.1.6.jar、struts2-spring-plugin-2.1.6.jar、xwork-2.1.2.jar、ognl-2.6.11.jar、freemarker-2.3.13.jar、commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar复制到项目WebContent\lib下。
另外还需jsonplugin-0.34.jar包,使struts2 action返回json类型。
新建一个entity接口,action层需使用该接口调用实体主键。
package
com.xy.entity;
public interface BaseEntity {
public long getId();
}
修改Demo实体,使其实现BaseEntity接口
public interface BaseEntity {
public long getId();
}
package
com.xy.entity.demo;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import com.xy.entity.BaseEntity;
@Entity
@Table(name = " HSSEA_DEMO " )
public class Demo implements BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = " hssea_demo " )
@TableGenerator(name = " hssea_demo " ,
table = " OBJECT_ID " ,
pkColumnName = " NAME " ,
valueColumnName = " VALUE " ,
pkColumnValue = " HSSEA_DEMO_PK " ,
initialValue = 1 ,
allocationSize = 1
)
@SequenceGenerator(name = " hssea_demo_seq " , sequenceName = " seq_hssea_demo " , allocationSize = 1 )
private long id;
@Column(name = " CODE " )
private String code;
@Column(name = " DESCRIPTION " )
private String description;
public long getId() {
return id;
}
public void setId( long id) {
this .id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this .code = code;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this .description = description;
}
}
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import com.xy.entity.BaseEntity;
@Entity
@Table(name = " HSSEA_DEMO " )
public class Demo implements BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = " hssea_demo " )
@TableGenerator(name = " hssea_demo " ,
table = " OBJECT_ID " ,
pkColumnName = " NAME " ,
valueColumnName = " VALUE " ,
pkColumnValue = " HSSEA_DEMO_PK " ,
initialValue = 1 ,
allocationSize = 1
)
@SequenceGenerator(name = " hssea_demo_seq " , sequenceName = " seq_hssea_demo " , allocationSize = 1 )
private long id;
@Column(name = " CODE " )
private String code;
@Column(name = " DESCRIPTION " )
private String description;
public long getId() {
return id;
}
public void setId( long id) {
this .id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this .code = code;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this .description = description;
}
}
增加struts2与extjs交互抽象类,完成分页、排序、增删改查。
package
com.xy.action;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.log4j.Logger;
import org.apache.struts2.config.ParentPackage;
import org.apache.struts2.config.Result;
import org.apache.struts2.config.Results;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.googlecode.jsonplugin.JSONResult;
import com.opensymphony.xwork2.ActionSupport;
import com.xy.service.BaseServiceForHibernate;
import com.xy.entity.BaseEntity;
/**
* struts2与extjs交互抽象类
* 完成基本增删改查分页等功能,子类继承时只需设置entity中属性的set。
* @author xy
* @date 2009-12-31
* @param <T extends BaseEntity, X extends BaseHibernateDao<T>> entity和service
*/
@Controller
@Scope( " prototype " )
@ParentPackage(value = " json-default " )
@Results({
@Result(name = " success " , value = "" , type = JSONResult. class , params = { " ignoreHierarchy " , " false " })
})
public abstract class Struts2ExtjsBaseAction < T extends BaseEntity, X extends BaseServiceForHibernate < T >> extends ActionSupport{
static Logger logger = Logger.getLogger(Struts2ExtjsBaseAction. class .getName());
private static final long serialVersionUID = 2863769505963567954L ;
// Extjs 使用,成功与否,返回信息
protected boolean success = false ;
protected String message;
// Extjs 使用,分页、排序信息
protected int start;
protected int limit;
protected String sort;
protected String dir;
// Service类
protected X service;
// 返回的数据列表和记录总数
protected List < T > list;
protected int total;
// entity对象,用于提交保存,更新前取个别数据
protected T entity;
// 记录选中记录的id
protected String ids;
/**
* 取列表
*/
public String list() {
logger.debug( " 取数据列表!start: " + this .start + " ,limit: " + this .limit + " ,sort: " + this .sort + " ,dir: " + this .dir);
Set < Criterion > criterionSet = new HashSet < Criterion > ();
Set < Order > orderSet = new HashSet < Order > ();
if ( this .dir.equals( " ASC " )){
orderSet.add(Order.asc( this .sort));
} else {
orderSet.add(Order.desc( this .sort));
}
list = service.query(criterionSet, orderSet, this .start, this .limit);
total = service.totalSize(criterionSet);
success = true ;
return SUCCESS;
}
/**
* 根据ID取数据
*/
public String get() {
logger.debug( " 根据id取数据明细!id: " + entity.getId());
entity = service.get(entity.getId());
success = true ;
return SUCCESS;
}
/**
* 保存
*/
public String save() {
logger.debug( " 保存数据!entity: " + entity);
service.save(entity);
success = true ;
return SUCCESS;
}
/**
* 删除
*/
public String delete() {
logger.debug( " 根据ids删除数据!ids: " + ids);
for (String s : ids.split( " , " )){
service.delete(Long.parseLong(s));
}
success = true ;
return SUCCESS;
}
// 对象T内部信息的读取均在子类中进行
// getter,setter方法
// struts2需get方法将数据转换成json
public List < T > getList() {
return list;
}
public int getTotal() {
return total;
}
public boolean isSuccess() {
return success;
}
public String getMessage() {
return message;
}
// 读取extjs传来的分页和排序信息
public void setStart( int start) {
this .start = start;
}
public void setLimit( int limit) {
this .limit = limit;
}
public void setSort(String sort) {
this .sort = sort;
}
public void setDir(String dir) {
this .dir = dir;
}
// 读取extjs传来的选中记录id
public void setIds(String ids) {
this .ids = ids;
}
public T getEntity() {
return entity;
}
}
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.log4j.Logger;
import org.apache.struts2.config.ParentPackage;
import org.apache.struts2.config.Result;
import org.apache.struts2.config.Results;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.googlecode.jsonplugin.JSONResult;
import com.opensymphony.xwork2.ActionSupport;
import com.xy.service.BaseServiceForHibernate;
import com.xy.entity.BaseEntity;
/**
* struts2与extjs交互抽象类
* 完成基本增删改查分页等功能,子类继承时只需设置entity中属性的set。
* @author xy
* @date 2009-12-31
* @param <T extends BaseEntity, X extends BaseHibernateDao<T>> entity和service
*/
@Controller
@Scope( " prototype " )
@ParentPackage(value = " json-default " )
@Results({
@Result(name = " success " , value = "" , type = JSONResult. class , params = { " ignoreHierarchy " , " false " })
})
public abstract class Struts2ExtjsBaseAction < T extends BaseEntity, X extends BaseServiceForHibernate < T >> extends ActionSupport{
static Logger logger = Logger.getLogger(Struts2ExtjsBaseAction. class .getName());
private static final long serialVersionUID = 2863769505963567954L ;
// Extjs 使用,成功与否,返回信息
protected boolean success = false ;
protected String message;
// Extjs 使用,分页、排序信息
protected int start;
protected int limit;
protected String sort;
protected String dir;
// Service类
protected X service;
// 返回的数据列表和记录总数
protected List < T > list;
protected int total;
// entity对象,用于提交保存,更新前取个别数据
protected T entity;
// 记录选中记录的id
protected String ids;
/**
* 取列表
*/
public String list() {
logger.debug( " 取数据列表!start: " + this .start + " ,limit: " + this .limit + " ,sort: " + this .sort + " ,dir: " + this .dir);
Set < Criterion > criterionSet = new HashSet < Criterion > ();
Set < Order > orderSet = new HashSet < Order > ();
if ( this .dir.equals( " ASC " )){
orderSet.add(Order.asc( this .sort));
} else {
orderSet.add(Order.desc( this .sort));
}
list = service.query(criterionSet, orderSet, this .start, this .limit);
total = service.totalSize(criterionSet);
success = true ;
return SUCCESS;
}
/**
* 根据ID取数据
*/
public String get() {
logger.debug( " 根据id取数据明细!id: " + entity.getId());
entity = service.get(entity.getId());
success = true ;
return SUCCESS;
}
/**
* 保存
*/
public String save() {
logger.debug( " 保存数据!entity: " + entity);
service.save(entity);
success = true ;
return SUCCESS;
}
/**
* 删除
*/
public String delete() {
logger.debug( " 根据ids删除数据!ids: " + ids);
for (String s : ids.split( " , " )){
service.delete(Long.parseLong(s));
}
success = true ;
return SUCCESS;
}
// 对象T内部信息的读取均在子类中进行
// getter,setter方法
// struts2需get方法将数据转换成json
public List < T > getList() {
return list;
}
public int getTotal() {
return total;
}
public boolean isSuccess() {
return success;
}
public String getMessage() {
return message;
}
// 读取extjs传来的分页和排序信息
public void setStart( int start) {
this .start = start;
}
public void setLimit( int limit) {
this .limit = limit;
}
public void setSort(String sort) {
this .sort = sort;
}
public void setDir(String dir) {
this .dir = dir;
}
// 读取extjs传来的选中记录id
public void setIds(String ids) {
this .ids = ids;
}
public T getEntity() {
return entity;
}
}
新增DemoAction类
package
com.xy.action.demo;
import javax.annotation.Resource;
import org.apache.struts2.config.Namespace;
import com.xy.action.Struts2ExtjsBaseAction;
import com.xy.entity.demo.Demo;
import com.xy.service.demo.DemoService;
@Namespace(value = " /demo " )
public class DemoAction extends Struts2ExtjsBaseAction < Demo, DemoService > {
private static final long serialVersionUID = 7796054923782630546L ;
// 注入service
@Resource(name = " demoService " )
public void setDemoService(DemoService demoService){
super .service = demoService;
}
public DemoAction(){
super .entity = new Demo();
}
// entity对象中的set方法
public void setId( long id) {
entity.setId(id);
}
public void setCode(String code) {
entity.setCode(code);
}
public void setDescription(String description) {
entity.setDescription(description);
}
}
import javax.annotation.Resource;
import org.apache.struts2.config.Namespace;
import com.xy.action.Struts2ExtjsBaseAction;
import com.xy.entity.demo.Demo;
import com.xy.service.demo.DemoService;
@Namespace(value = " /demo " )
public class DemoAction extends Struts2ExtjsBaseAction < Demo, DemoService > {
private static final long serialVersionUID = 7796054923782630546L ;
// 注入service
@Resource(name = " demoService " )
public void setDemoService(DemoService demoService){
super .service = demoService;
}
public DemoAction(){
super .entity = new Demo();
}
// entity对象中的set方法
public void setId( long id) {
entity.setId(id);
}
public void setCode(String code) {
entity.setCode(code);
}
public void setDescription(String description) {
entity.setDescription(description);
}
}
在WebContent下新增extjs和demo目录,将ext-3.0.0目录下的ext-all.js和resources整个目录、ext-3.0.0\adapter\ext目录下ext-base.js复制到新建的extjs目录下。
在demo目录下新建list.jsp
<%
@ page language
=
"
java
"
pageEncoding
=
"
UTF-8
"
%>
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=utf-8" />
< title > HSSEADemo </ title >
< link rel ="stylesheet" type ="text/css" href ="../extjs/resources/css/ext-all.css" />
< script type ="text/javascript" src ="../extjs/ext-base.js" ></ script >
< script type ="text/javascript" src ="../extjs/ext-all.js" ></ script >
< script type ="text/javascript" src ="list.js" ></ script >
</ head >
< body bottommargin ="0" leftmargin ="0" rightmargin ="0" topmargin ="0" marginheight ="0" marginwidth ="0" >
< div id ="listWin" ></ div >
< div id ="addDicWin" ></ div >
</ body >
</ html >
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
< html >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=utf-8" />
< title > HSSEADemo </ title >
< link rel ="stylesheet" type ="text/css" href ="../extjs/resources/css/ext-all.css" />
< script type ="text/javascript" src ="../extjs/ext-base.js" ></ script >
< script type ="text/javascript" src ="../extjs/ext-all.js" ></ script >
< script type ="text/javascript" src ="list.js" ></ script >
</ head >
< body bottommargin ="0" leftmargin ="0" rightmargin ="0" topmargin ="0" marginheight ="0" marginwidth ="0" >
< div id ="listWin" ></ div >
< div id ="addDicWin" ></ div >
</ body >
</ html >
在demo目录下新建list.js
Ext.onReady(
function
() {
// 加载快速菜单
Ext.QuickTips.init();
var actionUrl = " demo " ;
// 加载分页数据
var store = new Ext.data.Store({
proxy : new Ext.data.HttpProxy({
url : actionUrl + ' ! list'
}),
reader : new Ext.data.JsonReader({
root : 'list',
totalProperty : 'total',
id : 'id',
fields : ['id','code', 'description']
}),
remoteSort : true
});
// 设置默认的排序字段和升降序
store.setDefaultSort('code', 'asc');
// 设置复选框
var sm = new Ext.grid.CheckboxSelectionModel();
// 设置列
var cm = new Ext.grid.ColumnModel([ new Ext.grid.RowNumberer(),sm,
{header : " 编码 " , width: 120 ,dataIndex : 'code',sortable : true },
{header : " 名称 " , width: 280 ,dataIndex : 'description',sortable : true }
]);
// 默认排序设置为可排序
cm.defaultSortable = true ;
// 创建GridPanel
grid = new Ext.grid.GridPanel({
el : 'listWin',
width : 900 ,
height : 650 ,
title : '演示',
store : store,
cm : cm,
sm : sm,
animCollapse : false ,
trackMouseOver : false ,
loadMask : {
msg : '载入中,请稍候'
},
// 上方工具条
tbar : [{
id : 'addDicButton',
text : '增加',
tooltip : '添加一条记录'
}, ' - ', {
id : 'updateDicButton',
text : '修改',
tooltip : '修改所选择的一条记录'
}, ' - ', {
id : 'deleteDicButton',
text : '删除',
tooltip : '删除所选择的记录'
}],
bbar : new Ext.PagingToolbar({
pageSize : 20 ,
store : store,
displayInfo : true ,
displayMsg : '显示 { 0 } - { 1 } 共 { 2 } 条',
emptyMsg : " 没有数据显示! " ,
beforePageText : " 页码 " ,
afterPageText : " 共 {0} 页 " ,
firstText : " 首页 " ,
lastText : " 末页 " ,
nextText : " 下一页 " ,
prevText : " 上一页 " ,
refreshText : " 刷新 "
})
});
// 加载grid
grid.render();
// 设置分页数据
store.load({
params : {
start : 0 ,
limit : 20
}
});
// 添加
var addDicWin;
var addButton = Ext.get('addDicButton');
addButton.on('click', addButtonClick);
function addButtonClick() {
if ( ! addDicWin) {
addDicWin = new Ext.Window({
el : 'addDicWin',
title : '演示',
layout : 'fit',
width : 450 ,
height : 180 ,
closeAction : 'hide',
plain : true ,
modal : true ,
items : addForm
});
}
addForm.getForm().reset();
addDicWin.show( this );
}
// 添加form
var addForm = new Ext.FormPanel({
frame : true ,
labelAlign : 'right',
waitMsgTarget : true ,
autoScroll : true ,
buttonAlign : 'center',
method : 'POST',
url : actionUrl + ' ! save',
items :[{
xtype: 'textfield',
fieldLabel: '编码',
name: 'code',
allowBlank : false ,
style : 'ime - mode:disabled',
maxLength : 20 ,
width : 50
},{
xtype: 'textfield',
fieldLabel: '描述',
name: 'description',
allowBlank : true ,
maxLength : 100 ,
width : 250
},{
xtype : 'hidden',
name : 'id'
}]
});
// 验证数据并提交
addForm.addButton('提交', function () {
if (addForm.form.isValid()){
addForm.getForm().submit({
waitMsg : '保存数据',
success : function () {
store.reload();
Ext.MessageBox.alert('提示', '提交成功!');
addDicWin.hide();
},
failure : function () {
Ext.MessageBox.alert('提示', '提交失败!');
addDicWin.hide();
}
});
}
});
addForm.addButton('关闭', function () {
addDicWin.hide();
});
// 删除
var deleteButton = Ext.get('deleteDicButton');
deleteButton.on('click', function () {
if (grid.getSelectionModel().getSelections().length > 0 )
Ext.MessageBox.confirm('消息', '确认要删除所选记录 ? ', doDelProc);
else
Ext.MessageBox.alert('警告', '最少需要选择一条记录 ! ');
});
function doDelProc(btn) {
if (btn == 'yes') {
if (grid.getSelectionModel().hasSelection()) {
var ids = '';
var records = grid.getSelectionModel().getSelections();
for ( var i = 0 ; i < records.length; i ++ ) {
if (i == 0 ) {
ids = records[ 0 ].data[ " id " ];
} else {
ids += ',' + records[i].data[ " id " ];
}
}
Ext.Ajax.request({
method : 'POST',
url : actionUrl + ' ! delete ',
params: {ids: ids},
success : function () {
Ext.MessageBox.alert('提示', '数据删除成功!');
store.reload();
},
failure : function () {
Ext.MessageBox.alert('提示', '数据删除失败!');
store.reload();
}
});
}
}
};
// 修改
var updateButton = Ext.get('updateDicButton');
updateButton.on('click', function () {
var records = grid.getSelectionModel().getSelections();
if (records.length > 1 ) {
Ext.MessageBox.alert('提示', '一次不能修改多条记录 ! ');
return ;
} else if (records.length == 0 ) {
Ext.MessageBox.alert('提示', '选择需要修改的一条记录 ! ');
return ;
} else {
Ext.Ajax.request({
method : 'POST',
url : actionUrl + ' ! get',
params: {id: records[ 0 ].id},
success : function (response, options) {
var obj = Ext.decode(response.responseText);
if (Ext.isIE){
document.getElementById( " addDicButton " ).click();
} else {
addButtonClick();
}
addForm.getForm().setValues(obj.entity);
},
failure : function () {
Ext.MessageBox.alert('提示 ', '提取数据失败!');
}
});
}
});
});
// 加载快速菜单
Ext.QuickTips.init();
var actionUrl = " demo " ;
// 加载分页数据
var store = new Ext.data.Store({
proxy : new Ext.data.HttpProxy({
url : actionUrl + ' ! list'
}),
reader : new Ext.data.JsonReader({
root : 'list',
totalProperty : 'total',
id : 'id',
fields : ['id','code', 'description']
}),
remoteSort : true
});
// 设置默认的排序字段和升降序
store.setDefaultSort('code', 'asc');
// 设置复选框
var sm = new Ext.grid.CheckboxSelectionModel();
// 设置列
var cm = new Ext.grid.ColumnModel([ new Ext.grid.RowNumberer(),sm,
{header : " 编码 " , width: 120 ,dataIndex : 'code',sortable : true },
{header : " 名称 " , width: 280 ,dataIndex : 'description',sortable : true }
]);
// 默认排序设置为可排序
cm.defaultSortable = true ;
// 创建GridPanel
grid = new Ext.grid.GridPanel({
el : 'listWin',
width : 900 ,
height : 650 ,
title : '演示',
store : store,
cm : cm,
sm : sm,
animCollapse : false ,
trackMouseOver : false ,
loadMask : {
msg : '载入中,请稍候'
},
// 上方工具条
tbar : [{
id : 'addDicButton',
text : '增加',
tooltip : '添加一条记录'
}, ' - ', {
id : 'updateDicButton',
text : '修改',
tooltip : '修改所选择的一条记录'
}, ' - ', {
id : 'deleteDicButton',
text : '删除',
tooltip : '删除所选择的记录'
}],
bbar : new Ext.PagingToolbar({
pageSize : 20 ,
store : store,
displayInfo : true ,
displayMsg : '显示 { 0 } - { 1 } 共 { 2 } 条',
emptyMsg : " 没有数据显示! " ,
beforePageText : " 页码 " ,
afterPageText : " 共 {0} 页 " ,
firstText : " 首页 " ,
lastText : " 末页 " ,
nextText : " 下一页 " ,
prevText : " 上一页 " ,
refreshText : " 刷新 "
})
});
// 加载grid
grid.render();
// 设置分页数据
store.load({
params : {
start : 0 ,
limit : 20
}
});
// 添加
var addDicWin;
var addButton = Ext.get('addDicButton');
addButton.on('click', addButtonClick);
function addButtonClick() {
if ( ! addDicWin) {
addDicWin = new Ext.Window({
el : 'addDicWin',
title : '演示',
layout : 'fit',
width : 450 ,
height : 180 ,
closeAction : 'hide',
plain : true ,
modal : true ,
items : addForm
});
}
addForm.getForm().reset();
addDicWin.show( this );
}
// 添加form
var addForm = new Ext.FormPanel({
frame : true ,
labelAlign : 'right',
waitMsgTarget : true ,
autoScroll : true ,
buttonAlign : 'center',
method : 'POST',
url : actionUrl + ' ! save',
items :[{
xtype: 'textfield',
fieldLabel: '编码',
name: 'code',
allowBlank : false ,
style : 'ime - mode:disabled',
maxLength : 20 ,
width : 50
},{
xtype: 'textfield',
fieldLabel: '描述',
name: 'description',
allowBlank : true ,
maxLength : 100 ,
width : 250
},{
xtype : 'hidden',
name : 'id'
}]
});
// 验证数据并提交
addForm.addButton('提交', function () {
if (addForm.form.isValid()){
addForm.getForm().submit({
waitMsg : '保存数据',
success : function () {
store.reload();
Ext.MessageBox.alert('提示', '提交成功!');
addDicWin.hide();
},
failure : function () {
Ext.MessageBox.alert('提示', '提交失败!');
addDicWin.hide();
}
});
}
});
addForm.addButton('关闭', function () {
addDicWin.hide();
});
// 删除
var deleteButton = Ext.get('deleteDicButton');
deleteButton.on('click', function () {
if (grid.getSelectionModel().getSelections().length > 0 )
Ext.MessageBox.confirm('消息', '确认要删除所选记录 ? ', doDelProc);
else
Ext.MessageBox.alert('警告', '最少需要选择一条记录 ! ');
});
function doDelProc(btn) {
if (btn == 'yes') {
if (grid.getSelectionModel().hasSelection()) {
var ids = '';
var records = grid.getSelectionModel().getSelections();
for ( var i = 0 ; i < records.length; i ++ ) {
if (i == 0 ) {
ids = records[ 0 ].data[ " id " ];
} else {
ids += ',' + records[i].data[ " id " ];
}
}
Ext.Ajax.request({
method : 'POST',
url : actionUrl + ' ! delete ',
params: {ids: ids},
success : function () {
Ext.MessageBox.alert('提示', '数据删除成功!');
store.reload();
},
failure : function () {
Ext.MessageBox.alert('提示', '数据删除失败!');
store.reload();
}
});
}
}
};
// 修改
var updateButton = Ext.get('updateDicButton');
updateButton.on('click', function () {
var records = grid.getSelectionModel().getSelections();
if (records.length > 1 ) {
Ext.MessageBox.alert('提示', '一次不能修改多条记录 ! ');
return ;
} else if (records.length == 0 ) {
Ext.MessageBox.alert('提示', '选择需要修改的一条记录 ! ');
return ;
} else {
Ext.Ajax.request({
method : 'POST',
url : actionUrl + ' ! get',
params: {id: records[ 0 ].id},
success : function (response, options) {
var obj = Ext.decode(response.responseText);
if (Ext.isIE){
document.getElementById( " addDicButton " ).click();
} else {
addButtonClick();
}
addForm.getForm().setValues(obj.entity);
},
failure : function () {
Ext.MessageBox.alert('提示 ', '提取数据失败!');
}
});
}
});
});
修改web.xml文件
<?
xml version="1.0" encoding="UTF-8"
?>
< web-app xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns ="http://java.sun.com/xml/ns/javaee" xmlns:web ="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation ="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id ="WebApp_ID" version ="2.5" >
< display-name > HSSEADemo </ display-name >
<!-- 修改Spring配置文件的路径 -->
< context-param >
< param-name > contextConfigLocation </ param-name >
< param-value > classpath*:config/applicationContext-*.xml </ param-value >
</ context-param >
<!-- 配置Spring -->
< listener >
< listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class >
</ listener >
<!-- 配置Struts 2.0 -->
< filter >
< filter-name > struts2 </ filter-name >
< filter-class > org.apache.struts2.dispatcher.FilterDispatcher </ filter-class >
< init-param >
< param-name > actionPackages </ param-name >
< param-value > com.xy.action </ param-value >
</ init-param >
</ filter >
< filter-mapping >
< filter-name > struts2 </ filter-name >
< url-pattern > /* </ url-pattern >
</ filter-mapping >
< welcome-file-list >
< welcome-file > index.html </ welcome-file >
</ welcome-file-list >
</ web-app >
< web-app xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns ="http://java.sun.com/xml/ns/javaee" xmlns:web ="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation ="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id ="WebApp_ID" version ="2.5" >
< display-name > HSSEADemo </ display-name >
<!-- 修改Spring配置文件的路径 -->
< context-param >
< param-name > contextConfigLocation </ param-name >
< param-value > classpath*:config/applicationContext-*.xml </ param-value >
</ context-param >
<!-- 配置Spring -->
< listener >
< listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class >
</ listener >
<!-- 配置Struts 2.0 -->
< filter >
< filter-name > struts2 </ filter-name >
< filter-class > org.apache.struts2.dispatcher.FilterDispatcher </ filter-class >
< init-param >
< param-name > actionPackages </ param-name >
< param-value > com.xy.action </ param-value >
</ init-param >
</ filter >
< filter-mapping >
< filter-name > struts2 </ filter-name >
< url-pattern > /* </ url-pattern >
</ filter-mapping >
< welcome-file-list >
< welcome-file > index.html </ welcome-file >
</ welcome-file-list >
</ web-app >
到此完成所有演示代码,右击项目,Run As -> Run on Server,用之前设置的tomcat启动,服务启动后,浏览器http://localhost:8080/HSSEADemo/demo/list.jsp,进行增删改查操作。
最终项目结构如下:
注:日志打印中会报一个如下ERROR,但程序工作一切正常,望知道如何解决这个报错信息的大侠不吝赐教!
2010
-
01
-
09
20
:
14
:
42
,
911
ERROR [com.opensymphony.xwork2.ObjectFactory]
-
<
Unable to set parameter [location] in result of type [com.googlecode.jsonplugin.JSONResult]
>
Caught OgnlException while setting property ' location ' on type ' com.googlecode.jsonplugin.JSONResult ' . - Class: ognl.ObjectPropertyAccessor
File: ObjectPropertyAccessor.java
Method: setProperty
Line: 132 - ognl / ObjectPropertyAccessor.java: 132 : - 1
at com.opensymphony.xwork2.ognl.OgnlUtil.internalSetProperty(OgnlUtil.java: 392 )
at com.opensymphony.xwork2.ognl.OgnlUtil.setProperty(OgnlUtil.java: 143 )
at com.opensymphony.xwork2.ognl.OgnlReflectionProvider.setProperty(OgnlReflectionProvider.java: 91 )
at com.opensymphony.xwork2.ObjectFactory.buildResult(ObjectFactory.java: 221 )
at com.opensymphony.xwork2.DefaultActionInvocation.createResult(DefaultActionInvocation.java: 208 )
at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java: 355 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 265 )
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java: 163 )
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java: 87 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java: 249 )
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java: 68 )
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java: 87 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java: 122 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java: 195 )
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java: 87 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java: 195 )
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java: 87 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java: 148 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java: 93 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java: 235 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java: 89 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java: 128 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java: 104 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java: 267 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java: 126 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java: 138 )
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java: 87 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java: 148 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java: 164 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java: 128 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java: 176 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java: 52 )
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java: 468 )
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java: 395 )
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 235 )
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 206 )
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 233 )
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java: 175 )
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 128 )
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 102 )
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: 109 )
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 263 )
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java: 844 )
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java: 584 )
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java: 447 )
at java.lang.Thread.run(Thread.java: 619 )
Caused by: ognl.NoSuchPropertyException: com.googlecode.jsonplugin.JSONResult.location
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java: 132 )
at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java: 28 )
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java: 1656 )
at ognl.ASTProperty.setValueBody(ASTProperty.java: 101 )
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java: 177 )
at ognl.SimpleNode.setValue(SimpleNode.java: 246 )
at ognl.Ognl.setValue(Ognl.java: 476 )
at com.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java: 192 )
at com.opensymphony.xwork2.ognl.OgnlUtil.internalSetProperty(OgnlUtil.java: 385 )
63 more
Caught OgnlException while setting property ' location ' on type ' com.googlecode.jsonplugin.JSONResult ' . - Class: ognl.ObjectPropertyAccessor
File: ObjectPropertyAccessor.java
Method: setProperty
Line: 132 - ognl / ObjectPropertyAccessor.java: 132 : - 1
at com.opensymphony.xwork2.ognl.OgnlUtil.internalSetProperty(OgnlUtil.java: 392 )
at com.opensymphony.xwork2.ognl.OgnlUtil.setProperty(OgnlUtil.java: 143 )
at com.opensymphony.xwork2.ognl.OgnlReflectionProvider.setProperty(OgnlReflectionProvider.java: 91 )
at com.opensymphony.xwork2.ObjectFactory.buildResult(ObjectFactory.java: 221 )
at com.opensymphony.xwork2.DefaultActionInvocation.createResult(DefaultActionInvocation.java: 208 )
at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java: 355 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 265 )
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java: 163 )
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java: 87 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java: 249 )
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java: 68 )
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java: 87 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java: 122 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java: 195 )
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java: 87 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java: 195 )
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java: 87 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java: 148 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java: 93 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java: 235 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java: 89 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java: 128 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java: 104 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java: 267 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java: 126 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java: 138 )
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java: 87 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java: 148 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java: 164 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java: 128 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java: 176 )
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java: 236 )
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java: 52 )
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java: 468 )
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java: 395 )
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 235 )
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 206 )
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 233 )
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java: 175 )
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 128 )
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 102 )
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: 109 )
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 263 )
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java: 844 )
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java: 584 )
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java: 447 )
at java.lang.Thread.run(Thread.java: 619 )
Caused by: ognl.NoSuchPropertyException: com.googlecode.jsonplugin.JSONResult.location
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java: 132 )
at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java: 28 )
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java: 1656 )
at ognl.ASTProperty.setValueBody(ASTProperty.java: 101 )
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java: 177 )
at ognl.SimpleNode.setValue(SimpleNode.java: 246 )
at ognl.Ognl.setValue(Ognl.java: 476 )
at com.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java: 192 )
at com.opensymphony.xwork2.ognl.OgnlUtil.internalSetProperty(OgnlUtil.java: 385 )
63 more