SpringMVC与Easyui(实现了JSON的展示)、FreeMarker的整合

原文转载:http://blog.csdn.net/congcong68/article/details/43953111


一.简介

     最近项目一直在用SpringMVC+ Easyui +FreeMarker,最近比较有时间,重新复习一下,整个的搭建的过程,以及使用。

     FreeMarker是模板引擎,是一种基于模板的、用来生成输出文本的通用工具,是基于Java的开发包和类库的。FreeMarker被设计用来生成HTML Web页面,特别是基于MVC(Model View Controller)模式的应用程序,FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP,使用Servlet提供的数据动态地生成 HTML。

      FreeMarker跟JSP相比,JSP运行时,需要在被执行的时候编译成Servlet, FreeMarker模板技术不存在编译,所以效率上FreeMarker会比较好,而且Freemarker内置了很多web编程中很常用的方法(日期转换、数字格式化等)方便开发人员操作。

     Easyui是一种基于jQuery的用户界面插件集合,提供了大多数UI控件的使用,如:accordion,combobox,menu,dialog,tabs,validatebox,datagrid,window,tree等。


      我们先看一下实现的列表,这样我们在整合时,就是接下来我们要分析的,这样思路会比较清晰,如图所示:

             SpringMVC与Easyui(实现了JSON的展示)、FreeMarker的整合_第1张图片

         

 


二.FreeMarker、Easyui在SpringMVC整合

   1.SpringMVC配置Easyui的配置文件(spring-mvc.xml)

       
[html]  view plain copy
  1.  <bean  class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
  2. <!-- 解决JSON中文乱码问题 -->  
  3. <property name="messageConverters">     
  4.           <list>  
  5.             <bean class="org.springframework.http.converter.StringHttpMessageConverter">  
  6.             <property name="supportedMediaTypes">  
  7.                 <list>  
  8.                     <value>text/plain;charset=UTF-8</value>  
  9.                     <value>text/html;charset=UTF-8</value>  
  10.                     <value>application/json;charset=UTF-8</value>  
  11.                 </list>  
  12.             </property>  
  13.         </bean>  
  14.         <!-- 该类只有org.springframework.web-3.1.2.RELEASE.jar及以上版本才有  使用该配置后,才可以使用JSON相关的一些注解-->  
  15.               <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">  
  16.                 <property name="supportedMediaTypes">  
  17.                 <list>  
  18.                     <value>text/plain;charset=UTF-8</value>  
  19.                     <value>text/html;charset=UTF-8</value>  
  20.                     <value>application/json;charset=UTF-8</value>  
  21.                 </list>  
  22.             </property>  
  23.                   <property name="objectMapper">  
  24.                   <!-- jackson-databind-2.2.2.jar -->  
  25.                     <bean class="com.fasterxml.jackson.databind.ObjectMapper">  
  26.                         <property name="dateFormat">    
  27.                             <bean class="java.text.SimpleDateFormat">    
  28.                                <constructor-arg value="yyyy-MM-dd HH:mm:ss" />    
  29.                             </bean>    
  30.                         </property>    
  31.                     </bean>  
  32.                     </property>  
  33.               </bean>  
  34.           </list>  
  35.       </property>  
  36.    <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射   请求映射-->  
  37.    <property name="webBindingInitializer">    
  38.           <bean class="cn.social.card.util.DateBinding" />    
  39.       </property>    
  40. lt;/bean>  
        说明:
           HandlerAdapter接口是处理请求的映射。
           AnnotationMethodHandlerAdapter类,通过注解,把一个URL映射到Controller类的方法上。这个类有很多个属性,如源代码图所示:
     
         SpringMVC与Easyui(实现了JSON的展示)、FreeMarker的整合_第2张图片

        1.  messageConverters属性配置的说明
           1)messageConverters属性配置可以解决一些乱码的问题,请求和返回值是字符串类型或者对象类型,可以通过messageConverters进行系列化和反系列化, 那AnnotationMethodHandlerAdapter将使用messageConverters查找对应的并 将Controller返回值直接输出到响应体。

          2)messageConverters是一个列表,列表中有StringHttpMessageConverter、MappingJackson2HttpMessageConverter等都指定了supportedMediaTypes所支持的类型,如果请求头Accept与某个messageConverter的supportedMediaTypes匹配,那么将使用此messageConverter向响应体输出内容。

            (1)MappingJackson2HttpMessageConverter:使用 Jackson 的ObjectMapper 读取/编写 JSON 数据。它转换媒体类型为 application/json 的数据。该类只有org.springframework.web-3.1.2.RELEASE.jar及以上版本才有使用该配置后,才可以使用JSON相关的一些注解,并可以配置日期的格式需要引入jackson-databind-2.2.2.jar:如图所示:

           SpringMVC与Easyui(实现了JSON的展示)、FreeMarker的整合_第3张图片  

              

         2.  webBindingInitializer属性配置

               1)webBindingInitializer是全局的属性编辑器,我们配置了日期格式化,有可以配置电话等格式。我们自定义全局的属性编辑器时,需要实现了WebBindingInitializer接口中的initBinder方法,代码如下:

               

