BOS项目练习3(修复window控件BUG,添加/修改/作废取派员,datagrid使用,分页查询(DetachedCriteria离线),formatter函数)

本文介绍了一个基于EasyUI的取派员管理系统,包括取派员信息的添加、验证、展示、分页查询、修改及逻辑删除等功能实现,并详细解释了如何使用EasyUI的datagrid组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.    修复window控件bug

 把弹出窗口拖动到浏览器窗口外之后无法再拖动


    将提供的outOfBounds.js文件复制到项目中

    在需要修复的jsp页面引入js文件,可以阻止控件拖出窗口

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <script  
  2.      src="${pageContext.request.contextPath }/js/easyui/outOfBounds.js"   
  3.      type="text/javascript"></script>  


2.    基础设置部分需求分析

基础设置部分需求对应需求规格说明书的2.6章节

2.1   基础档案设置 

*本模块通常有个通俗的说法“数据字典”。

*作用:为其他模块提供数据

2.2   收派标准

2.3   班车设置

2.4   取派员设置

2.5   区域设置

区域是指由国家划分的行政区域。 

2.6   分区管理

区域是由国家划分的,往往范围很大,大小不规则。不便于直接进行物流分配,需要对区域进行细分----分区。

2.7   定区管理

定区是进行物流分配的基本单位。定区将客户信息、分区信息、取派员信息进行关联,为自动分单提供基础数据的。

2.8   收派时间管理

 

3.    根据基础设置部分pdm生成sql文件

 

4.    实现取派员添加功能

第一步:在staff.jsp页面扩展validatebox的校验规则,对手机号进行校验

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <script type="text/javascript">  
  2.     $(function(){  
  3.         var regex = /^1[3|4|5|7|8|][0-9]{9}$/;  
  4.         //扩展对手机号进行校验规则  
  5.         $.extend($.fn.validatebox.defaults.rules, {   
  6.             phoneNumber: {   
  7.                 validator: function(value,param){   
  8.                     return regex.test(value);   
  9.                 },   
  10.                 message: '手机号输入有误!'   
  11.       
  12.                 }   
  13.             });   
  14.     });  
  15. </script>  

第二步:为手机号输入框应用规则

 data-options="validType:'phoneNumber'"

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <tr>  
  2.     <td>手机</td>  
  3.     <td><input type="text"   
  4.         data-options="validType:'phoneNumber'"   
  5.         name="telephone" class="easyui-validatebox" required="true"/></td>  
  6. </tr>  

第三步:为添加窗口中“保存”按钮绑定事件,进行表单校验,如果校验通过提交表单

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <a id="edit" icon="icon-save" href="#" class="easyui-linkbutton" plain="true" >保存</a>  
  2. <script type="text/javascript">  
  3.     //为保存按钮绑定事件  
  4.     $("#edit").click(function(){  
  5.         //表单校验  
  6.         var v = $("#editStaffForm").form("validate");  
  7.         if(v){  
  8.             //校验通过 ,提交表单  
  9.             $("#editStaffForm").submit();  
  10.         }  
  11.     });  
  12. </script>  

第四步:在服务器端创建Action、Service、Dao

