zoukankan      html  css  js  c++  java
  • 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',
                                 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方法。

  • 相关阅读:
    ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据
    Pod常使用命令
    教你用SingalR实现后台开发程序运行时时检测
    技术博客收藏
    ASP.NET SingalR 点对点聊天实现思路总结
    浅谈对MJRefresh(上)下拉刷新控件的理解
    redis持久化RDB和AOF
    redis的发布和订阅
    Linux下安装Redis
    python开发之virtualenv与virtualenvwrapper
  • 原文地址:https://www.cnblogs.com/csonezp/p/3714790.html
Copyright © 2011-2022 走看看