新建一个Maven webapp项目,webxml以及spring配置没什么需要注意的,不再赘述。
Maven依赖:(个人习惯,有用没用的都加上。。。)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>zp.test</groupId> <artifactId>extjs</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>extjs Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.7.4</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.2.3.Final</version> </dependency> <dependency> <groupId>commons-pool</groupId> <artifactId>commons-pool</artifactId> <version>1.6</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>commons-pool</groupId> <artifactId>commons-pool</artifactId> <version>1.6</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>3.1</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>javaee</groupId> <artifactId>javaee-api</artifactId> <version>5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.18</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-lgpl</artifactId> <version>1.9.6</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.4</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.5</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-lgpl</artifactId> <version>1.9.6</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>1.7.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> <finalName>extjs</finalName> </build> </project>
先从Extjs开始吧。
用Sencha Architect在项目的部署路径(webapp)中建立一个extjs4项目,我这里是webapp/grid。
可以参考:
http://blog.csdn.net/ibcve/article/details/8498768
http://blog.csdn.net/yunji3344/article/details/8521791
项目首页创建grid用的的js代码:
Ext.define('MyApp.view.MyViewport', { extend: 'Ext.container.Viewport', initComponent: function() { var me = this; Ext.applyIf(me, { items: [ { xtype: 'gridpanel', height: 327, id: 'mygrid', title: 'My Grid Panel', store:'persionStore'
, columns: [ { xtype: 'gridcolumn', dataIndex: 'id', text: 'ID' }, { xtype: 'gridcolumn', dataIndex: 'name', text: 'MyColumn1' }, { xtype: 'gridcolumn', dataIndex: 'coursename', text: 'MyColumn2' } ], dockedItems: [ { xtype: 'pagingtoolbar', dock: 'bottom', width: 360, displayInfo: true, store:'persionStore'
} ] }, { xtype: 'textareafield', height: 33, fieldLabel: '关键字', labelWidth: 60 }, { xtype: 'button', id: 'btnfind', text: '查找' }, { xtype: 'button', id: 'btndelete', text: '删除' }, { xtype: 'button', id: 'btnadd', text: '添加' } ] }); me.callParent(arguments); } });
model:
Ext.define('MyApp.model.persionModel', { extend: 'Ext.data.Model', fields: [ { name: 'id' }, { name: 'name' }, { name: 'coursename' } ] });
store:
Ext.define('MyApp.store.persionStore', { extend: 'Ext.data.Store', requires: [ 'MyApp.model.persionModel' ], constructor: function(cfg) { var me = this; cfg = cfg || {}; me.callParent([Ext.apply({ autoLoad: true, autoSync: true, model: 'MyApp.model.persionModel', storeId: 'MyStore', pageSize:5
, proxy: { type: 'ajax', url:'../persionpage.do'
,
reader: {
type:
'json'
,
root:
'items'
,
totalProperty:
'totalCount'
}
}
}, cfg)]);
}
});
pageSize:每页数据的数量
url:springMvc中controller的映射地址
type:设置数据源格式为json
root:要填充进表格的数据的json属性名
totalProperty:总条数的json属性名
Grid的填充原理就是根据Stor中的url获取json数据,再提取json中的值填充grid。
Extjs部分完成,下面来看后台
建立好项目的entity(要和extjs的model对应,名称什么的都是写着玩的。。。)
package zp.test.json; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import org.springframework.stereotype.Repository; @Repository @Entity @Table(name="persion") public class Persion { int id; String coursename; String name; @Id @Column(name="id") @GeneratedValue(strategy = GenerationType.AUTO) public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCoursename() { return coursename; } public void setCoursename(String coursename) { this.coursename = coursename; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
DAO:
package zp.test.json; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class PersionDao { @Autowired SessionFactory sessionFactory; public Session getSession(){ return sessionFactory.getCurrentSession(); } public List<Persion> findAll(){ String hql=" from Persion"; List<Persion> list=getSession().createQuery(hql).list(); return list; } public void save(Persion persion){ getSession().save(persion); } // public User findByName(String username){ // String hql="from Persion as u where u.username=?"; // Query query=getSession().createQuery(hql); // query.setString(0, username); // User user=(User)query.uniqueResult(); // return user; // } public int count(){ String hql3="select count(*) from Persion as p"; Long res=(Long)getSession().createQuery(hql3).uniqueResult(); int a=res.intValue(); return a; } public List<Persion> findAll(String start,String limit){ String hql2=" from Persion"; Query query=getSession().createQuery(hql2); query.setFirstResult(Integer.parseInt(start)); query.setMaxResults(Integer.parseInt(limit)); return query.list(); } }
Service:
package zp.test.json; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @Service public class PersionService { @Autowired PersionDao persionDao; public List<Persion> getAllPersion(){ List<Persion> list=persionDao.findAll(); return list; } public List<Persion> getAllPersion(String start,String limit){ List<Persion> list=persionDao.findAll(start,limit); return list; } public int getCount(){ return persionDao.count(); } //根据Extjs的请求参数获取分页数据 public String getPagePersionJson(String start,String limit){ List<Persion> list=this.getAllPersion(start, limit); return pageListToJson(list); } /** * 将获取的list数据转换成符合分页数据源格式的json串 * items为extjs store proxy reader中设置的root,填充表格的数据;totalCount为数据总数。 * @param list * @return */ private String pageListToJson(List<Persion> list){ JsonObject object=new JsonObject(); Gson gson=new Gson(); int count=this.getCount(); JsonElement jsonElement=gson.toJsonTree(list); //items为extjs store proxy reader中设置的root,即为数据源;totalCount为数据总数。 object.add("items", jsonElement); object.addProperty("totalCount", count); return object.toString(); } }
Controller:
package zp.test.json; import java.io.IOException; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @Controller public class PersionController { @Autowired PersionService persionService; /** * Extjs分页用的函数。start,limit 均为extjs grid传过来的请求参数。 * @param request * @param response * @return */ @RequestMapping("persionpage") @ResponseBody public String PersionPage(HttpServletRequest request,HttpServletResponse response){ String start=request.getParameter("start"); String limit=request.getParameter("limit"); return persionService.getPagePersionJson(start, limit); } }
controller 中@ResponseBody说明此controller不进行视图跳转,在这里的作用就是将数据库中的数据转换成Extjs需要的Json,让前端grid使用。
这时候就可以看出前面Extjs代码设置的root,totalProperty,url有什么用了。
url就是返回json的controller映射地址,totalProperty为数据总数,root就是纯粹的json格式的数据。
controller返回的不仅仅要有数据,还要有totalProperty。可以看看service中pageListToJson方法。