首页 > 代码库 > SpringMVC+Json构建基于Restful风格的应用(转)

SpringMVC+Json构建基于Restful风格的应用(转)

一、spring 版本:spring-framework-3.2.7.RELEASE

二、所需其它Jar包:

技术分享

 

三、主要代码:

web.xml

 

[java] view plaincopy技术分享技术分享
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  4.     version="2.5">  
  5.   
  6.     <context-param>  
  7.         <param-name>log4jConfigLocation</param-name>  
  8.         <param-value>classpath:log4j.properties</param-value>  
  9.     </context-param>  
  10.     <context-param>  
  11.         <param-name>log4jRefreshInterval</param-name>  
  12.         <param-value>60000</param-value>  
  13.     </context-param>  
  14.     <context-param>  
  15.         <param-name>contextConfigLocation</param-name>  
  16.         <param-value>classpath:applicationContext.xml</param-value>  
  17.     </context-param>  
  18.   
  19.     <!-- 编码过虑 -->  
  20.     <filter>  
  21.         <filter-name>encodingFilter</filter-name>  
  22.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  23.         <init-param>  
  24.             <param-name>encoding</param-name>  
  25.             <param-value>UTF-8</param-value>  
  26.         </init-param>  
  27.         <init-param>  
  28.             <param-name>forceEncoding</param-name>  
  29.             <param-value>true</param-value>  
  30.         </init-param>  
  31.     </filter>  
  32.     <filter-mapping>  
  33.         <filter-name>encodingFilter</filter-name>  
  34.         <url-pattern>/*</url-pattern>  
  35.     </filter-mapping>  
  36.   
  37.     <!-- Spring监听 -->  
  38.     <listener>  
  39.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  40.     </listener>  
  41.   
  42.     <!-- Spring MVC DispatcherServlet -->  
  43.     <servlet>  
  44.         <servlet-name>springMVC3</servlet-name>  
  45.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  46.         <init-param>  
  47.             <param-name>contextConfigLocation</param-name>  
  48.             <param-value>classpath:springMVC-servlet.xml</param-value>  
  49.         </init-param>  
  50.         <load-on-startup>1</load-on-startup>  
  51.     </servlet>  
  52.     <servlet-mapping>  
  53.         <servlet-name>springMVC3</servlet-name>  
  54.         <url-pattern>/</url-pattern>  
  55.     </servlet-mapping>  
  56.   
  57.     <!-- 解决HTTP PUT请求Spring无法获取请求参数的问题 -->  
  58.     <filter>  
  59.         <filter-name>HiddenHttpMethodFilter</filter-name>  
  60.         <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>  
  61.     </filter>  
  62.     <filter-mapping>  
  63.         <filter-name>HiddenHttpMethodFilter</filter-name>  
  64.         <servlet-name>springMVC3</servlet-name>  
  65.     </filter-mapping>  
  66.   
  67.   
  68.     <display-name>UikitTest</display-name>  
  69.     <welcome-file-list>  
  70.         <welcome-file>/WEB-INF/jsp/index.jsp</welcome-file>  
  71.     </welcome-file-list>  
  72.   
  73. </web-app>  


springMVC-servlet.xml

 

 

[html] view plaincopy技术分享技术分享
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans default-lazy-init="true"  
  3.     xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p"  
  4.     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"  
  5.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  6.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  7.     xsi:schemaLocation="  
  8.        http://www.springframework.org/schema/beans   
  9.        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd    
  10.        http://www.springframework.org/schema/mvc   
  11.        http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd     
  12.        http://www.springframework.org/schema/context   
  13.        http://www.springframework.org/schema/context/spring-context-3.1.xsd">  
  14.   
  15.     <!-- 注解驱动 -->  
  16.     <mvc:annotation-driven />  
  17.   
  18.     <!-- 扫描包 -->  
  19.     <context:component-scan base-package="com.citic.test.action" />  
  20.   
  21.     <!-- 用于页面跳转,根据请求的不同跳转到不同页面,如请求index.do则跳转到/WEB-INF/jsp/index.jsp -->  
  22.     <bean id="findJsp"  
  23.         class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />  
  24.   
  25.     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
  26.         <property name="mappings">  
  27.             <props>  
  28.                 <prop key="index.do">findJsp</prop><!-- 表示index.do转向index.jsp页面 -->  
  29.                 <prop key="first.do">findJsp</prop><!-- 表示first.do转向first.jsp页面 -->  
  30.             </props>  
  31.         </property>  
  32.     </bean>  
  33.   
  34.     <!-- 视图解析 -->  
  35.     <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">  
  36.         <!-- 返回的视图模型数据需要经过jstl来处理 -->  
  37.         <property name="viewClass"  
  38.             value=http://www.mamicode.com/"org.springframework.web.servlet.view.JstlView" />  
  39.         <property name="prefix" value=http://www.mamicode.com/"/WEB-INF/jsp/" />  
  40.         <property name="suffix" value=http://www.mamicode.com/".jsp" />  
  41.     </bean>  
  42.   
  43.     <!-- 对静态资源文件的访问 不支持访问WEB-INF目录 -->  
  44.     <mvc:default-servlet-handler />  
  45.   
  46.     <!-- 对静态资源文件的访问 支持访问WEB-INF目录 -->  
  47.     <!-- <mvc:resources location="/uikit-2.3.1/" mapping="/uikit-2.3.1/**" /> -->  
  48.   
  49.       
  50.     <bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter">  
  51.         <property name="supportedMediaTypes">  
  52.             <list>  
  53.                 <value>text/plain;charset=UTF-8</value>  
  54.             </list>  
  55.         </property>  
  56.     </bean>  
  57.   
  58.     <!-- 输出对象转JSON支持 -->  
  59.     <bean id="jsonConverter"  
  60.         class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>  
  61.     <bean  
  62.         class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
  63.         <property name="messageConverters">  
  64.             <list>  
  65.                 <ref bean="stringConverter"/>  
  66.                 <ref bean="jsonConverter" />  
  67.             </list>  
  68.         </property>  
  69.     </bean>  
  70.   
  71. </beans>  


Controller:

 

 

[java] view plaincopy技术分享技术分享
 
  1. package com.citic.test.action;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import net.sf.json.JSONObject;  
  7.   
  8. import org.apache.log4j.Logger;  
  9. import org.springframework.stereotype.Controller;  
  10. import org.springframework.web.bind.annotation.PathVariable;  
  11. import org.springframework.web.bind.annotation.RequestMapping;  
  12. import org.springframework.web.bind.annotation.RequestMethod;  
  13. import org.springframework.web.bind.annotation.RequestParam;  
  14. import org.springframework.web.bind.annotation.ResponseBody;  
  15.   
  16. import com.citic.test.entity.Person;  
  17.   
  18. /** 
  19.  * 基于Restful风格架构测试 
  20.  *  
  21.  * @author dekota 
  22.  * @since JDK1.5 
  23.  * @version V1.0 
  24.  * @history 2014-2-15 下午3:00:12 dekota 新建 
  25.  */  
  26. @Controller  
  27. public class DekotaAction {  
  28.   
  29.     /** 日志实例 */  
  30.     private static final Logger logger = Logger.getLogger(DekotaAction.class);  
  31.   
  32.     @RequestMapping(value = "/hello", produces = "text/plain;charset=UTF-8")  
  33.     public @ResponseBody  
  34.     String hello() {  
  35.         return "你好!hello";  
  36.     }  
  37.   
  38.     @RequestMapping(value = "/say/{msg}", produces = "application/json;charset=UTF-8")  
  39.     public @ResponseBody  
  40.     String say(@PathVariable(value = "msg") String msg) {  
  41.         return "{\"msg\":\"you say:‘" + msg + "‘\"}";  
  42.     }  
  43.   
  44.     @RequestMapping(value = "/person/{id:\\d+}", method = RequestMethod.GET)  
  45.     public @ResponseBody  
  46.     Person getPerson(@PathVariable("id") int id) {  
  47.         logger.info("获取人员信息id=" + id);  
  48.         Person person = new Person();  
  49.         person.setName("张三");  
  50.         person.setSex("男");  
  51.         person.setAge(30);  
  52.         person.setId(id);  
  53.         return person;  
  54.     }  
  55.   
  56.     @RequestMapping(value = "/person/{id:\\d+}", method = RequestMethod.DELETE)  
  57.     public @ResponseBody  
  58.     Object deletePerson(@PathVariable("id") int id) {  
  59.         logger.info("删除人员信息id=" + id);  
  60.         JSONObject jsonObject = new JSONObject();  
  61.         jsonObject.put("msg", "删除人员信息成功");  
  62.         return jsonObject;  
  63.     }  
  64.   
  65.     @RequestMapping(value = "/person", method = RequestMethod.POST)  
  66.     public @ResponseBody  
  67.     Object addPerson(Person person) {  
  68.         logger.info("注册人员信息成功id=" + person.getId());  
  69.         JSONObject jsonObject = new JSONObject();  
  70.         jsonObject.put("msg", "注册人员信息成功");  
  71.         return jsonObject;  
  72.     }  
  73.   
  74.     @RequestMapping(value = "/person", method = RequestMethod.PUT)  
  75.     public @ResponseBody  
  76.     Object updatePerson(Person person) {  
  77.         logger.info("更新人员信息id=" + person.getId());  
  78.         JSONObject jsonObject = new JSONObject();  
  79.         jsonObject.put("msg", "更新人员信息成功");  
  80.         return jsonObject;  
  81.     }  
  82.   
  83.     @RequestMapping(value = "/person", method = RequestMethod.PATCH)  
  84.     public @ResponseBody  
  85.     List<Person> listPerson(@RequestParam(value = "name", required = false, defaultValue = "") String name) {  
  86.   
  87.         logger.info("查询人员name like " + name);  
  88.         List<Person> lstPersons = new ArrayList<Person>();  
  89.   
  90.         Person person = new Person();  
  91.         person.setName("张三");  
  92.         person.setSex("男");  
  93.         person.setAge(25);  
  94.         person.setId(101);  
  95.         lstPersons.add(person);  
  96.   
  97.         Person person2 = new Person();  
  98.         person2.setName("李四");  
  99.         person2.setSex("女");  
  100.         person2.setAge(23);  
  101.         person2.setId(102);  
  102.         lstPersons.add(person2);  
  103.   
  104.         Person person3 = new Person();  
  105.         person3.setName("王五");  
  106.         person3.setSex("男");  
  107.         person3.setAge(27);  
  108.         person3.setId(103);  
  109.         lstPersons.add(person3);  
  110.   
  111.         return lstPersons;  
  112.     }  
  113.   
  114. }  

 

 

