index.jsp
<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/css/ext-all.css" type="text/css"></link>
<script type="text/javascript" src="${pageContext.request.contextPath }/resources/ext-base.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/resources/ext-all.js"></script>
<script type="text/javascript" src="${pageContext.request.contextPath }/resources/ext-lang-zh_CN.js" charset="utf-8"></script>
<SCRIPT type="text/javascript" src="${pageContext.request.contextPath }/index.js"></SCRIPT>
</head>
<body>
<div id="topic-grid" align="center"></div>
</body>
index.js
Ext.onReady(function() {
Ext.QuickTips.init();
Ext.BLANK_IMAGE_URL = './resources/images/default/s.gif';
var status; //区分是update(status=1)还是insert(status=0)
var reader = new Ext.data.JsonReader({
root : "list",
totalProperty : 'totalCount',
fields : [ 'levelid', 'levelname', 'description']
});
var proxy = new Ext.data.HttpProxy({
url :"good!findAll.action"
});
var store = new Ext.data.Store({
reader : reader, // 读取数据源用json方法(三种方法1.读取json用JsonReader,2读取数组使用ArrayReader3.读取XML用XmlReader)
proxy : proxy
});
var renderer_date = function(value) { //对日期字段进行转换显示,否则将显示[object , object]
var _value;
if(Ext.isEmpty(value)) return "";
else if(Ext.isEmpty(value.time)) _value = new Date(value);
else _value = new Date(value.time); return _value.format("Y-m-d H:i:s");
};
var cm = new Ext.grid.ColumnModel([
new Ext.grid.RowNumberer({header : "编号",width : 60}),
{header : "名称", dataIndex : 'levelname', width : 150, align:"center" ,locked : false},
// {header : "日期", dataIndex : 'description',align:"center",width : 400,renderer : renderer_date}
{header : "描述", dataIndex : 'description',align:"center",width : 400}
]);
cm.defaultSortable = true;
var combobox = new Ext.form.ComboBox({ // 定义一个智能感应的ComboBox,放在tbar里
id : 'cmbox',
title : '名称',
store : store,
mode : "local", // 从本地加载数据(智能感应效果)
displayField : 'levelname', // 显示字段类似DropDownlist中的DataTextField
valueField : 'levelname', // 类似DropDownlist中的DataValueField
width : 160,
shadow:"frame",
allowBlank : false, // 不允许为空
emptyText : '输入名称进行搜索', // 默认值
blankText : '请输入名称' // 当为空的时候提示
});
var grid = new Ext.grid.GridPanel({
collapsible : true, // 是否可以展开
id : 'grid_id',
renderTo : "topic-grid",
title : 'GridPanel',
width : 700,
height : 500,
store : store,
cm : cm,
loadMask : {
msg : '加载数据中,请等待......'
},
stripeRows:true,//stripeRows : Boolean 是否显示行的分隔符
tbar : [{
text : "编辑",
cls : 'x-btn-text-icon details',
icon : "./resources/images/default/tree/edit.png",
handler :editPanel
},{
text : "添加",
cls : 'x-btn-text-icon details',
icon : "./resources/images/default/tree/add.png",
handler : function() {
Edit_Panel.getForm().reset();
status = 0;
Edit_Window.setTitle("添加编辑");
Edit_Window.show();
}
},{
text : "删除",
cls : 'x-btn-text-icon details',
icon : "./resources/images/default/tree/remove.png",
handler : delRecord
},'-',
combobox,'-',{ // 定义一个搜索框
xtype : 'button',
cls : 'x-btn-text-icon details',
icon : "./resources/images/default/tree/search.png",
text : "查找",
handler : function() {
// Ext.getCmp("searchfield").getValue()得到Textfield的值
// 过滤条件为角色名称(RoleName)来搜索匹配的信息,
// filter方法第一个参数:过滤的字段名称,第二个参数要匹配的信息,
// 第三个参数true表示从开始位置开始搜索,第四个参数false表示不区分大小写
store.filter('levelname',Ext.getCmp("combobox").getValue(), false, false);
}
}
],
bbar : new Ext.PagingToolbar({// 自带分页工具条
pageSize : 10,
store : store,
displayInfo : true,
displayMsg : '显示 {0}-{1}条 / 共 {2} 条',
emptyMsg : "没有数据"
})
});
store.load({params:{start:0,limit:10}});
function editPanel() { //var editPanel = function(){} 此格式亦可,但handler : editPanel 无效,所以写成function editPanel(){}
Edit_Panel.getForm().reset(); // 重置编辑模板.也就是将form里面的值reset掉,you know?
rows = Ext.getCmp("grid_id").getSelectionModel().getSelections();
if (rows.length != 1) {
Ext.MessageBox.alert("提示", "请你选择一行数据进行操作!");
return;
}
Edit_Window.setTitle("修改编辑");
status = 1;
Edit_Window.show(); // 打开窗体
Edit_Panel.getForm().findField('levelid').setValue(rows[0].get('levelid')); // 将选中项的信息绑定到TextField中
Edit_Panel.getForm().findField('levelname').setValue(rows[0].get('levelname'));
Edit_Panel.getForm().findField('description').setValue(rows[0].get('description'));
};
grid.on("rowdblclick",function (){ //GirdPanel 双击事件
editPanel();
});
var Edit_Panel = new Ext.form.FormPanel({ // 编辑panel,用于添加,修改
labelWidth : 70,
labelAlign:"right",
url : "good!updateLevel.action", //默认url
frame : true,
bodyStyle : 'padding:5px 5px 0',
width : 380,
defaults : {
width : 150
},
defaultType : 'textfield',
items : [
{ fieldLabel : '编号 ', name : 'levelid', xtype : "hidden"},
{ fieldLabel : '名称 ', name : 'levelname',
allowBlank : false, blankText : "不允许为空", // 是否允许为空!false不允许 \提示信息
minLength : 2, minLengthText : "姓名最少2个字符"} ,
{ fieldLabel : "描述 ", name : "description"}]
});
var Edit_Window = new Ext.Window({ // 弹出层
collapsible : true, maximizable : true, height : 200, width : 378, modal : true, closeAction : "hide",
layout : 'form', // layout布局方式为form 所谓布局就是指容器组件中子元素的分布,排列组合方式
plain : true, bodyStyle : 'padding:5px;', buttonAlign : 'center', items : Edit_Panel,
buttons : [
{ text : '保存', handler : function (){
submitForm();
Edit_Window.hide();
}
}, {
text : '重置',handler : function() {
Edit_Panel.getForm().reset();
}
},{
text : "关闭", handler : function() {
Edit_Window.hide();
}
} ]
});
function submitForm() {
if(status == 0) {
Edit_Panel.form.submit({
method : "post",
scope : this,
params : "method=add",
success : function (form,action) {
store.reload();
grid.store.reload();
},
failure : function (form,actiion) {
Ext.MessageBox.alert("提示","输入有误,请重新输入");
}
});
} else {
Edit_Panel.form.submit({
method : "post",
scope : this,
params : "method=update",
success : function (form,action) {
store.reload();
grid.store.reload();
},
failure : function (form,actiion) {
Ext.MessageBox.alert("提示","输入有误,请重新输入");
}
});
}
}
function delRecord() { // 删除方法
rows = Ext.getCmp("grid_id").getSelectionModel().getSelections(); // 获取ID为grid_id的控件名称得到当前选中项
if (rows.length == 0) {
Ext.MessageBox.alert("提示", "请至少选择一行你要删除的数据!");
return;
}
Ext.MessageBox.confirm('提示', '确实要删除所选的记录吗?', showResult);
}
function showResult(btn) {
if (btn == 'yes') {
var row = Ext.getCmp("grid_id").getSelectionModel().getSelections();
var ids = "";
for ( var i = 0 ; i < row.length; i++) {
ids = ids+row[i].get("levelid")+",";
}
// 将要删除的信息传递到后台处理,然后重新加载grid
var conn = new Ext.data.Connection();
conn.request({
url : "good!deleteLevel.action",
params : "ids="+ids,
method : 'post',
scope : this,
callback : function(options, success, response) {
if (success) {
store.reload();
grid.store.reload();
} else {
Ext.MessageBox.alert("提示", "所选记录删除失败!");
}
}
});
}
};
});
struts.xml 就不写了,里面就一个
<action name="good" class="action.Action">
</action>
BaseAction.java
Action.java
public class Action extends BaseAction{
private Level level;
private List levels;
public void findAll() throws IOException {
HttpServletResponse resp = ServletActionContext.getResponse();
resp.setContentType("text/html;charset=utf-8"); //设置编码,防止乱码
PrintWriter out =resp .getWriter();
IBaseDAO dao = (BaseDAOImpl)getBean("DAO");
levels = dao.findAll("from Level");
JSONArray array = JSONArray.fromObject(levels);
out.println("{success:true,totalCount : " + levels.size() + ", list:" + array.toString() + "}"); //success:true,为了update,add的提交之后的callback
out.flush();
out.close();
}
public void updateLevel() throws Exception{
HttpServletRequest req = ServletActionContext.getRequest();
HttpServletResponse resp = ServletActionContext.getResponse();
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
model.Level level = new model.Level();
IBaseDAO dao = (BaseDAOImpl)getBean("DAO");
String param = req.getParameter("method");
System.out.println("method : "+param);
if("update".equals(param)) {
level.setLevelid(Long.parseLong( req.getParameter("levelid")));
level.setLevelname(req.getParameter("levelname"));
level.setDescription(req.getParameter("description"));
dao.update(level);
} else if("add".equals(param)) {
level.setLevelname(req.getParameter("levelname"));
level.setDescription(req.getParameter("description"));
dao.insert(level);
}
findAll();
}
public void deleteLevel() {
HttpServletRequest req = ServletActionContext.getRequest();
IBaseDAO dao = (BaseDAOImpl)getBean("DAO");
String ids = req.getParameter("ids");
String id[] = ids.split(",");
for(int i=0;i<id.length;i++) {
Level l = (Level)dao.searchById(Level.class, Long.parseLong(id[i]));
dao.delete(l);
}
}
public Level getLevel() {
return level;
}
public void setLevel(Level level) {
this.level = level;
}
public List getLevels() {
return levels;
}
public void setLevels(List levels) {
this.levels = levels;
}
}
其实真没啥技术含量,不过刚开始弄的时候有点麻烦。传几张图片吧
对了,那个分页好像没用,因为用的是Ext.data.HttpProxy,而Ext.PagingToolbar 好像不支持这个。无语中.........继续想办法吧,
网友们要是有什么好的方法可以发我邮箱(guoxianlong@foxmail.com),一起分享.