[java]  view plain copy
  1. public class DateBinding implements WebBindingInitializer {  
  2.     /** 
  3.      * 表单数据(全部是字符串)通过WebDataBinder进行绑定到命令对象,内部通过PropertyEditor实现 
  4.      */  
  5.     public void initBinder(WebDataBinder binder, WebRequest request) {  
  6.         //使用spring自带的CustomDateEditor  
  7.         //注册自定义的属性编辑器(日期)  
  8.         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  9.         binder.registerCustomEditor(Date.classnew CustomDateEditor(dateFormat, true));  
  10.     }  
  11.   
  12. }  
        日期格式化全局实现好了,我们把这个类 AnnotationMethodHandlerAdapter属性配置对应的,就OK了

    2)也可以定义为局部的属性编辑器,只在对应的controller类里有效的

                 @InitBinder

                public void initBinder(WebDataBinder binder)                            

 2.SpringMVC配置FreeMarker的配置文件(spring-mvc.xml)

          
[html]  view plain copy
  1. <!-- 设置freeMarker的配置文件路径 -->  
  2. <bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">  
  3.     <property name="location" value="classpath:freemarker.properties" />  
  4. </bean>  
  5. <bean id="xmlEscape" class="freemarker.template.utility.XmlEscape" />  
  6. <!-- freeMarker的模板配置 -->  
  7. <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
  8.     <!--视图解析器会在/WEB-INF/template/路径下查找-->  
  9.     <property name="templateLoaderPath">  
  10.         <value>/WEB-INF/template/</value>  
  11.     </property>  
  12.     <property name="freemarkerVariables">  
  13.         <map>  
  14.             <entry key="xml_escape" value-ref="xmlEscape" />  
  15.         </map>  
  16.     </property>  
  17.     <property name="freemarkerSettings" ref="freemarkerConfiguration" />  
  18. </bean>  
  19.   
  20. <!-- 配置freeMarker视图解析器 -->  
  21. <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">  
  22.     <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />  
  23.     <!--查找对应下所有以ftl结尾的文件-->  
  24.     <property name="viewNames" value="*.ftl" />  
  25.     <property name="contentType" value="text/html; charset=utf-8" />  
  26.     <property name="cache" value="true" />  
  27.     <property name="prefix" value="" />  
  28.     <property name="suffix" value="" />  
  29.     <property name="order" value="1"></property>  
  30.     <property name="requestContextAttribute" value="rc" />  
  31. </bean>  

       freemarker.properties   ( freemarker一些转换配置)
[html]  view plain copy
  1. tag_syntax=auto_detect  
  2. template_update_delay=2  
  3. default_encoding=UTF-8  
  4. output_encoding=UTF-8  
  5. locale=zh_CN  
  6. date_format=yyyy-MM-dd  
  7. time_format=HH:mm:ss  
  8. datetime_format=yyyy-MM-dd HH\:mm\:ss  
  9. number_format=#  

 说明:
       1)通过prefix属性指定一个指定的前缀,通过suffix属性指定一个指定的后缀,然后把返回的逻辑视图名称加上指定的前缀和后缀就是指定的视图URL了。
        2)<property name="order"value="1">  value="0"代表了第一个匹配的是freemarker的视图解析器,如果匹配不成功,则自动选择order="1"的其他解析器,目前的通用解析器可以解析.ftl的视图,如果需要其他视图的解析器,可以在添加新的解析器 value值对应的跟现在不一样
    

三.SpringMVC的Controller代码的实现

        刚才我们介绍了Spring的配置文件,现在我们介绍代码的实现,@Controller @RequestMapping  @ResponseBody这些注解就不在介绍一下,网上资料很多,代码如下:
          
    
