`
lzh166
  • 浏览: 298098 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ExtJS列表控件实现CRUD操作

阅读更多

首先这是一个人员与机构信息的管理模块,在这里主要是为了阐述一下利用ExtJS与SSH进行前后台交互的几种方式:

下面我就把页面中所用用到的一些业务逻辑类贴一下:

请求action类:

@Controller("personAction")
@Scope("prototype")
public class PersonAction extends BaseAction implements ModelDriven{

	@Resource
	private PersonManager personManager;
	
	private Person person;
	
	private int orgId;
	
	private int[] ids;
	
	public Object getModel() {
		if(person == null){
			person = new Person();
		}
		return person;
	}

	public void execute(){
		//{"datas":[{id:xx},{name:xx},{...}],"totals":xx}
		toJSON(personManager.searchPersons());
		
	}
	
	public void save() {

		if(person.getId() == null || person.getId() == 0){
			personManager.addPerson(person, orgId);
		}else{
			personManager.updatePerson(person, orgId);
		}
		
		//需要向客户端应答成功或失败
		Map success = new HashMap();
		success.put("success", true);
		//{success:true}
		toJSON(success);
		//return "pub_add_success";
	}	
	public void updateInput() {
		Person p = personManager.findPerson(person.getId());
		
		//Ext表单加载模型
		ExtLoadModel elm = new ExtLoadModel();
		elm.setSuccess(true);
		elm.setData(p);
//		
//		也可以采用Map的方式:
//		Map map = new HashMap();
//		map.put("success",true);
//		map.put("data", p);
		//转换后格式:{success:true,data:{id:xx,name:xxx,sex:xx,address:xx}}
		toJSON(elm);
	}
	public void del() {
		//person!del.action?ids=24&ids=21&
		System.out.println(ids.toString());
		if(ids != null){
			for(int i=0; i<ids.length; i++){
				personManager.delPerson(ids[i]);
			}
		}	
	}
	public int getOrgId() {
		return orgId;
	}
	public void setOrgId(int orgId) {
		this.orgId = orgId;
	}
	public int[] getIds() {
		return ids;
	}
	public void setIds(int[] ids) {
		this.ids = ids;
	}
}

 

下面贴一下在我们action类中所用到一下类:

基类BaseAction

public class BaseAction {
	static{
		//避免对象的解释陷入死循环,添加自己的JsonMapper解释器
		JSONMapper.addHelper(new MyJsonObjectMapper());
	}
	/**
	 * 将一个对象转换为JSON的字符串,并写入HTTP SERVLET OUTPUT STREAM
	 * @param o
	 */
	protected void toJSON(Object o){
		try {
			ServletActionContext.getResponse().setCharacterEncoding("GB18030");
			ServletActionContext.getResponse().setContentType("text/html");
			
			//System.out.println(JSONMapper.toJSON( o ).render(true));
			    
			ServletActionContext.getResponse().getOutputStream().write(
				JSONMapper.toJSON( o ).render(false).getBytes("GB18030")
			);
			
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (MapperException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			//清空
			MyJsonObjectMapper.clean();
		}
	}
}

 

封装数据

/**
 * 封装数据
 * @author Administrator
 *
 */
public class ExtLoadModel {
	private boolean success;
	private Object data;
	
	public boolean isSuccess() {
		return success;
	}
	public void setSuccess(boolean success) {
		this.success = success;
	}
	public Object getData() {
		return data;
	}
	public void setData(Object data) {
		this.data = data;
	}
}

 在基类中用到处理JSON数据的类

/**
 * 在jsonMapper处理之前做一个简单处理
 * 记录已经处理的对象,如果已经处理了。就不在处理否则交给jsonMapper去处理
 * @author Administrator
 *
 */
public class MyJsonObjectMapper extends ObjectMapper {
	public static ThreadLocal dealedObject = new ThreadLocal();
	
	/**
	 * 判断该对象是否已处理
	 * 利用Map中key value来存放记录信息
	 * @param o
	 * @return
	 */
	public static boolean hasDealed(Object o){
		
		Map map = (Map)dealedObject.get();
		
		if(map == null){
			map = new HashMap();
			dealedObject.set(map);//首次放到ThreadLocal中
		}
		//如果处理对象为空则不进行判断,交由父类处理
		if(o == null){
			return true;
		}
		//利用map中key记录处理对象的记录信息
		if(map.containsKey(o.toString())){
			return true;
		}else{
			//向map中添加一个key值,记录此对象
			map.put(o.toString(), null);
			return false;
		}
	}
	/**
	 * 清空ThreadLocal中的数据
	 */
	public static void clean(){
		dealedObject.remove();
	}

	@Override
	public JSONValue toJSON(Object obj) throws MapperException {
		//如果该对象没有处理则交给父类ObjectMapper去处理,完成后返回json格式的对象
		if(!hasDealed(obj)){
			return super.toJSON(obj);
		}
		
		return new JSONObject();
	}
}

 下面就来看看我们js文件:看看是如何与后台进行交互数据的。

Ext.onReady(function(){
	Ext.QuickTips.init(); //显示提示信息
	
    // 相当于一个数据源
    var store = new Ext.data.JsonStore({
		url:"person.action",
		root:"datas",
		totalProperty:"total",
		fields:["id","name","sex","age","address","duty"]
	});
	
	//1将向后台发出一个请求,请求中包含的参数是start和limit(每页显示的行数)
	store.load({params:{start:0,limit:20}});

	//CheckBox选择框
	var sm = new Ext.grid.CheckboxSelectionModel();
	
    //创建表单的窗口
	var createFormWindow = function(){
	
	    var postForm = new Ext.form.FormPanel({
	        baseCls: 'x-plain',
	        defaultType: 'textfield',
	        items: [
				{
					xtype:"hidden",
					name:"id"
				},
				{
					fieldLabel:"姓名",
					name:"name"
				},
				{
					fieldLabel:"性别",
					name:"sex"
				},
				{
					fieldLabel:"年龄",
					name:"age"
				},
				{
					fieldLabel:"职务",
					name:"duty"
				},
				{
					fieldLabel:"电话",
					name:"phone"
				},
				{
					fieldLabel:"地址",
					name:"address"
				}
	        ],
			buttons: [
				{
					xtype:'button',
					text: '保存',
					handler:function(){
						Ext.MessageBox.show({
						   msg: '正在保存,请稍等...',
						   progressText: 'Saving...',
						   width:300,
						   wait:true,
						   waitConfig: {interval:200},
						   icon:'download'
					   });
					   postForm.form.doAction('submit',{//2通过form向后台发出请求
						 url:"person!save.action",
						 method:'post',
						 params:'',
						 success:function(form,action){
							Ext.MessageBox.hide();
							Ext.Msg.alert('恭喜','保存目标成功');
							store.reload();
							postWindow.destroy();
						 },
						 failure:function(){
								Ext.Msg.alert('错误','服务器出现错误请稍后再试!');
						 }
					  });					   
					}
				},
				{
					text: '取消',
					handler:function(){
						postWindow.destroy();
					}
				}
			]	        
	    });
		
		
		//将表单放到一个窗口中,并显示
		var postWindow = new Ext.Window({
			title: "人员信息表单",
			width: 600,
			height:500,
			collapsible:true,
			maximizable:true,
			layout: 'fit',
			plain:true,
			bodyStyle:'padding:5px;',
			modal:true,
			items: postForm
		});
		
		postWindow.show();
		return postForm;
	};	
	
	var tbars = [ //在GridPanel列表界面头部的按钮,包括:添加、删除按钮
    	//添加按钮
    	{
    		text:'添加',
            tooltip:'添加记录',
            handler:createFormWindow
    	},
    	{xtype:'tbseparator'},
    	//删除按钮
    	{
    		text:'删除',
            tooltip:'删除选中的记录',
            handler:function(){
	    	var _record = sm.getSelected();
	    	if(_record){
	        	//提示是否删除数据
	        	Ext.Msg.confirm("是否要删除?","是否要删除这些被选择的数据?",
	        		function(btn){
	        			if(btn == "yes"){
			            	var ss = sm.getSelections();
			            	var delUrl = "person!del.action?";
			            	for(var i=0; i<ss.length; i++){
			            		delUrl = delUrl + "ids=" + ss[i].data.id + "&";
			            		 //ds.remove(ss[i]);
			            	}
			            	//3发出AJAX请求删除相应的数据!
			            	//delUrl=person!del.action?ids=1&ids=2&ids=3&;
	        				Ext.Ajax.request({
	        					url:delUrl,
	        					success:function(){
	    							Ext.Msg.alert("删除信息成功","您已经成功删除信息!");
	        						store.reload();
	        					},
	        					failure:function(){
	        						Ext.Msg.alert('错误','服务器出现错误请稍后再试!');
	        					}
	        				});
	        			}
	        		}
	        	);
	    	}else{
	    		Ext.Msg.alert('删除操作','您必须选择一行数据以便删除!');
	    	}
		}
    	}
    ];		
	

    
    // create the Grid
    var grid = new Ext.grid.GridPanel({
        store: store,
        columns: [
        	sm,
            {header: "序号", width: 50, sortable: true, dataIndex: 'id'},
            {header: "姓名", width: 275, sortable: true,  dataIndex: 'name'},
            {header: "性别", width: 100, sortable: true,  dataIndex: 'sex'},
            {header: "年龄", width: 100, sortable: true,  dataIndex: 'age'},
            {header: "地址", width: 300, sortable: true,  dataIndex: 'address'},            
            {header: "职务", width: 200, sortable: true,  dataIndex: 'duty'}
        ],
        height:350,
        width:900,
        title:'人员数据信息列表',
        sm : sm,
        bbar:new Ext.PagingToolbar({
	        pageSize: 20,
	        store: store,
	        displayInfo: true,
	        displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条',
	        emptyMsg: "没有记录"
	    }),
	    tbar:tbars
    });
    
    grid.on("rowdblclick",function(){
		var _record = sm.getSelected();
		if(_record){
			var postForm = createFormWindow();
			postForm.load({//4加载后台数据另一种方式
		        url : 'person!updateInput.action?id='+_record.get("id"),
		        waitMsg : '正在载入数据...',
		        method:"get",
		        failure : function(e) {
		            Ext.Msg.alert('编辑', '载入失败'+e);
		        }
	        });
		}else{
			Ext.Msg.alert('修改操作','您必须选择一行数据以便修改!');
		}
	});

    grid.render('grid-example');

});

 在我们jsp页面中只需要引入这些js文件即可:

<link rel="stylesheet" type="text/css"
href="ext-3.1.1/resources/css/ext-all.css" />
<script type="text/javascript"
src="ext-3.1.1/adapter/ext/ext-base.js"></script>
<script type="text/javascript"
src="ext-3.1.1/ext-all.js"></script>
<script type="text/javascript" src="index.js"></script>
</head>
<body>
<div id="grid-example"></div>
</body>

 关于分页,我在这里并没有贴出相关代码,因为我在前面也说了。主要是为了看看ExtJS与后台业务逻辑进行交互传递数据的方式过程,在细节方面这里还是有许多需要改进的。下面贴出效果图:



 

  • 大小: 49.7 KB
分享到:
评论
1 楼 jacen 2012-05-23  
请问你都用的是哪些jar包呢,没找到???

相关推荐

    extjs4mvc的crud

    在"extjs4mvc的crud"这个主题中,我们将深入探讨如何使用ExtJS 4的Model-View-Controller(MVC)架构来实现货物处理的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作。 首先,了解MVC模式是...

    ExtJs DataGridView控件实例

    综上所述,"ExtJs DataGridView控件实例"涵盖了ExtJs的Grid组件使用,与AJAX、WCF服务和Linq的集成,以及各种功能的实现,包括分页、排序、提示、以及增删改查操作。这个实例为开发者提供了丰富的参考,帮助他们更好...

    初试extJs,控件

    在给定的代码中,我们可以看到 ExtJs 被用于实现CRUD(Create, Read, Update, Delete)操作,这是数据库管理中的基本操作。CRUD通常涉及到添加新记录、读取现有记录、更新记录和删除记录。在Web应用中,这些操作通常...

    extjs+servlet的增删改操作,绝对能跑起来!!!

    - 在ExtJS中,创建一个数据模型(Model)和Store,以及对应的CRUD操作控件,如表格(Grid)、表单(FormPanel)等。 - Servlet端,编写对应的方法来处理GET、POST、PUT、DELETE请求,例如: ```java protected ...

    extjs和数据库的后台交互

    在ExtJS中,Store和Model结合可以方便地实现这些操作。例如,通过`store.load()`获取数据,`model.save()`保存数据,`store.remove()`删除数据,`store.sync()`同步所有更改到服务器。 6. **分页和过滤**:对于大量...

    ExtJs与.Net结合开发实例

    本实例聚焦于如何利用这两个技术进行协同开发,特别是关注于数据网格(grid)的分页、CRUD操作(创建、读取、更新、删除)以及动态添加数据字段的实现。以下将详细阐述这些知识点。 **1. ExtJS简介** ExtJS是一个...

    Extjs 项目Demo

    总结来说,"Extjs 项目Demo"是一个展示如何使用ExtJS 3.2构建数据驱动的Web应用的例子,涵盖了数据查询分页、CRUD操作、与Webservice的集成以及可能的Oracle数据库操作。这个项目可以作为学习ExtJS的基础,帮助...

    EXTJS net 增删改查示例

    在"EXTJS net 增删改查示例"中,我们将探讨如何使用EXTJS与后端网络接口(通常基于.NET框架)进行数据交互,实现常见的CRUD(Create、Read、Update、Delete)操作。这些基本操作是任何数据库驱动的应用程序的核心...

    extjs做的增删改查

    7. **CRUD操作**:Controller层是实现业务逻辑的地方,包括处理CRUD操作。当用户在Grid或Form中进行操作时,触发相应的事件,Controller接收到事件后调用Store的相应方法,如load、add、remove、update。 8. **远程...

    EXTJS图书管理系统页面(JAVA)

    5. **Ajax**或**Restful API**:EXTJS通过这些方式与Java后端进行数据交换,实现CRUD(创建、读取、更新、删除)操作。 在Java后端,可能会使用Spring Boot或类似的框架来构建RESTful API,提供数据服务。这些API应...

    Django整合Extjs源码

    通过ExtJS的数据API,前端可以直接与Django的后端进行数据交互,实现异步更新和CRUD操作。 为了使项目能够直接运行,开发者可能已经考虑了以下几点: 1. **环境配置**:确保项目所需的Python环境和Django版本已安装...

    extjs+asp.net后台管理系统页面

    4. **数据展示与操作**:ExtJS的组件如GridPanel和FormPanel可以用于数据的展示和编辑,配合ASP.NET的数据访问层,可以实现对数据库的CRUD操作。 5. **异步操作**:使用ExtJS的Ajax和Store组件,可以实现异步加载...

    Inter(extjs 的案例源代码)源代码

    在这个案例中,C#可能用于实现业务逻辑层和数据访问层,负责处理数据操作和业务规则,而ExtJS作为表示层,负责用户界面的展示和用户交互。 4. **C#编程**:C#是.NET框架的主要编程语言,常用于后端开发。案例中C#的...

    基于ExtJS5的后台管理系统案例 - 源码

    在ExtJS5中,可以使用Grid Panel配合Editor Grid插件实现数据的编辑,使用Window或Modal Form进行新建和修改操作,而使用Store与Proxy连接后台服务进行数据的删除。 4. **表格组件(Grid)** Grid是ExtJS5中用于...

    extjs+java+mysql通用后台管理

    在“extjs-java-mysql通用后台”这个项目中,开发者通常会定义一系列RESTful API接口,这些接口由Java Spring处理,EXTJS前端通过AJAX调用这些接口,实现数据的增删改查和页面的动态更新。同时,为了保证系统的安全...

    ext增删查改demo

    在CRUD操作中,Grid Panel常被用来展示数据列表,通过内建的编辑功能实现对数据的修改。 7. Form Panel:Form Panel是EXTJS中用于创建表单的组件,它可以包含各种输入控件,用于用户输入数据。在创建和更新数据的...

    extjs 写的动态加载、增删改查、拖拽Tree (java mysql数据库 已有表结构 eclipse可直接导入)(完整版)

    在这个项目中,我们看到的是使用ExtJS实现的一个动态加载、增删改查和拖拽功能的树形控件(Tree),并与后端Java服务和MySQL数据库进行交互。这个项目适合那些希望学习如何在Web应用中集成高级UI特性的开发者。 ...

    ExtJS GTGrid 简单用户管理

    GTGrid是一种基于ExtJS的网格控件,用于在ExtJS应用程序中实现复杂数据的表格化展示。 在这个示例中,作者首先提到了学习GTGrid的经历,并指出GTGrid的方便性和实用性。随后,作者表示自己正在学习ExtJS,并利用所...

    extjs兼容dwr的代理和DWRTreeLoader

    本主题将深入探讨如何在ExtJS中使用DWR的代理(DWRProxy)以及树结构加载器(DWRTreeLoader),以便于在ExtJS组件,特别是树形控件中有效地利用DWR的功能。 首先,让我们了解DWRProxy。DWRProxy是ExtJS中用于与DWR...

    ASPnet+Extjs+网站通用后台框架

    2. 数据访问层(DAL):使用ADO.NET或Entity Framework等技术,实现对SQL数据库的高效操作,提供数据的CRUD(创建、读取、更新、删除)功能。 3. 业务逻辑层(BLL):在C#中定义业务规则和服务接口,处理复杂的业务...

Global site tag (gtag.js) - Google Analytics