[转]Spring3 MVC + jQuery easyUI 做的ajax版本用户管理

时间:2023-06-20 09:56:56

原文地址:http://www.iteye.com/topic/1081739

上周写了篇基于spring3.0.5 mvc 简单用户管理实例http://www.iteye.com/topic/1072244 ) ,反应还不错,本周闲来无事(外面又在下 雨 淹了不少地方啊)就试了一下Spring3 MVC + jQuery easyUI 做的ajax版本用户管理,因为之前做过一个项目是struts2 + jQuery easyUI 做的。对比了一下,发现 Spring3 MVC确实是比struts2方便啊,特别是对ajax的支持上,转换JSON内置了jackson,太方便了。还是先把jar包帖出来吧

[转]Spring3 MVC + jQuery easyUI 做的ajax版本用户管理

还是要先配置web.xml文件,如下:

  1. <listener>
  2. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  3. </listener>
  4. <filter>
  5. <filter-name>Set Character Encoding</filter-name>
  6. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  7. <init-param>
  8. <param-name>encoding</param-name>
  9. <param-value>UTF-8</param-value>
  10. </init-param>
  11. <init-param>
  12. <param-name>forceEncoding</param-name>
  13. <param-value>true</param-value><!-- 强制进行转码 -->
  14. </init-param>
  15. </filter>
  16. <filter-mapping>
  17. <filter-name>Set Character Encoding</filter-name>
  18. <url-pattern>/*</url-pattern>
  19. </filter-mapping>
  20. <!-- 默认所对应的配置文件是WEB-INF下的{servlet-name}-servlet.xml,这里便是:spring3-servlet.xml -->
  21. <servlet>
  22. <servlet-name>spring3</servlet-name>
  23. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  24. <load-on-startup>1</load-on-startup>
  25. </servlet>
  26. <servlet-mapping>
  27. <servlet-name>spring3</servlet-name>
  28. <!-- 这里可以用 / 但不能用 /* ,拦截了所有请求会导致静态资源无法访问,所以要在spring3-servlet.xml中配置mvc:resources -->
  29. <url-pattern>/</url-pattern>
  30. </servlet-mapping>

然后在applicationContext.xml中简单配置一下数据源和sessionFactory还有声明一下事务处理,这个和之前那一版是一样的,如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xmlns:tx="http://www.springframework.org/schema/tx"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  10. http://www.springframework.org/schema/tx
  11. http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
  12. http://www.springframework.org/schema/context
  13. http://www.springframework.org/schema/context/spring-context-3.0.xsd
  14. http://www.springframework.org/schema/aop
  15. http://www.springframework.org/schema/aop/spring-aop-3.0.xsd" default-autowire="byName">
  16. <!-- 注意上面的default-autowire="byName",如果没有这个声明那么HibernateDaoSupport中的sessionFactory不会被注入 -->
  17. <!-- 约定优于配置,约定优于配置 -->
  18. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  19. <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
  20. <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"></property>
  21. <property name="username" value="root"></property>
  22. <property name="password" value="root"></property>
  23. </bean>
  24. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  25. <property name="dataSource" ref="dataSource"/>
  26. <property name="mappingDirectoryLocations">
  27. <list><!-- 这里直接映射的pojo类所在的包,简单方便不用没次加一个pojo类都需要到这里来添加 -->
  28. <value>classpath:com/fsj/spring/model</value>
  29. </list>
  30. </property>
  31. <property name="hibernateProperties">
  32. <props>
  33. <prop key="hibernate.dialect">
  34. org.hibernate.dialect.MySQLDialect
  35. </prop>
  36. <prop key="hibernate.show_sql">
  37. true
  38. </prop>
  39. </props>
  40. </property>
  41. </bean>
  42. <!-- 自动扫描组件,这里要把web下面的 controller去除,他们是在spring3-servlet.xml中配置的,如果不去除会影响事务管理的。-->
  43. <context:component-scan base-package="com.fsj.spring">
  44. <context:exclude-filter type="regex" expression="com.fsj.spring.web.*"/>
  45. </context:component-scan>
  46. <!-- 下面是配置声明式事务管理的,个人感觉比用注解管理事务要简单方便 -->
  47. <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  48. <property name="sessionFactory" ref="sessionFactory"></property>
  49. </bean>
  50. <aop:config>
  51. <aop:advisor pointcut="execution(* com.fsj.spring.service.*Service.*(..))" advice-ref="txAdvice"/>
  52. </aop:config>
  53. <tx:advice id="txAdvice" transaction-manager="txManager">
  54. <tx:attributes>
  55. <tx:method name="get*" read-only="true"/>
  56. <tx:method name="query*" read-only="true"/>
  57. <tx:method name="find*" read-only="true"/>
  58. <tx:method name="load*" read-only="true"/>
  59. <tx:method name="*" rollback-for="Exception"/>
  60. </tx:attributes>
  61. </tx:advice>
  62. </beans>

最后需要配置的就是spring mvc的配置文件spring3-servlet.xml了,这个和非ajax的版本稍微有点不一样,加入了对json数据转换的配置,因为我用的数据传输都是json类型的数据,如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context-3.0.xsd
  11. http://www.springframework.org/schema/mvc
  12. http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd" default-autowire="byName">
  13. <!-- default-autowire="byName",约定优于配置,约定优于配置 -->
  14. <!-- 配置静态资源,直接映射到对应的文件夹,不被DispatcherServlet处理,3.04新增功能,需要重新设置spring-mvc-3.0.xsd -->
  15. <mvc:resources mapping="/img/**" location="/img/"/>
  16. <mvc:resources mapping="/js/**" location="/js/"/>
  17. <mvc:resources mapping="/css/**" location="/css/"/>
  18. <mvc:resources mapping="/html/**" location="/html/"/>
  19. <!--
  20. ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能
  21. -->
  22. <context:component-scan base-package="com.fsj.spring.web" />
  23. <!--
  24. ②:启动Spring MVC的注解功能,完成请求和注解POJO的映射,添加拦截器,类级别的处理器映射
  25. -->
  26. <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  27. <property name="interceptors">
  28. <list>
  29. <bean class="com.fsj.spring.util.MyHandlerInterceptor"/>
  30. </list>
  31. </property>
  32. </bean>
  33. <!--
  34. ②:启动Spring MVC的注解功能,完成请求和注解POJO的映射,
  35. 配置一个基于注解的定制的WebBindingInitializer,解决日期转换问题,方法级别的处理器映射
  36. -->
  37. <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  38. <property name="cacheSeconds" value="0" />
  39. <property name="webBindingInitializer">
  40. <bean class="com.fsj.spring.util.MyWebBinding" />
  41. </property>
  42. <span style="color: #0000ff;"><!-- 配置一下对json数据的转换 -->
  43. <property name="messageConverters">
  44. <list>
  45. <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
  46. </list>
  47. </property></span>
  48. </bean>
  49. <!--
  50. ③:对模型视图名称的解析,即在模型视图名称添加前后缀
  51. InternalResourceViewResolver默认的就是JstlView所以这里就不用配置viewClass了
  52. -->
  53. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  54. <property name="prefix" value="/WEB-INF/view/"></property>
  55. <property name="suffix" value=".jsp"></property>
  56. </bean>
  57. </beans>

主页面用了easyui-layout,简单分为了上、左、中三部分,左边的菜单用的easyui-accordion,中间的主页面没有用iframe,就是一个普通的div就可以完成之前要用的iframe的功能哦,还是帖出来吧:

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@ include file="/taglibs.jsp" %>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4. <html>
  5. <head>
  6. <title>spring3</title>
  7. <meta http-equiv="pragma" content="no-cache">
  8. <meta http-equiv="cache-control" content="no-cache">
  9. <meta http-equiv="expires" content="0">
  10. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  11. <meta http-equiv="description" content="This is my page">
  12. <script type="text/javascript">
  13. jQuery.ajaxSetup({cache:false});//ajax不缓存
  14. jQuery(function($){
  15. });
  16. function setmain(title,href){
  17. $(".combo-panel").parent(".panel").remove(); //<span style="color: #0000ff;">清楚所有class为combo-panel的class为panel的父元素,解决combobox在页面缓存的问题</span>
  18. var centerURL = href;
  19. var centerTitle = title;
  20. $('body').layout('panel','center').panel({
  21. title:"所在位置:"+centerTitle,
  22. href:centerURL
  23. });
  24. $('body').layout('panel','center').panel('refresh');
  25. return false;
  26. }
  27. //弹出窗口
  28. function showWindow(options){
  29. jQuery("#MyPopWindow").window(options);
  30. }
  31. //关闭弹出窗口
  32. function closeWindow(){
  33. $("#MyPopWindow").window('close');
  34. }
  35. </script>
  36. </head>
  37. <!-- easyui-layout 可分上下左右中五部分,中间的是必须的,支持href,这样就可以不用iframe了 -->
  38. <body class="easyui-layout" id="mainBody">
  39. <!-- 上 -->
  40. <div region="north" split="false" style="height:100px;text-align: center;" border="false">
  41. <h1>欢迎: ${userSessionInfo.name}</h1>
  42. </div>
  43. <!-- 左-->
  44. <div region="west" class="menudiv" split="true" title="系统菜单" style="width:200px;overflow:hidden;">
  45. <div id="menuDiv" class="easyui-accordion" fit="false" border="false" animate="false">
  46. <div title="用户管理" style="overflow:hidden;">
  47. <ul>
  48. <li id="rightLi${child.id}" style="cursor: pointer;"
  49. onclick="setmain('用户管理','${ctx}/user/list')" >用户管理</li>
  50. </ul>
  51. <ul>
  52. <li id="rightLi${child.id}" style="cursor: pointer;"
  53. onclick="setmain('用户管理','${ctx}/user/list')" >用户管理</li>
  54. </ul>
  55. <ul>
  56. <li id="rightLi${child.id}" style="cursor: pointer;"
  57. onclick="setmain('用户管理','${ctx}/user/list')" >用户管理</li>
  58. </ul>
  59. </div>
  60. <div title="部门管理" style="overflow:hidden;">
  61. <ul>
  62. <li id="rightLi${child.id}">部门管理</li>
  63. <li id="rightLi${child.id}">部门管理</li>
  64. </ul>
  65. </div>
  66. <div title="XXX管理" style="overflow:hidden;">
  67. <ul>
  68. <li id="rightLi${child.id}">XXX管理</li>
  69. <li id="rightLi${child.id}">XXX管理</li>
  70. </ul>
  71. </div>
  72. <div title="XXX管理" style="overflow:hidden;">
  73. <ul>
  74. <li id="rightLi${child.id}">XXX管理</li>
  75. <li id="rightLi${child.id}">XXX管理</li>
  76. <li id="rightLi${child.id}">XXX管理</li>
  77. </ul>
  78. </div>
  79. </div>
  80. </div>
  81. <!-- 中 -->
  82. <div region="center" class="maindiv" title="所在位置: 首页" style="overflow-x:hidden;padding: 0px;" <span style="color: #ff0000;">href="${ctx}/html/welcome.html"</span>
  83. ></div>
  84. <div id="MyPopWindow" modal="true" shadow="false" minimizable="false" cache="false" maximizable="false" collapsible="false" resizable="false" style="margin: 0px;padding: 0px;overflow: auto;"></div>
  85. </body>
  86. </html>

这样点击用户管理就可以在center层中打开用户列表了,个人感觉效果还不错,比jQuery UI要漂亮一些,用着也很方便。

[转]Spring3 MVC + jQuery easyUI 做的ajax版本用户管理

中间主页面的代码也很简单,用到了jQeury easyUI的datagrid、combogrid等,用法很简单,关键就是json数据,另外还用到了最好用的日期控件My97DatePicker:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <html>
  3. <head>
  4. <script type="text/javascript">
  5. jQuery(function($){
  6. $('#userTable').datagrid({
  7. title:'用户列表', //标题
  8. method:'post',
  9. iconCls:'icon-edit', //图标
  10. singleSelect:false, //多选
  11. height:360, //高度
  12. fitColumns: true, //自动调整各列,用了这个属性,下面各列的宽度值就只是一个比例。
  13. striped: true, //奇偶行颜色不同
  14. collapsible:true,//可折叠
  15. url:"user/queryList", //数据来源
  16. sortName: 'user.id', //排序的列
  17. sortOrder: 'desc', //倒序
  18. remoteSort: true, //服务器端排序
  19. idField:'uid', //主键字段
  20. queryParams:{}, //查询条件
  21. pagination:true, //显示分页
  22. rownumbers:true, //显示行号
  23. columns:[[
  24. {field:'ck',checkbox:true,width:2}, //显示复选框
  25. {field:'user.name',title:'名字',width:20,sortable:true,
  26. formatter:function(value,row,index){return row.user.name;} //需要formatter一下才能显示正确的数据
  27. },
  28. {field:'user.age',title:'年龄',width:20,sortable:true,
  29. formatter:function(value,row,index){return row.user.age;}
  30. },
  31. {field:'user.birthday',title:'生日',width:30,sortable:true,
  32. formatter:function(value,row,index){return row.user.birthday;}
  33. },
  34. {field:'user.deptId',title:'部门',width:30,sortable:true,
  35. formatter:function(value,row,index){
  36. return row.deptName;  //该列的值是deptId,显示的是deptName
  37. }
  38. }
  39. ]],
  40. toolbar:[{
  41. text:'新增',
  42. iconCls:'icon-add',
  43. handler:function(){
  44. addrow();
  45. }
  46. },'-',{
  47. text:'更新',
  48. iconCls:'icon-edit',
  49. handler:function(){
  50. updaterow();
  51. }
  52. },'-',{
  53. text:'删除',
  54. iconCls:'icon-remove',
  55. handler:function(){
  56. deleterow();
  57. }
  58. },'-'],
  59. onLoadSuccess:function(){
  60. $('#userTable').datagrid('clearSelections'); //一定要加上这一句,要不然datagrid会记住之前的选择状态,删除时会出问题
  61. }
  62. });
  63. //<span style="color: #0000ff;">下拉表格初始化,这个东西在ajax下要尽量少用,太变态了,每加载一次就会重新创建一次,隐藏在页面上,</span>
  64. //<span style="color: #0000ff;">时间一长效率很低,用firebug一看页面上有几十个同样的层保存着下拉框中的内容,只有整个页面全部刷新才清除。</span>
  65. //不知道新版本修正了没有,我目前的做法是点击菜单的时候手动清除一下。
  66. $('#deptCombo').combogrid({
  67. idField:'id', //ID字段
  68. textField:'name', //显示的字段
  69. url:"dept/queryAll",
  70. fitColumns: true,
  71. striped: true,
  72. editable:false,//不可编辑,只能选择
  73. columns:[[
  74. {field:'code',title:'编号',width:100},
  75. {field:'name',title:'名称',width:150}
  76. ]]
  77. });
  78. });
  79. //新增
  80. function addrow(){
  81. showWindow({
  82. title:'增加用户信息',
  83. href:'user/popWindow',
  84. width:300,
  85. height:250,
  86. onLoad: function(){
  87. $('#userForm').form('clear');
  88. }
  89. });
  90. }
  91. //更新
  92. function updaterow(){
  93. var rows = $('#userTable').datagrid('getSelections');
  94. //<span style="color: #ff0000;">这里有一个jquery easyui datagrid的一个小bug,必须把主键单独列出来,要不然不能多选</span>
  95. if(rows.length==0){
  96. $.messager.alert('提示',"请选择你要更新的用户",'info');
  97. return;
  98. }
  99. if(rows.length > 1){
  100. $.messager.alert('提示',"只能选择一位用户进行更新",'info');
  101. return;
  102. }
  103. showWindow({
  104. title:'更新用户信息',
  105. href:'user/popWindow',
  106. width:300,
  107. height:250,
  108. onLoad: function(){
  109. //<span style="color: #ff0000;">自动将数据填充到表单中,无需再查询数据库</span>
  110. ,这里需要注意:
  111. //<span style="color: #ff0000;">如果用的是struts2,它的表单元素的名称都是user.id这样的,那load的时候不能加.user要.form('load', rows[0]);</span>
  112. //而spring mvc中表单元素的名称不带对象前缀,直拉就是id,所以这里load的时候是:.<span style="color: #ff0000;">form('load', rows[0].user)</span>
  113. $("#userForm").form('load', rows[0].user);
  114. }
  115. });
  116. }
  117. //删除
  118. function deleterow(){
  119. $.messager.confirm('提示','确定要删除吗?',function(result){
  120. if (result){
  121. var rows = $('#userTable').datagrid('getSelections');
  122. var ps = "";
  123. $.each(rows,function(i,n){
  124. if(i==0)
  125. ps += "?uid="+n.uid;
  126. else
  127. ps += "&uid="+n.uid;
  128. });
  129. $.post('user/delete'+ps,function(data){
  130. $('#userTable').datagrid('reload');
  131. $.messager.alert('提示',data.mes,'info');
  132. });
  133. }
  134. });
  135. }
  136. //表格查询
  137. function searchUser(){
  138. var params = $('#userTable').datagrid('options').queryParams; //先取得 datagrid 的查询参数
  139. var fields =$('#queryForm').serializeArray(); //自动序列化表单元素为JSON对象
  140. $.each( fields, function(i, field){
  141. params[field.name] = field.value; //设置查询参数
  142. });
  143. $('#userTable').datagrid('reload'); //设置好查询参数 reload 一下就可以了
  144. }
  145. //清空查询条件
  146. function clearForm(){
  147. $('#queryForm').form('clear');
  148. searchUser();
  149. }
  150. </script>
  151. </head>
  152. <body>
  153. <form id="queryForm" style="margin:10;text-align: center;">
  154. <table width="100%">
  155. <tr>
  156. <td>名字:<input name="name" style="width: 200"></td>
  157. <td>年龄:<input class="easyui-numberspinner" name="age" min="1" max="120" increment="1" style="width:200px;"></input></td>
  158. <td align="center"><a href="#" onclick="clearForm();" class="easyui-linkbutton" iconCls="icon-search">清空</a></td>
  159. </tr>
  160. <tr>
  161. <td>生日:<input name="birthday" style="width: 200" class="Wdate" onClick="WdatePicker()"></td>
  162. <td>部门:<input id="deptCombo" name="deptId" style="width: 200"></td>
  163. <td align="center"><a href="#" onclick="searchUser();" class="easyui-linkbutton" iconCls="icon-search">查询</a></td>
  164. </tr>
  165. </table>
  166. </form>
  167. <div style="padding:10" id="tabdiv">
  168. <table id="userTable"></table>
  169. </div>
  170. </body>
  171. </html>

这里不得不说,用spring3 MVC对json的转换直接太方便了,只需要在上面说的spring3-servlet.xml中配置一下就可以,后台只需要@ResponseBody 一个注解就OK,可以返回map、list等多种数据类型,spring会自动转换为json对象的,比struts2要方便多了,用struts2 要<package name="def" extends="json-default" >,还要用json类型的result:<result name="success" type="json"><param name="root">jsonData</param></result>,还要自己组织 jsonData,Controller类如下:

  1. @Controller
  2. @RequestMapping("/user")
  3. public class UserController {
  4. @RequestMapping(value="/list",method=RequestMethod.GET)
  5. public String list(Model model) throws Exception {
  6. model.addAttribute("deptList", deptService.getDeptList());
  7. return "user/list";
  8. }
  9. @RequestMapping(value="/queryList",method=RequestMethod.POST)
  10. <span style="color: #0000ff;">@ResponseBody     </span>
  11. public Map<String, Object> queryList(DataGridModel dgm,TUser user) throws Exception{
  12. //<span style="color: #ff0000;">spring太给力了,可以自动装配两个对象  会自动的装返回的Map转换成JSON对象</span>
  13. //return userService.getPageListByExemple(dgm, user);
  14. return userService.getPageList(dgm, user);
  15. }
  16. @RequestMapping(value="/popWindow",method=RequestMethod.GET)
  17. public String popWindow() throws Exception{
  18. return "user/popWindow";
  19. }
  20. @RequestMapping(value="/addOrUpdate",method=RequestMethod.POST)
  21. @ResponseBody
  22. public Map<String, String> addOrUpdate(TUser user) throws Exception{
  23. //spring会利用jackson自动将返回值封装成JSON对象,比struts2方便了很多
  24. Map<String, String> map = new HashMap<String, String>();
  25. try {
  26. userService.addOrUpdate(user);
  27. map.put("mes", "操作成功");
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. map.put("mes", "操作失败");
  31. throw e;
  32. }
  33. return map;
  34. }
  35. @RequestMapping(value="/delete",method=RequestMethod.POST)
  36. @ResponseBody
  37. public Map<String, String> delete(@RequestParam("uid") <span style="color: #ff0000;">List<Integer> uid</span>
  38. )throws Exception{
  39. //<span style="color: #ff0000;">spring mvc 还可以将参数绑定为list类型</span>
  40. Map<String, String> map = new HashMap<String, String>();
  41. try {
  42. userService.deleteUsers(uid);
  43. map.put("mes", "删除成功");
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. map.put("mes", "删除失败");
  47. throw e;
  48. }
  49. return map;//重定向
  50. }
  51. private IDeptService deptService;
  52. public IDeptService getDeptService() {
  53. return deptService;
  54. }
  55. public void setDeptService(IDeptService deptService) {
  56. this.deptService = deptService;
  57. }
  58. private IUserService userService;
  59. public IUserService getUserService() {
  60. return userService;
  61. }
  62. public void setUserService(IUserService userService) {
  63. this.userService = userService;
  64. }
  65. }

jQuery easyUI所需要的JSON格式必须是这样的:

  1. {
  2. "total":239,
  3. "rows":[
  4. {"code":"001","name":"Name 1","addr":"Address 11","col4":"col4 data"},
  5. {"code":"002","name":"Name 2","addr":"Address 13","col4":"col4 data"},
  6. {"code":"003","name":"Name 3","addr":"Address 87","col4":"col4 data"},
  7. {"code":"004","name":"Name 4","addr":"Address 63","col4":"col4 data"},
  8. {"code":"005","name":"Name 5","addr":"Address 45","col4":"col4 data"},
  9. {"code":"006","name":"Name 6","addr":"Address 16","col4":"col4 data"},
  10. {"code":"007","name":"Name 7","addr":"Address 27","col4":"col4 data"},
  11. {"code":"008","name":"Name 8","addr":"Address 81","col4":"col4 data"},
  12. {"code":"009","name":"Name 9","addr":"Address 69","col4":"col4 data"},
  13. {"code":"010","name":"Name 10","addr":"Address 78","col4":"col4 data"}
  14. ]
  15. }

所以后台只需返回一个map对象包括total和rows两个key即可:

    1. public Map<String, Object> getPageListByExemple(DataGridModel dgm,TUser user) throws Exception{
    2. Map<String, Object> result = new HashMap<String, Object>(2);
    3. List totalList = getHibernateTemplate().findByExample(user);
    4. //这里使用了findByExample,如果没有外键关联(我的hibernate配置文件没有配置主外键对应关系),用这个可以简单很多,
    5. List pagelist = getHibernateTemplate().findByExample(user, (dgm.getPage() - 1) * dgm.getRows(), dgm.getRows());
    6. result.put("total", totalList == null ? 0 : totalList.size());
    7. result.put("rows", pagelist);
    8. return result;
    9. }
    10. public Map<String, Object> getPageList(DataGridModel dgm,TUser user) throws Exception{
    11. Map<String, Object> result = new HashMap<String, Object>(2);
    12. String countQuery = "select count(*) from TUser user,TDept dept where user.deptId=dept.id ";
    13. String fullQuery = "select new map(user as user,user.id as uid,dept.name as deptName) from TUser user,TDept dept where user.deptId=dept.id ";
    14. //这里需要用new map(),jquery easyui datagrid有一个小bug,必须把idField单独列出来,要不然不能多选
    15. String orderString = "";
    16. if(StringUtils.isNotBlank(dgm.getSort()))
    17. orderString = " order by " + dgm.getSort() + " " + dgm.getOrder(); //排序
    18. //增加条件
    19. StringBuffer sb = new StringBuffer();
    20. Map<String,Object> params = new HashMap<String,Object>();
    21. if(user != null) {
    22. if(StringUtils.isNotBlank(user.getName())) {
    23. sb.append(" and user.name like :userName");
    24. params.put("userName", "%"+user.getName()+"%");
    25. }
    26. if(user.getAge() != null) {
    27. sb.append(" and user.age = :age");
    28. params.put("age", user.getAge());
    29. }
    30. if(user.getBirthday() != null) {
    31. sb.append(" and user.birthday = :birthday");
    32. params.put("birthday", user.getBirthday());
    33. }
    34. if(user.getDeptId() != null) {
    35. sb.append(" and dept.id = :deptId");
    36. params.put("deptId", user.getDeptId());
    37. }
    38. }
    39. //查询总数可以用getHibernateTemplate(),我下面用的是createQuery
    40. //Hibernate的动态条件查询用DetachedCriteria是一个比较好的解决
    41. //          List totalList = getHibernateTemplate().findByNamedParam(countQuery, params.keySet().toArray(new String[0]), params.values().toArray());
    42. //          int total = ((Long)totalList.iterator().next()).intValue();
    43. Query queryTotal = getSession().createQuery(countQuery + sb.toString());
    44. Query queryList = getSession().createQuery(fullQuery + sb.toString() + orderString)
    45. .setFirstResult((dgm.getPage() - 1) * dgm.getRows()).setMaxResults(dgm.getRows());
    46. if(params!=null && !params.isEmpty()){
    47. Iterator<String> it = params.keySet().iterator();
    48. while(it.hasNext()){
    49. String key = it.next();
    50. queryTotal.setParameter(key, params.get(key));
    51. queryList.setParameter(key, params.get(key));
    52. }
    53. }
    54. int total = ((Long)queryTotal.uniqueResult()).intValue(); //这里必须先转成Long再取intValue,不能转成Integer
    55. List list = queryList.list();
    56. result.put("total", total);
    57. result.put("rows", list);
    58. return result;
    59. }

      用jackson转换json时如果有date类型的属性,需要处理一下,可以用配置文件,或者在属性的get方法上用注解:

      1. @JsonSerialize(using = CustomDateSerializer.class)
      2. public Date getBirthday() {
      3. return this.birthday;
      4. }

      CustomDateSerialize类如下:

        1. public class CustomDateSerializer  extends JsonSerializer<Date>{
        2. @Override
        3. public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        4. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        5. String formattedDate = formatter.format(value);
        6. jgen.writeString(formattedDate);
        7. }
        8. }