[java]  view plain copy
  1. @Controller  
  2. @RequestMapping(value="/admin/user")  
  3. public class UserController {  
  4.       
  5.     @Autowired  
  6.     private UserService userService;  
  7.       
  8.     /** 
  9.      * 用户信息首页 
  10.      * @param session 
  11.      * @param request 
  12.      * @param map 
  13.      * @return 
  14.      */  
  15.     @RequestMapping(value="/index")  
  16.     public String showRootLayer(HttpSession session, HttpServletRequest request, ModelMap map) {  
  17.         String contextPath = request.getContextPath();  
  18.         User user=(User) session.getAttribute("user");  
  19.         map.put("contextPath", contextPath);  
  20.         map.put("user", user);  
  21.         return "/user/index.ftl";  
  22.     }  
  23.       
  24.     /** 
  25.      * 获取用户信息列表 
  26.      * @param session 
  27.      * @param page 
  28.      * @param rows 
  29.      * @return 
  30.      */  
  31.     @ResponseBody  
  32.     @RequestMapping(value="/listData", method=RequestMethod.POST)  
  33.     public EUDGPagination detailDataList(HttpSession session, @RequestParam(value="page"int page, @RequestParam(value="rows"int rows, @RequestParam(value="yhm",required=false) String yhm, @RequestParam(value="rymc",required=false) String rymc, @RequestParam(value="rybh",required=false) String rybh) {  
  34.         if(page<=0) page=1;  
  35.         if(yhm!=null){yhm=yhm.trim();}  
  36.         if(rymc!=null){rymc=rymc.trim();}  
  37.         if(rybh!=null){rybh=rybh.trim();}  
  38.         Map<String, Object> params = new HashMap<String, Object>();  
  39.         params.put("yhm", yhm);  
  40.         params.put("rymc", rymc);  
  41.         params.put("rybh", rybh);  
  42.         User user=(User) session.getAttribute("user");  
  43.         params.put("user",user);  
  44.         EUDGPagination pagination = userService.findUserPagination(page, rows, params);  
  45.         return pagination;  
  46.     }  
  47.       
  48.     /** 
  49. <span style="white-space:pre">    </span> * 详情页面 
  50. <span style="white-space:pre">    </span> * @param session 
  51. <span style="white-space:pre">    </span> * @param id 
  52. <span style="white-space:pre">    </span> * @param request 
  53. <span style="white-space:pre">    </span> * @param map 
  54. <span style="white-space:pre">    </span> * @return 
  55. <span style="white-space:pre">    </span> */  
  56.     @RequestMapping(value="/detail")  
  57.     public String detail(HttpSession session,@RequestParam(value="id") Long id, HttpServletRequest request, ModelMap map) {  
  58.         String contextPath = request.getContextPath();  
  59.         User user=userService.findUserById(id);  
  60.         map.put("contextPath", contextPath);  
  61.         User userSession=(User) session.getAttribute("user");  
  62.         map.put("user", user);  
  63.         map.put("userSession", userSession);  
  64.         return "/user/detail.ftl";  
  65.     }  
  66.       
  67. }  

   四.Easyui列表的实现

      
[java]  view plain copy
  1. <!DOCTYPE html PUBLIC "-/W3C/DTD XHTML 1.0 Transitional/EN" "http:/www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http:/www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5. <title>请假管理</title>  
  6. <link rel="stylesheet" type="text/css" href="${contextPath}/css/main_new.css" />  
  7. <link rel="stylesheet" type="text/css" href="${contextPath}/css/easyui.css">  
  8. <link rel="stylesheet" type="text/css" href="${contextPath}/css/icon.css">  
  9. <link rel="stylesheet" type="text/css" href="${contextPath}/css/demo.css">  
  10. <script type="text/javascript" src="${contextPath}/js/formatDate.js"></script>  
  11. <script type="text/javascript" src="${contextPath}/js/jquery-1.8.0.min.js"></script>  
  12. <script type="text/javascript" src="${contextPath}/js/jquery.easyui.min.js"></script>  
  13. <script type="text/javascript" src="${contextPath}/js/locale/easyui-lang-zh_CN.js"></script>  
  14. </head>  
  15. <body class="easyui-layout">  
  16. <div id="careRoadContentDiv" region="center" title=" 请假管理" border="false" style="overflow:hidden;">  
  17.     <table id="list"></table>  
  18. </div>  
  19.   
  20. <div id="jqueryToolbar" style="padding:5px;height:auto">  
  21.     <div style="margin-top:5px; padding-bottom:8px; border-bottom:1px solid #ccc;">  
  22.         人员名称:<input type="text" id="rymc" style="width:120px" />  
  23.         人员编号:<input type="text" id="rybh" style="width:120px" />  
  24.         <a href="#" class="easyui-linkbutton" iconCls="icon-search" onclick="searchData()">查询</a>  
  25.         <a href="#" class="easyui-linkbutton" iconCls="icon-reload" onclick="resetCondition()">重置</a>  
  26.     </div>  
  27.     <div style="margin-top:5px;">  
  28.         <a href="#" class="easyui-linkbutton" iconCls="icon-add" plain="true" onclick="create()">新增</a>   
  29.     </div>  
  30. </div>  
  31.   
  32. <script type="text/javascript">  
  33.     $(function(){  
  34.         $('#list').datagrid({  
  35.             width:600,  
  36.             height:600,  
  37.             nowrap: false,  
  38.             striped: true,  
  39.             fit: true,  
  40.             idField:'id',  
  41.             url:'${contextPath}/admin/user/listData.json',  
  42.             columns:[[   
  43.                 {field:'id',title:'',hidden:true},                 
  44.                 {field:'rybh',title:'人员编号', align:'center',width:150},  
  45.                 {field:'rymc',title:'人员名称', align:'center',width:100},  
  46.                 {field:'rylx',title:'人员类型', align:'center',width:100},  
  47.                 {field:'sszhmc',title:'所属部门名称', align:'center',width:200},  
  48.                 {field:'sqrybh',title:'授权人员编号', align:'center',width:150},  
  49.                 {field:'czry',title:'操作人员', align:'center',width:120},  
  50.                 {field:'czsj',title:'操作时间', align:'center',width:130},  
  51.                 {field:'opt', title:'操作', width:160, align:'center', formatter:function(value, rec, index){  
  52.                     var e ='';  
  53.                     var d ='';  
  54.                         e='<a href="###" onclick="editRow('+rec.id+')">编辑</a>';  
  55.                         e += ' | ';  
  56.                         d='<a href="###" onclick="deleteRow('+rec.id+')">删除</a>';  
  57.                         d += ' | ';  
  58.                     var f = '<a href="###" onclick="showRow('+ rec.id +')">详情</a>';                   
  59.                     return e+d+f;  
  60.                 }},                
  61.             ]],  
  62.             toolbar:'#jqueryToolbar',  
  63.             pagination:true,  
  64.            queryParams:{},  
  65.             onLoadSuccess:function(data){  
  66.                 $('#list').datagrid('clearSelections'); //清除掉列表选中记录  
  67.                 if(data.total==0){                    
  68.                     $('.datagrid-body-inner').eq(0).addClass("l_elist");                      
  69.                     $('.datagrid-body').eq(1).append('<div class="r_elist">无数据</div>');                   
  70.                 }else{  
  71.                     $('.datagrid-body-inner').eq(0).removeClass("l_elist");  
  72.                 }  
  73.             }  
  74.         });  
  75.           
  76.         //设置分页控件  
  77.         var p = $('#list').datagrid('getPager');  
  78.         $(p).pagination({  
  79.             pageSize: 10,//每页显示的记录条数,默认为  
  80.             pageList: [10,20,30,40,50],//可以设置每页记录条数的列表  
  81.             beforePageText: '第',//页数文本框前显示的汉字  
  82.             afterPageText: '页    共 {pages} 页',  
  83.             displayMsg: '当前显示第 {from} 到 {to} 条记录   共 {total} 条记录'/*, 
  84.             onBeforeRefresh:function(){ 
  85.                 $(this).pagination('loading'); 
  86.                 alert('before refresh'); 
  87.                 $(this).pagination('loaded'); 
  88.             }*/  
  89.         });  
  90.           
  91.       
  92.     })  
  93.       
  94.     function searchData() {       
  95.         var a = new Array();  
  96.         var yhm = $("#yhm").val();  
  97.         if(yhm!=null && yhm!="") a["yhm"]=yhm;  
  98.         var rymc = $("#rymc").val();  
  99.         if(rymc!=null && rymc!="") a["rymc"]=rymc;  
  100.         var rybh = $("#rybh").val();  
  101.         if(rybh!=null && rybh!="") a["rybh"]=rybh;  
  102.         doSearch(a);  
  103.     }  
  104.       
  105.     function doSearch(queryParams){  
  106.         $('#list').datagrid('clearSelections');  
  107.         $("#list").datagrid('options').queryParams=queryParams;  
  108.         $("#list").datagrid('load');  
  109.     }  
  110.       
  111.     function resetCondition(){  
  112.         $("#yhm").val("");  
  113.         $("#rymc").val("");  
  114.         $("#rybh").val("");  
  115.     }  
  116.       
  117.     function create() {  
  118.        var url = '${contextPath}/admin/user/create.jhtml';  
  119.        showMaxJqueryWindow("新增用户信息", url);        
  120.     }  
  121.       
  122.     function editRow(id) {        
  123.         var url = '${contextPath}/admin/user/edit.jhtml?id='+id;  
  124.         showMaxJqueryWindow("编辑用户信息", url);        
  125.     }  
  126.       
  127.     function showRow(id) {        
  128.         var url = '${contextPath}/admin/user/detail.jhtml?id='+id;  
  129.         showMaxJqueryWindow("用户详情", url);         
  130.     }     
  131.       
  132. </script>  
  133. </body>  
  134. </html>  
   说明:
       1)field中的值要跟实体的属性名称一样,不然就获取不到
        2)SpringMVC的Controller中方法要注解为 @ResponseBody,返回的是JSON格式如下所示:
               