index.jsp

 

[html] view plaincopy技术分享技术分享
 
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3.     String path = request.getContextPath();  
  4.     String basePath = request.getScheme() + "://"  
  5.             + request.getServerName() + ":" + request.getServerPort()  
  6.             + path + "/";  
  7. %>  
  8.   
  9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  10. <html>  
  11. <head>  
  12. <base href=http://www.mamicode.com/"<%=basePath%>">  
  13.   
  14. <title>Uikit Test</title>  
  15.     <meta http-equiv="pragma" content="no-cache">  
  16.     <meta http-equiv="cache-control" content="no-cache">  
  17.     <meta http-equiv="expires" content="0">  
  18.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  19.     <meta http-equiv="description" content="This is my page">  
  20.     <link rel="stylesheet" type="text/css"   href=http://www.mamicode.com/"uikit-2.3.1/css/uikit.gradient.min.css">  
  21.     <link rel="stylesheet" type="text/css" href=http://www.mamicode.com/"uikit-2.3.1/addons/css/notify.gradient.min.css">  
  22. </head>  
  23. <body>  
  24. <div  
  25.     style="width:800px;margin-top:10px;margin-left: auto;margin-right: auto;text-align: center;">  
  26.     <h2>Uikit Test</h2>  
  27. </div>  
  28. <div style="width:800px;margin-left: auto;margin-right: auto;">  
  29.     <fieldset class="uk-form">  
  30.         <legend>Uikit表单渲染测试</legend>  
  31.         <div class="uk-form-row">  
  32.             <input type="text" class="uk-width-1-1">  
  33.         </div>  
  34.         <div class="uk-form-row">  
  35.             <input type="text" class="uk-width-1-1 uk-form-success">  
  36.         </div>  
  37.         <div class="uk-form-row">  
  38.             <input type="text" class="uk-width-1-1 uk-form-danger">  
  39.         </div>  
  40.         <div class="uk-form-row">  
  41.             <input type="text" class="uk-width-1-1">  
  42.         </div>  
  43.         <div class="uk-form-row">  
  44.             <select id="form-s-s">  
  45.                 <option>---请选择---</option>  
  46.                 <option>是</option>  
  47.                 <option>否</option>  
  48.             </select>  
  49.         </div>  
  50.         <div class="uk-form-row">  
  51.             <input type="date" id="form-h-id" />  
  52.         </div>  
  53.     </fieldset>  
  54.     <fieldset class="uk-form">  
  55.         <legend>基于Restful架构风格的资源请求测试</legend>  
  56.         <button class="uk-button uk-button-primary uk-button-large" id="btnGet">获取人员GET</button>  
  57.         <button class="uk-button uk-button-primary uk-button-large" id="btnAdd">添加人员POST</button>  
  58.         <button class="uk-button uk-button-primary uk-button-large" id="btnUpdate">更新人员PUT</button>  
  59.         <button class="uk-button uk-button-danger uk-button-large" id="btnDel">删除人员DELETE</button>  
  60.         <button class="uk-button uk-button-primary uk-button-large" id="btnList">查询列表PATCH</button>  
  61.     </fieldset>  
  62. </div>  
  63.   
  64. <script type="text/javascript" src=http://www.mamicode.com/"js/jquery-1.11.0.min.js"></script>  
  65. <script type="text/javascript" src=http://www.mamicode.com/"uikit-2.3.1/js/uikit.min.js"></script>  
  66. <script type="text/javascript" src=http://www.mamicode.com/"uikit-2.3.1/addons/js/notify.min.js"></script>  
  67. <script type="text/javascript">  
  68.     (function(window,$){  
  69.   
  70.         var dekota={  
  71.               
  72.             url:‘‘,  
  73.   
  74.             init:function(){  
  75.                 dekota.url=‘<%=basePath%>‘;  
  76.                 $.UIkit.notify("页面初始化完成", {status:‘info‘,timeout:500});  
  77.                 $("#btnGet").click(dekota.getPerson);  
  78.                 $("#btnAdd").click(dekota.addPerson);  
  79.                 $("#btnDel").click(dekota.delPerson);  
  80.                 $("#btnUpdate").click(dekota.updatePerson);  
  81.                 $("#btnList").click(dekota.listPerson);  
  82.             },  
  83.             getPerson:function(){  
  84.                 $.ajax({  
  85.                     url: dekota.url + ‘person/101/‘,  
  86.                     type: ‘GET‘,  
  87.                     dataType: ‘json‘  
  88.                 }).done(function(data, status, xhr) {  
  89.                     $.UIkit.notify("获取人员信息成功", {status:‘success‘,timeout:1000});  
  90.                 }).fail(function(xhr, status, error) {  
  91.                     $.UIkit.notify("请求失败!", {status:‘danger‘,timeout:2000});  
  92.                 });  
  93.             },  
  94.             addPerson:function(){  
  95.                 $.ajax({  
  96.                     url: dekota.url + ‘person‘,  
  97.                     type: ‘POST‘,  
  98.                     dataType: ‘json‘,  
  99.                     data: {id: 1,name:‘张三‘,sex:‘男‘,age:23}  
  100.                 }).done(function(data, status, xhr) {  
  101.                     $.UIkit.notify(data.msg, {status:‘success‘,timeout:1000});  
  102.                 }).fail(function(xhr, status, error) {  
  103.                     $.UIkit.notify("请求失败!", {status:‘danger‘,timeout:2000});  
  104.                 });  
  105.             },  
  106.             delPerson:function(){  
  107.                 $.ajax({  
  108.                     url: dekota.url + ‘person/109‘,  
  109.                     type: ‘DELETE‘,  
  110.                     dataType: ‘json‘  
  111.                 }).done(function(data, status, xhr) {  
  112.                     $.UIkit.notify(data.msg, {status:‘success‘,timeout:1000});  
  113.                 }).fail(function(xhr, status, error) {  
  114.                     $.UIkit.notify("请求失败!", {status:‘danger‘,timeout:2000});  
  115.                 });  
  116.             },  
  117.             updatePerson:function(){  
  118.                 $.ajax({  
  119.                     url: dekota.url + ‘person‘,  
  120.                     type: ‘POST‘,//注意在传参数时,加:_method:‘PUT‘ 将对应后台的PUT请求方法  
  121.                     dataType: ‘json‘,  
  122.                     data: {_method:‘PUT‘,id: 221,name:‘王五‘,sex:‘男‘,age:23}  
  123.                 }).done(function(data, status, xhr) {  
  124.                     $.UIkit.notify(data.msg, {status:‘success‘,timeout:1000});  
  125.                 }).fail(function(xhr, status, error) {  
  126.                     $.UIkit.notify("请求失败!", {status:‘danger‘,timeout:2000});  
  127.                 });  
  128.             },  
  129.             listPerson:function(){  
  130.                 $.ajax({  
  131.                     url: dekota.url + ‘person‘,  
  132.                     type: ‘POST‘,//注意在传参数时,加:_method:‘PATCH‘ 将对应后台的PATCH请求方法  
  133.                     dataType: ‘json‘,  
  134.                     data: {_method:‘PATCH‘,name: ‘张三‘}  
  135.                 }).done(function(data, status, xhr) {  
  136.                     $.UIkit.notify("查询人员信息成功", {status:‘success‘,timeout:1000});  
  137.                 }).fail(function(xhr, status, error) {  
  138.                     $.UIkit.notify("请求失败!", {status:‘danger‘,timeout:2000});  
  139.                 });  
  140.             }  
  141.         };  
  142.         window.dekota=(window.dekota)?window.dekota:dekota;  
  143.         $(function(){  
  144.             dekota.init();  
  145.         });  
  146.     })(window,jQuery);  
  147.   
  148. </script>  
  149. </body>  
  150. </html>  

 

部分调试效果:

技术分享

技术分享

 

http://blog.csdn.net/greensurfer/article/details/19296247

SpringMVC+Json构建基于Restful风格的应用(转)