hibernate+Struts2+jquery easyui 做分页处理时的一些问题

本文解决了一个基于Struts2与Hibernate技术的项目中遇到的分页问题,包括SQL查询优化、Ajax请求调试、jQuery EasyUI配置及JSON数据交互等关键步骤。

合在一起做的时候,问题就多了。
1.

  select
        count(*) as col_0_0_ 
    from
        JBIT.GOODS goods0_

看到上面的sql,马上就会想到,获取所有记录时,面对long型的转换,修改Dao中代码。

Integer.parseInt(session.createQuery(" select count(*) from Goods").uniqueResult().toString())

2.ajax请求时,不报异常,通过浏览器查看状态。
很明显,注意了,看hibernate与struts2有没有配置好,有没有共同的jar包存在,hibernate的xml文件有没有配置。

500 Internal Server Error

3.这个问题是出在jQuery easy ui 上的。看英语,说明rows参数有问题。

Method "setRows" failed for object action.GoodsAction@3c3d683a

先说一下分页的配置。

 $('#dg').datagrid({
            url : 'goods',
            method:'get',
            columns : [ [ {
                field : 'id',
                title : '编号',
                width : 100
            }, {
                field : 'name',
                title : '名称',
                width : 100
            }, {
                field : 'price',
                title : '价格',
                width : 100,
                align : 'center'
            },{
                field : 'opr',
                title : '操作',
                width : 100,
                align : 'center',
                formatter : function(value, row, index) {
                    return "<a href='javascript:oprdata("+
                     row.id +
                    ")'>删除</a>";
                }

            }
             ] ],
            fitColumns : true,//自适应宽度,防止水平滚动
            iconCls:'icon-search',
            striped:true ,//隔行变色
            pagination : true,//显示底部分页栏
            pagePosition : "bottom",    
             $('#dg').datagrid({
            url : 'goods',
            method:'get',
            columns : [ [ {
                field : 'id',
                title : '编号',
                width : 100
            }, {
                field : 'name',
                title : '名称',
                width : 100
            }, {
                field : 'price',
                title : '价格',
                width : 100,
                align : 'center'
            },{
                field : 'opr',
                title : '操作',
                width : 100,
                align : 'center',
                formatter : function(value, row, index) {
                    return "<a href='javascript:oprdata("+
                     row.id +
                    ")'>删除</a>";
                }

            }
             ] ],
            fitColumns : true,//自适应宽度,防止水平滚动
            iconCls:'icon-search',
            striped:true ,//隔行变色
            pagination : true,//显示底部分页栏
            pageNumber : 1,//pagination : true时才生效  
                pageSize:10,//每页显示的记录条数,默认为10 
                //pageSize: defaultPageSize,
                pageList: [10,15,30,45],//可以设置每页记录条数的列表           
                beforePageText: '第',//页数文本框前显示的汉字           
                afterPageText: '页    共 {pages} 页',
                displayMsg: '当前显示 {from} - {to} 条记录   共 {total} 条记录'
            pagePosition : "bottom",                
            rownumbers:true,//行号 
            loadMsg : "玩命加载中",
            singleSelect : true,//只让单选
            frozenColumns:[[
            {field:'ck',checkbox:true} ]], 
            title:"商品订单管理"
        });             
            rownumbers:true,//行号 
            loadMsg : "玩命加载中",
            singleSelect : true,//只让单选
            frozenColumns:[[
            {field:'ck',checkbox:true} ]], 
            title:"商品订单管理"
        }); 

这样配置是不会出现上面的异常,若少了pageList: [10,15,30,45],就可能报了。
当然了,有的人喜欢把分页的那几个单独的提出来:

 var p = $('#dg').datagrid('getPager');
            $(p).pagination({

                pageNumber : 1,//pagination : true时才生效  
                pageSize:10,//每页显示的记录条数,默认为10 
                //pageSize: defaultPageSize,
                pageList: [10,15,30,45],//可以设置每页记录条数的列表           
                beforePageText: '第',//页数文本框前显示的汉字           
                afterPageText: '页    共 {pages} 页',
                displayMsg: '当前显示 {from} - {to} 条记录   共 {total} 条记录'
            });

注意了,这样写,肯定是没问题,但是如果你在pageList: [10,15,30,45],写了pageList: [5,10,15,30,45],那么第一页依旧还是显示的是默认值10条记录。这时你就需要写额外的代码控制只出现5行了。麻烦。
4.Json 数据的struts的配置。

<package name="default" namespace="/"  extends="json-default">
        <action name="goods" class="action.GoodsAction" method="execute">
            <result type="json">
                <param name="root">map</param>
            </result>
        </action>

还有action的写法,也贴出来。

public class GoodsAction extends ActionSupport {


    private int page;
    private int rows;
    private Map<String ,Object> map;


    public int getPage() {
        return page;
    }


    public void setPage(int page) {
        this.page = page;
    }


    public int getRows() {
        return rows;
    }


    public void setRows(int rows) {
        this.rows = rows;
    }
    public Map<String, Object> getMap() {
        return map;
    }


    public void setMap(Map<String, Object> map) {
        this.map = map;
    }


    /**
     * @return
     */
    public String execute() {
        if (page<=0) {
            page=1;
        }   
        map=new HashMap<String, Object>();
        IGoodsBiz biz=new GoodsBizImpl();
        int totalCount=biz.findCount();
        List<Goods> list=biz.findPage(page, rows);
        map.put("total", totalCount);
        map.put("rows", list);
        System.out.println(totalCount);//测试用
        System.out.println(list.size());//测试用

        return SUCCESS;
    }
}

贴一个删除的方法。先设置。

{
                field : 'opr',
                title : '操作',
                width : 100,
                align : 'center',
                formatter : function(value, row, index) {
                    return "<a href='javascript:oprdata("+
                     row.id +
                    ")'>删除</a>";
                }

            }
jquery 方法。ajax请求

function oprdata(id){
if (confirm(“确认删除吗?”)) {
.get(“deleteGoods”, {“id”:id}, function(data){  
                if(data==1){  
                    //刷新数据
(‘#dg’).datagrid(‘reload’);
}
}
)};
“`
不得不提的是,上面的配置分页时,如果你写了method:’get’,在某些时候,比如对数据做了增删改,数据已经修改了,但是页面不刷新,考虑将get换成post,或者直接去掉。亲测有效。
做的时候,一步一个脚印,先分析逻辑,再写代码,项目还是很好写的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值