[html]  view plain copy
  1. {"total":4,"rows":[{"id":6,"sszhmc":"5301d","mm":"1","rybh":"test3","sqrybh":"1","rymc":"1                   ","rylx":"1","czry":"admin","czsj":"2014-12-27 14:02:31","role":null},{"id":5,"sszhmc":"52k                 ","mm":"1","rybh":"test2","sqrybh":"1","rymc":"1","rylx":"1 ","czry":"admin","czsj":"2014-12-27 14:02:14","role":null},{"id":4,"sszhmc":"51h","mm":"1","rybh":"test","sqrybh":"1","rymc":"1                   ","rylx":"1","czry":"admin ","czsj":"2014-12-27 13:39:25 ","role":null},{"id":3,"sszhmc":"50郑                ","mm":"123456","rybh":"admin","sqrybh":"","rymc":"","rylx":"","czry":"","czsj":"","role":null}],"footer":null}  

  SpringMVC与Easyui(实现了JSON的展示)、FreeMarker的整合_第4张图片


五.FreeMarker的实现

      而且Freemarker内置了很多web编程中很常用的方法(日期转换、数字格式化等)方便开发人员操作
        
      插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出 
[java]  view plain copy
  1. <body>  
  2.     <div id="infoTabs" class="easyui-tabs" fit="true" border="false" style="margin: 0; height:530px;">  
  3.         <div title="用户信息" id="editInfo" style="margin:0">  
  4.             <form id="tableForm" name="tableForm" action="${contextPath}/admin/base/report.jhtml" method="post">  
  5.                 <table width="100%" border="0" cellspacing="0" cellpadding="0" class="border-t">  
  6.                     <tr class="item">  
  7.                         <td class="itemtit"> 人员编号</td>  
  8.                         <td class="border_b" colspan="3">   
  9.                             ${user.rybh!''}  
  10.                         </td>  
  11.                     </tr>  
  12.                       
  13.                     <tr class="item">  
  14.                          
  15.                         <td class="itemtit"> 密码</td>  
  16.                         <td class="border_b" colspan="3">   
  17.                           ${user.mm!''}  
  18.                         </td>  
  19.                           
  20.                     </tr>  
  21.                       
  22.                     
  23.                       
  24.                     <tr class="item">   
  25.                         <td class="itemtit"> 授权人员编号</td>  
  26.                         <td class="border_b" colspan="3">   
  27.                            ${user.sqrybh!''}  
  28.                         </td>  
  29.                     </tr>  
  30.                       
  31.                      <tr class="item">      
  32.                         <td class="itemtit"> 人员名称</td>  
  33.                         <td class="border_b" colspan="3">   
  34.                           ${user.rymc!''}  
  35.                         </td>  
  36.                     </tr>  
  37.                       <tr class="item">     
  38.                         <td class="itemtit"> 人员类型</td>  
  39.                         <td class="border_b" colspan="3">   
  40.                           ${user.rylx!''}  
  41.                         </td>  
  42.                     </tr>  
  43.                      <tr class="item">      
  44.                         <td class="itemtit"> 所属部门名称</td>  
  45.                         <td class="border_b" colspan="3">   
  46.                           ${user.sszhmc!''}  
  47.                         </td>  
  48.                     </tr>  
  49.                       <tr class="item">     
  50.                         <td class="itemtit"> 操作人员</td>  
  51.                         <td class="border_b" colspan="3">   
  52.                           ${user.czry!''}  
  53.                         </td>  
  54.                     </tr>  
  55.                 <tr class="item">   
  56.                         <td class="itemtit"> 操作人员</td>  
  57.                         <td class="border_b" colspan="3">   
  58.                           ${user.czsj!''}  
  59.                         </td>  
  60.                     </tr>  
  61.                 </table>  
  62.             </form>  
  63.         </div>  
  64.           
  65.     </div>  

   页面如图所示:
       
           SpringMVC与Easyui(实现了JSON的展示)、FreeMarker的整合_第5张图片
    

你可能感兴趣的:(spring,mvc,freemarker,easyui)