zoukankan      html  css  js  c++  java
  • SpringMVC+Json构建基于Restful风格的应用(转)

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

    二、所需其它Jar包:

    三、主要代码:

    web.xml

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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="org.springframework.web.servlet.view.JstlView" />  
    39.         <property name="prefix" value="/WEB-INF/jsp/" />  
    40.         <property name="suffix" value=".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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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="<%=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="uikit-2.3.1/css/uikit.gradient.min.css">  
    21.     <link rel="stylesheet" type="text/css" href="uikit-2.3.1/addons/css/notify.gradient.min.css">  
    22. </head>  
    23. <body>  
    24. <div  
    25.     style="800px;margin-top:10px;margin-left: auto;margin-right: auto;text-align: center;">  
    26.     <h2>Uikit Test</h2>  
    27. </div>  
    28. <div style="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="js/jquery-1.11.0.min.js"></script>  
    65. <script type="text/javascript" src="uikit-2.3.1/js/uikit.min.js"></script>  
    66. <script type="text/javascript" src="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

  • 相关阅读:
    关于跨域名访问,反向代理系列话题集锦
    中国B2C电子商务最新发展状况调查分析(转)
    顶部导航条(Top Navigation Bar)_Yahoo_Pattern(翻译)
    google,百度,yahoo,msn,ASK网址登录和网站地图提交地址
    如何安装PE到硬盘(包括移动硬盘)分区
    ASP.NET SQL 注入免费解决方案
    O2O循环圈
    B2C暴利行业之保健品行业
    在SQLserver2005中如何对运行慢的查询进行分析?
    互联网产品设计之需求管理
  • 原文地址:https://www.cnblogs.com/jiligalaer/p/4218869.html
Copyright © 2011-2022 走看看