Action:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 取派员操作Action 
  3.  */  
  4. @Controller  
  5. @Scope("prototype")  
  6. public class StaffAction extends BaseAction<Staff>{  
  7.     @Resource  
  8.     private IStaffService staffService;  
  9.       
  10.     /** 
  11.      * 添加取派员 
  12.      */  
  13.     public String add(){  
  14.         staffService.save(model);  
  15.         return "list";  
  16.     }  
  17.     public void setPage(int page) {  
  18.         this.page = page;  
  19.     }  
  20.   
  21.     public void setRows(int rows) {  
  22.         this.rows = rows;  
  23.     }  

save 方法base中已存在 传递model进行添加即可

5.    Easyui中datagrid数据表格使用方法

5.1   对应html代码渲染为datagrid样式

 

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <h2>方式一:将静态html代码渲染为datagrid</h2>  
  2. <table class="easyui-datagrid">  
  3.     <thead>  
  4.         <tr>  
  5.             <th data-options="field:'id'">编号</th>  
  6.             <th data-options="field:'name'">姓名</th>  
  7.             <th data-options="field:'age'">年龄</th>  
  8.         </tr>  
  9.     </thead>  
  10.     <tbody>  
  11.         <tr>  
  12.             <td>1</td>  
  13.             <td>xiaoming</td>  
  14.             <td>88</td>  
  15.         </tr>  
  16.         <tr>  
  17.             <td>2</td>  
  18.             <td>laowang</td>  
  19.             <td>3</td>  
  20.         </tr>  
  21.     </tbody>  
  22. </table>  

5.2   发送ajax请求获取datagrid中的数据

json文件 

{

       "total":200,

       "rows":[

                     {"id":"1","name":"张三","age":"10"},

                     {"id":"2","name":"李四","age":"20"},

                     {"id":"3","name":"王五","age":"30"}

              ]

}

Datagrid中,如果指定了url,执行过程

1、  加载jsp页面

2、  发送ajax请求,获取json数据

3、  将json数据显示在表格中

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <h2>方式二:加载远程数据</h2>  
  2. <table class="easyui-datagrid"  
  3.  data-options="url:'${pageContext.request.contextPath }/json/data.json'">  
  4.     <thead>  
  5.         <tr>  
  6.             <th data-options="field:'id'">编号</th>  
  7.             <th data-options="field:'name'">姓名</th>  
  8.             <th data-options="field:'age'">年龄</th>  
  9.         </tr>  
  10.     </thead>  
  11. </table>  

5.3   通过js代码动态创建datagrid


[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <h2>方式三:使用js代码创建datagrid</h2>  
  2. <script type="text/javascript">  
  3.     $(function(){  
  4.         //将页面上的table元素展示为datagrid  
  5.         $("#grid").datagrid({  
  6.             //设置数据表格的属性  
  7.             columns:[[  
  8.                       {field:'id',title:'编号',checkbox:true},//每个json代表一列  
  9.                       {field:'name',title:'姓名'},  
  10.                       {field:'age',title:'年龄'}  
  11.                       ]],  
  12.              url:'${pageContext.request.contextPath }/json/data.json',  
  13.              rownumbers:true,  
  14.              singleSelect:true,  
  15.              pagination:true,//显示分页条  
  16.              toolbar:[  
  17.                       {text:'添加',iconCls:'icon-add',handler:function(){  
  18.                           alert("add");  
  19.                       }}  
  20.                       ]//工具栏  
  21.         });  
  22.     });  
  23. </script>  
  24. <table id="grid">  
  25. </table>  

6.    取派员分页查询---基于datagrid实现

第一步:修改staff.jsp页面中datagrid的url属性,访问Action,进行分页查询

url : "staffAction_pageQuery"

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 取派员信息表格  
  2. $('#grid').datagrid( {  
  3.     iconCls : 'icon-forward',  
  4.     fit : true,  
  5.     border : false,  
  6.     rownumbers : true,  
  7.     striped : true,  
  8.     pageList: [30,50,100],//每页显示pageSize  
  9.     pagination : true,//开启分页  
  10.     toolbar : toolbar,//上工具栏  
  11.     url : "staffAction_pageQuery",//ajax请求  
  12.     idField : 'id',  
  13.     columns : columns, //var columns变量  
  14.     onDblClickRow : doDblClickRow//双击事件函数  
  15. });  

页面一加载就会发送数据请求


第二步:在StaffAction中提供pageQuery方法进行分页查询,在StaffAction中提供两个属性,page和rows,对应的setter方法接收参数

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private int rows;//当前页码  
  2. private int page;//pageSize 每页记录数  
  3. public void setRows(int rows) {  
  4.     this.rows = rows;  
  5. }  
  6. public void setPage(int page) {  
  7.     this.page = page;  
  8. }  

*Post参数的rows:当前页要展示多少条数据,是数字,对应limit 1,2 的2,pageSize每页显示数据数

*Json数据中的属性rows:要展示的数据,”rows”:[{},{},{}]

第三步:action提供page rows 接收数据 并且抽取PageBean类,封装分页信息

PageBean

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /**  
  2.  * 封装分页信息  
  3.  */  
  4. public class PageBean {  
  5.     private int currentPage;//当前页码  
  6.     private int pageSize;//每页显示的记录数  
  7.     private DetachedCriteria detachedCriteria;//查询条件  
  8.       
  9.     private int total;//总记录数  
  10.     private List rows;//当前页展示的数据集合  

第四步:在BaseDao中提供通用分页查询方法

 投影Projections统计函数


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 通用分页查询方法 
  3.  */  
  4. public void pageQuery(PageBean pageBean) {  
  5.     //查询条件  
  6.     DetachedCriteria detachedCriteria = pageBean.getDetachedCriteria();  
  7.     //指定由hibernate框架发出select count(id) from xxx....  
  8.     detachedCriteria.setProjection(Projections.rowCount());  
  9.     //查询总记录数  
  10.     List<Long> countList = this.getHibernateTemplate().findByCriteria(detachedCriteria);  
  11.     int total = countList.get(0).intValue();  
  12.     pageBean.setTotal(total);  
  13.     //指定由hibernate框架发出select * from xxx...   
  14.     detachedCriteria.setProjection(null);  
  15.     //改变hibernate的映射行为,从表中查询的数据对应包装成pojo对象  
  16.     detachedCriteria.setResultTransformer(DetachedCriteria.ROOT_ENTITY);  
  17.       
  18.     int currentPage = pageBean.getCurrentPage();  
  19.     int pageSize = pageBean.getPageSize();  
  20.       
  21.     int firstResult = (currentPage - 1 ) * pageSize;  
  22.     int maxResults = pageSize;  
  23.       
  24.     List rows = this.getHibernateTemplate().findByCriteria(detachedCriteria, firstResult, maxResults);  
  25.     pageBean.setRows(rows);  
  26. }  

第五步:在StaffAction中调用service分页查询,响应json数据

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 分页查询方法 
  3.  * @throws IOException  
  4.  */  
  5. public String pageQuery() throws IOException{  
  6.     PageBean pageBean = new PageBean();  
  7.     pageBean.setCurrentPage(page);//当前页码  
  8.     pageBean.setPageSize(rows);//每页显示记录数  
  9.     //离线条件查询对象,用于包装查询条件  
  10.     DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Staff.class);  
  11.     //按照取派员的id进行降序  
  12.     detachedCriteria.addOrder(Order.desc("id"));  
  13.     //detachedCriteria.add(Restrictions.like("name", "xiaowang"));  
  14.     pageBean.setDetachedCriteria(detachedCriteria);  
  15.     staffService.pageQuery(pageBean);  
  16.       
  17.     //使用jsonlib将PageBean对象序列化为json数据  
  18.     JsonConfig jsonConfig = new JsonConfig();  
  19.     jsonConfig.setExcludes(new String[]{"currentPage","pageSize","detachedCriteria","decidedzones"});  
  20.     String json = JSONObject.fromObject(pageBean,jsonConfig).toString();  
  21.       
  22.     ServletActionContext.getResponse().setContentType("text/json;charset=UTF-8");  
  23.     ServletActionContext.getResponse().getWriter().print(json);  
  24.     return NONE;  
  25. }  

响应的对应json数据



7.    Formatter函数使用

数据库中存储的数据和页面中要展示的数据不一致时,可以使用formatter转换

如:数据库中存1,页面中展示“有”

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. }, {  
  2.     field : 'haspda',  
  3.     title : '是否有PDA',  
  4.     width : 120,  
  5.     align : 'center',  
  6.     formatter : function(data,row, index){  
  7.         if(data=="1"){  
  8.             return "有";  
  9.         }else{  
  10.             return "无";  
  11.         }  
  12.     } 


8.    取派员作废功能

逻辑删除,将取派员deltag改为1

第一步:调整作废按钮的事件

getSelections   :     返回所有被选中的行,当没有记录被选中的时候将返回一个空数组。

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function doDelete(){  
  2.     //作废功能  
  3.     //获得当前数据表格选中的行  
  4.     var rows = $("#grid").datagrid("getSelections");  
  5.     if(rows.length == 0){  
  6.         //没有选中  
  7.         $.messager.alert("提示信息","请选择要作废的记录!","warning");  
  8.     }else{  
  9.         //选中  
  10.         //获得选中记录的id  
  11.         $.messager.confirm("提示信息","你确定删除当前取派员吗?",function(r){  
  12.             if(r){  
  13.                 var array = new Array();  
  14.                 for(var i=0;i<rows.length;i++){  
  15.                     var id = rows[i].id;  
  16.                     array.push(id);  
  17.                 }  
  18.                 var ids = array.join(",");  
  19.                 window.location.href = "${pageContext.request.contextPath}/staffAction_delete.action?ids=" + ids;  
  20.             }  
  21.         });  
  22.     }  
  23. }  

第二步:在StaffAction中提供delete方法批量作废,提供属性ids接收提交的参数

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public void setIds(String ids) {  
  2.     this.ids = ids;  
  3. }  
  4.   
  5. //属性驱动  
  6. private String ids;  
  7.   
  8. /** 
  9.  * 批量作废功能 
  10.  */  
  11. public String delete(){  
  12.     staffService.deleteBatch(ids);  
  13.     return "list";  
  14. }  

Service代码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public void deleteBatch(String ids) {  
  2.     String[] sIds = ids.split(",");  
  3.     for (String id : sIds) {  
  4.         staffDao.executeUpdate("staff.delete", id);  
  5.     }  
  6. }  

第三步:在Staff.hbm.xml中配置命名查询语句

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <!-- 作废取派员 -->  
  2. <query name="staff.delete">  
  3.     update Staff set deltag = '1' where id = ?  
  4. </query>  

9.    取派员修改信息功能

第一步:提供一个修改取派员信息窗口(复制添加取派员窗口)

第二步:为datagrid绑定双击事件,在事件中打开修改窗口,回显数据

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 取派员信息表格  
  2. $('#grid').datagrid( {  
  3.     iconCls : 'icon-forward',  
  4.     fit : true,  
  5.     border : false,  
  6.     rownumbers : true,  
  7.     striped : true,  
  8.     pageList: [10,30,50,100],  
  9.     pagination : true,  
  10.     toolbar : toolbar,//工具栏  
  11.     url : "${pageContext.request.contextPath}/staffAction_pageQuery.action",  
  12.     idField : 'id',  
  13.     columns : columns,  
  14.     onDblClickRow : doDblClickRow//绑定双击事件  
  15. });  

双击绑定事件

onDblClickRow   :  参数-rowIndex, rowData :

在用户双击一行的时候触发,参数包括:

rowIndex:点击的行的索引值,该索引值从0开始。

rowData:对应于点击行的记录(json对象)。

load装载数据回显

load :参数-data  :读取记录填充到表单中。数据参数可以是一个字符串或一个对象类型,如果是字符串则作为远程URL,否则作为本地记录。

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function doDblClickRow(rowIndex, rowData){  
  2.     //打开修改取派员窗口  
  3.     $('#editStaffWindow').window("open");  
  4.     //将双击行数据显示到修改窗口的表单中  
  5.     //$("input[name=name]").val(rowData.name);  
  6.     $("#editStaffForm").form("load",rowData);  

需要增加一个隐藏input 来提供id,以供查询修改

<input type="hidden" name="id">

 

第三步:在StaffAction中提供edit方法,Service中修改取派员信息

利用hibernate快照机制

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2. public void editStaff(Staff model) {  
  3.     //查询原始数据  
  4.     String id=model.getId();  
  5.     Staff findById = staffDao.findById(id);  
  6.     //利用hibernate快照机制编辑修改相应数据  
  7.     findById.setName(model.getName());  
  8.     findById.setTelephone(model.getTelephone());  
  9.     findById.setStandard(model.getStandard());  
  10.     findById.setStation(model.getStation());  
  11.     findById.setHaspda(model.getHaspda());        
  12. }  

1.    修复window控件bug

 把弹出窗口拖动到浏览器窗口外之后无法再拖动


 

    将提供的outOfBounds.js文件复制到项目中

    在需要修复的jsp页面引入js文件,可以阻止控件拖出窗口

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <script  
  2.      src="${pageContext.request.contextPath }/js/easyui/outOfBounds.js"   
  3.      type="text/javascript"></script>  


2.    基础设置部分需求分析

基础设置部分需求对应需求规格说明书的2.6章节

 

2.1   基础档案设置 

*本模块通常有个通俗的说法“数据字典”。

*作用:为其他模块提供数据

2.2   收派标准

2.3   班车设置

2.4   取派员设置

2.5   区域设置

区域是指由国家划分的行政区域。 

2.6   分区管理

区域是由国家划分的,往往范围很大,大小不规则。不便于直接进行物流分配,需要对区域进行细分----分区。

2.7   定区管理

定区是进行物流分配的基本单位。定区将客户信息、分区信息、取派员信息进行关联,为自动分单提供基础数据的。

2.8   收派时间管理

 

3.    根据基础设置部分pdm生成sql文件

 

4.    实现取派员添加功能


第一步:在staff.jsp页面扩展validatebox的校验规则,对手机号进行校验

 

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <script type="text/javascript">  
  2.     $(function(){  
  3.         var regex = /^1[3|4|5|7|8|][0-9]{9}$/;  
  4.         //扩展对手机号进行校验规则  
  5.         $.extend($.fn.validatebox.defaults.rules, {   
  6.             phoneNumber: {   
  7.                 validator: function(value,param){   
  8.                     return regex.test(value);   
  9.                 },   
  10.                 message: '手机号输入有误!'   
  11.       
  12.                 }   
  13.             });   
  14.     });  
  15. </script>  

第二步:为手机号输入框应用规则

 data-options="validType:'phoneNumber'"

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <tr>  
  2.     <td>手机</td>  
  3.     <td><input type="text"   
  4.         data-options="validType:'phoneNumber'"   
  5.         name="telephone" class="easyui-validatebox" required="true"/></td>  
  6. </tr>  

第三步:为添加窗口中“保存”按钮绑定事件,进行表单校验,如果校验通过提交表单

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <a id="edit" icon="icon-save" href="#" class="easyui-linkbutton" plain="true" >保存</a>  
  2. <script type="text/javascript">  
  3.     //为保存按钮绑定事件  
  4.     $("#edit").click(function(){  
  5.         //表单校验  
  6.         var v = $("#editStaffForm").form("validate");  
  7.         if(v){  
  8.             //校验通过 ,提交表单  
  9.             $("#editStaffForm").submit();  
  10.         }  
  11.     });  
  12. </script>  


第四步:在服务器端创建Action、Service、Dao

Action:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 取派员操作Action 
  3.  */  
  4. @Controller  
  5. @Scope("prototype")  
  6. public class StaffAction extends BaseAction<Staff>{  
  7.     @Resource  
  8.     private IStaffService staffService;  
  9.       
  10.     /** 
  11.      * 添加取派员 
  12.      */  
  13.     public String add(){  
  14.         staffService.save(model);  
  15.         return "list";  
  16.     }  
  17.     public void setPage(int page) {  
  18.         this.page = page;  
  19.     }  
  20.   
  21.     public void setRows(int rows) {  
  22.         this.rows = rows;  
  23.     }  

save 方法base中已存在 传递model进行添加即可


5.    Easyui中datagrid数据表格使用方法

 

5.1   对应html代码渲染为datagrid样式

 

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <h2>方式一:将静态html代码渲染为datagrid</h2>  
  2. <table class="easyui-datagrid">  
  3.     <thead>  
  4.         <tr>  
  5.             <th data-options="field:'id'">编号</th>  
  6.             <th data-options="field:'name'">姓名</th>  
  7.             <th data-options="field:'age'">年龄</th>  
  8.         </tr>  
  9.     </thead>  
  10.     <tbody>  
  11.         <tr>  
  12.             <td>1</td>  
  13.             <td>xiaoming</td>  
  14.             <td>88</td>  
  15.         </tr>  
  16.         <tr>  
  17.             <td>2</td>  
  18.             <td>laowang</td>  
  19.             <td>3</td>  
  20.         </tr>  
  21.     </tbody>  
  22. </table>  


5.2   发送ajax请求获取datagrid中的数据


json文件 

{

       "total":200,

       "rows":[

                     {"id":"1","name":"张三","age":"10"},

                     {"id":"2","name":"李四","age":"20"},

                     {"id":"3","name":"王五","age":"30"}

              ]

}

Datagrid中,如果指定了url,执行过程

1、  加载jsp页面

2、  发送ajax请求,获取json数据

3、  将json数据显示在表格中

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <h2>方式二:加载远程数据</h2>  
  2. <table class="easyui-datagrid"  
  3.  data-options="url:'${pageContext.request.contextPath }/json/data.json'">  
  4.     <thead>  
  5.         <tr>  
  6.             <th data-options="field:'id'">编号</th>  
  7.             <th data-options="field:'name'">姓名</th>  
  8.             <th data-options="field:'age'">年龄</th>  
  9.         </tr>  
  10.     </thead>  
  11. </table>  


5.3   通过js代码动态创建datagrid


[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <h2>方式三:使用js代码创建datagrid</h2>  
  2. <script type="text/javascript">  
  3.     $(function(){  
  4.         //将页面上的table元素展示为datagrid  
  5.         $("#grid").datagrid({  
  6.             //设置数据表格的属性  
  7.             columns:[[  
  8.                       {field:'id',title:'编号',checkbox:true},//每个json代表一列  
  9.                       {field:'name',title:'姓名'},  
  10.                       {field:'age',title:'年龄'}  
  11.                       ]],  
  12.              url:'${pageContext.request.contextPath }/json/data.json',  
  13.              rownumbers:true,  
  14.              singleSelect:true,  
  15.              pagination:true,//显示分页条  
  16.              toolbar:[  
  17.                       {text:'添加',iconCls:'icon-add',handler:function(){  
  18.                           alert("add");  
  19.                       }}  
  20.                       ]//工具栏  
  21.         });  
  22.     });  
  23. </script>  
  24. <table id="grid">  
  25. </table>  


 

6.    取派员分页查询---基于datagrid实现

第一步:修改staff.jsp页面中datagrid的url属性,访问Action,进行分页查询

url : "staffAction_pageQuery"

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 取派员信息表格  
  2. $('#grid').datagrid( {  
  3.     iconCls : 'icon-forward',  
  4.     fit : true,  
  5.     border : false,  
  6.     rownumbers : true,  
  7.     striped : true,  
  8.     pageList: [30,50,100],//每页显示pageSize  
  9.     pagination : true,//开启分页  
  10.     toolbar : toolbar,//上工具栏  
  11.     url : "staffAction_pageQuery",//ajax请求  
  12.     idField : 'id',  
  13.     columns : columns, //var columns变量  
  14.     onDblClickRow : doDblClickRow//双击事件函数  
  15. });  

页面一加载就会发送数据请求



第二步:在StaffAction中提供pageQuery方法进行分页查询,在StaffAction中提供两个属性,page和rows,对应的setter方法接收参数

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private int rows;//当前页码  
  2. private int page;//pageSize 每页记录数  
  3. public void setRows(int rows) {  
  4.     this.rows = rows;  
  5. }  
  6. public void setPage(int page) {  
  7.     this.page = page;  
  8. }  


*Post参数的rows:当前页要展示多少条数据,是数字,对应limit 1,2 的2,pageSize每页显示数据数

*Json数据中的属性rows:要展示的数据,”rows”:[{},{},{}]

 

第三步:action提供page rows 接收数据 并且抽取PageBean类,封装分页信息


PageBean

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /**  
  2.  * 封装分页信息  
  3.  */  
  4. public class PageBean {  
  5.     private int currentPage;//当前页码  
  6.     private int pageSize;//每页显示的记录数  
  7.     private DetachedCriteria detachedCriteria;//查询条件  
  8.       
  9.     private int total;//总记录数  
  10.     private List rows;//当前页展示的数据集合  
  

第四步:在BaseDao中提供通用分页查询方法


 投影Projections统计函数


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 通用分页查询方法 
  3.  */  
  4. public void pageQuery(PageBean pageBean) {  
  5.     //查询条件  
  6.     DetachedCriteria detachedCriteria = pageBean.getDetachedCriteria();  
  7.     //指定由hibernate框架发出select count(id) from xxx....  
  8.     detachedCriteria.setProjection(Projections.rowCount());  
  9.     //查询总记录数  
  10.     List<Long> countList = this.getHibernateTemplate().findByCriteria(detachedCriteria);  
  11.     int total = countList.get(0).intValue();  
  12.     pageBean.setTotal(total);  
  13.     //指定由hibernate框架发出select * from xxx...   
  14.     detachedCriteria.setProjection(null);  
  15.     //改变hibernate的映射行为,从表中查询的数据对应包装成pojo对象  
  16.     detachedCriteria.setResultTransformer(DetachedCriteria.ROOT_ENTITY);  
  17.       
  18.     int currentPage = pageBean.getCurrentPage();  
  19.     int pageSize = pageBean.getPageSize();  
  20.       
  21.     int firstResult = (currentPage - 1 ) * pageSize;  
  22.     int maxResults = pageSize;  
  23.       
  24.     List rows = this.getHibernateTemplate().findByCriteria(detachedCriteria, firstResult, maxResults);  
  25.     pageBean.setRows(rows);  
  26. }  


第五步:在StaffAction中调用service分页查询,响应json数据

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 分页查询方法 
  3.  * @throws IOException  
  4.  */  
  5. public String pageQuery() throws IOException{  
  6.     PageBean pageBean = new PageBean();  
  7.     pageBean.setCurrentPage(page);//当前页码  
  8.     pageBean.setPageSize(rows);//每页显示记录数  
  9.     //离线条件查询对象,用于包装查询条件  
  10.     DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Staff.class);  
  11.     //按照取派员的id进行降序  
  12.     detachedCriteria.addOrder(Order.desc("id"));  
  13.     //detachedCriteria.add(Restrictions.like("name", "xiaowang"));  
  14.     pageBean.setDetachedCriteria(detachedCriteria);  
  15.     staffService.pageQuery(pageBean);  
  16.       
  17.     //使用jsonlib将PageBean对象序列化为json数据  
  18.     JsonConfig jsonConfig = new JsonConfig();  
  19.     jsonConfig.setExcludes(new String[]{"currentPage","pageSize","detachedCriteria","decidedzones"});  
  20.     String json = JSONObject.fromObject(pageBean,jsonConfig).toString();  
  21.       
  22.     ServletActionContext.getResponse().setContentType("text/json;charset=UTF-8");  
  23.     ServletActionContext.getResponse().getWriter().print(json);  
  24.     return NONE;  
  25. }  


响应的对应json数据



7.    Formatter函数使用

数据库中存储的数据和页面中要展示的数据不一致时,可以使用formatter转换

如:数据库中存1,页面中展示“有”

 

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. }, {  
  2.     field : 'haspda',  
  3.     title : '是否有PDA',  
  4.     width : 120,  
  5.     align : 'center',  
  6.     formatter : function(data,row, index){  
  7.         if(data=="1"){  
  8.             return "有";  
  9.         }else{  
  10.             return "无";  
  11.         }  
  12.     }  


 
8.    取派员作废功能

逻辑删除,将取派员deltag改为1

 

第一步:调整作废按钮的事件

getSelections   :     返回所有被选中的行,当没有记录被选中的时候将返回一个空数组。

 

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function doDelete(){  
  2.     //作废功能  
  3.     //获得当前数据表格选中的行  
  4.     var rows = $("#grid").datagrid("getSelections");  
  5.     if(rows.length == 0){  
  6.         //没有选中  
  7.         $.messager.alert("提示信息","请选择要作废的记录!","warning");  
  8.     }else{  
  9.         //选中  
  10.         //获得选中记录的id  
  11.         $.messager.confirm("提示信息","你确定删除当前取派员吗?",function(r){  
  12.             if(r){  
  13.                 var array = new Array();  
  14.                 for(var i=0;i<rows.length;i++){  
  15.                     var id = rows[i].id;  
  16.                     array.push(id);  
  17.                 }  
  18.                 var ids = array.join(",");  
  19.                 window.location.href = "${pageContext.request.contextPath}/staffAction_delete.action?ids=" + ids;  
  20.             }  
  21.         });  
  22.     }  
  23. }  

 

第二步:在StaffAction中提供delete方法批量作废,提供属性ids接收提交的参数

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public void setIds(String ids) {  
  2.     this.ids = ids;  
  3. }  
  4.   
  5. //属性驱动  
  6. private String ids;  
  7.   
  8. /** 
  9.  * 批量作废功能 
  10.  */  
  11. public String delete(){  
  12.     staffService.deleteBatch(ids);  
  13.     return "list";  
  14. }  

 

Service代码:

 

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public void deleteBatch(String ids) {  
  2.     String[] sIds = ids.split(",");  
  3.     for (String id : sIds) {  
  4.         staffDao.executeUpdate("staff.delete", id);  
  5.     }  
  6. }  

第三步:在Staff.hbm.xml中配置命名查询语句

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <!-- 作废取派员 -->  
  2. <query name="staff.delete">  
  3.     update Staff set deltag = '1' where id = ?  
  4. </query>  

9.    取派员修改信息功能

 

第一步:提供一个修改取派员信息窗口(复制添加取派员窗口)

第二步:为datagrid绑定双击事件,在事件中打开修改窗口,回显数据

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 取派员信息表格  
  2. $('#grid').datagrid( {  
  3.     iconCls : 'icon-forward',  
  4.     fit : true,  
  5.     border : false,  
  6.     rownumbers : true,  
  7.     striped : true,  
  8.     pageList: [10,30,50,100],  
  9.     pagination : true,  
  10.     toolbar : toolbar,//工具栏  
  11.     url : "${pageContext.request.contextPath}/staffAction_pageQuery.action",  
  12.     idField : 'id',  
  13.     columns : columns,  
  14.     onDblClickRow : doDblClickRow//绑定双击事件  
  15. });  

双击绑定事件

onDblClickRow   :  参数-rowIndex, rowData :

在用户双击一行的时候触发,参数包括:

rowIndex:点击的行的索引值,该索引值从0开始。

rowData:对应于点击行的记录(json对象)。

 

load装载数据回显

load :参数-data  :读取记录填充到表单中。数据参数可以是一个字符串或一个对象类型,如果是字符串则作为远程URL,否则作为本地记录。

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function doDblClickRow(rowIndex, rowData){  
  2.     //打开修改取派员窗口  
  3.     $('#editStaffWindow').window("open");  
  4.     //将双击行数据显示到修改窗口的表单中  
  5.     //$("input[name=name]").val(rowData.name);  
  6.     $("#editStaffForm").form("load",rowData);  
  7. }  

需要增加一个隐藏input 来提供id,以供查询修改

<input type="hidden" name="id">

 

第三步:在StaffAction中提供edit方法,Service中修改取派员信息

利用hibernate快照机制

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2. public void editStaff(Staff model) {  
  3.     //查询原始数据  
  4.     String id=model.getId();  
  5.     Staff findById = staffDao.findById(id);  
  6.     //利用hibernate快照机制编辑修改相应数据  
  7.     findById.setName(model.getName());  
  8.     findById.setTelephone(model.getTelephone());  
  9.     findById.setStandard(model.getStandard());  
  10.     findById.setStation(model.getStation());  
  11.     findById.setHaspda(model.getHaspda());        
  12. }  


 

BOS 技术整理-02 Oracle 数据库安装配置使用 直接安装 打开服务 并尝试连接数据库 安装远程连接工具 PLSQLDeveloper 安装配置使用 2.在 PLSQL Developer 启动,配置 oracle instanceclient 目录 4、 默认 PLSQL Developer 连接 Oracle 使用客户端字符集 utf-8 , 基于工具使用 SQL 插入中文有乱码问题,设置客户端字符集 gb2312 配置 环境变量 NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK 弹窗了,就表示成功了! 工具补充: Navicat Premium 安装和使用 直接安装 ok jquery easyui 总合 (直接看API文档 后期加上如何使用) Orcale 创建用户 先进入 Orcale 命令行 针对 BOS 系统建立新的用户 创建 bos/bos 账户, 授予角色 connect、resource -- Create the user create user BOS identified by "" default tablespace SYSTEM temporary tablespace TEMP profile DEFAULT password expire; -- Grant/Revoke role privileges grant connect to BOS; grant resource to BOS; -- Grant/Revoke system privileges grant unlimited tablespace to BOS; Spring 环境搭建 IOC 导入 context 依赖 beans、core、expression AOP 导入 测试集成 Web 集成 配置监听器 整合持久层框架 hibernate、jpa web.xml 配置 spring 监听器 src/main/resource 下 建立 applicationContext.xml rc/main/resource 提供 config.properties 外部属性文件、log4j.properties 日志配置文件 配置文件如下: applicationContext.xml  struts2 注解 类上 @ParentPackage 包继承谁? extends=”struts-default” @Namespace 包命名空间 namespace=”/” @Actions struts2 的 Action 配置,用于配置多个 Action 方法上 @Action 配置访问路径,和方法绑定 @Result 结果集配置  struts2 和 spring 整合 struts2 的 Action 使用 spring 注解,被 spring 管理 @Controller spring 表现层 bean @Scope 配置 Action 为多例 Spring Data JPA 代替了 Hibernate "CURD " 但是和Hibernate一样 实现DAO(数据)层的功能 "增删改查" Hibernate 实体类 生成表结构 ---- 领域(Domain)驱动建模 这次使用的是驱动建模,传统的设计模式是: 先设计表,再创建实体 JPA 注解使用 @Entity 标明是实体类 @Table 映射表名称 @Id 主键标识 @GeneratedValue 自动生成主键的值 @Column 设置映射数据表中列信息 @Temporal 控制数据表保存日期哪个部分(日期、时间、日期时间) @OneToMany(mappedBy 相当于 inverse ) @ManyToOne 结合 @JoinColumn 添加一列外键 @ManyToMany 一方写 mappedBy 放弃外键维护、另一方 @JoinTable 维护中间表 收派标准修添加能实现 html 请求 后台处理 服务器端Service和DAO编写整合springdatajpa 业务层接口 修改 Action 代码调用 Service 业务层实现类 在applicationContext添加一条 用来整合 Spring Data jpa <jpa:repositories base-package="cn.itcast.bao.dao" /> 注意: 这里的扫描包,必须指定到类的上级包 比如 一个类 com.itStone.bao.dao.test.java 那么它的上级包 就是 com.itStone.bao.dao 根级包是 : 就是 com 只需要编写 DAO 接口,继承 JpaRepository即可 不需要对 DAO 接口做任何实现, 实际上 spring 会调用 SimpleJpaRepository 实现 struts 2 注解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值