首页 > 代码库 > ExtJs4 SpringMvc3 实现Grid 分页

ExtJs4 SpringMvc3 实现Grid 分页

新建一个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方法。