首页 > 代码库 > spring_restful_json_jdbc

spring_restful_json_jdbc

来源:http://blog.csdn.net/qduningning/article/details/27712137

使用Spring MVC +JDBC 实现输出Json数据和视图两种形式 最后面有源码

从web.xml开始配置:

声明定义两个Servlet分别是输出视图和json

 

[html] view plaincopy技术分享技术分享
  1. <!-- 声明一个Servlet 并进行配置 -->  
  2.     <servlet>  
  3.         <servlet-name>rest</servlet-name>  
  4.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  5.         <init-param>  
  6.             <param-name>contextConfigLocation</param-name>  
  7.             <param-value>/WEB-INF/rest-servlet.xml</param-value>  
  8.         </init-param>  
  9.         <!-- 标记容器是否在启动的时候就加载这个servlet 当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。正数的值越小,启动该servlet的优先级越高。 -->  
  10.         <load-on-startup>1</load-on-startup>  
  11.     </servlet>  
  12.     <servlet-mapping>  
  13.         <servlet-name>rest</servlet-name>  
  14.         <url-pattern>/rest/*</url-pattern>  
  15.     </servlet-mapping>  
  16.     <!-- 声明一个Servlet END -->  
  17.     <!-- 声明一个Servlet 并进行配置 -->  
  18.     <servlet>  
  19.         <servlet-name>json</servlet-name>  
  20.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  21.         <init-param>  
  22.             <param-name>contextConfigLocation</param-name>  
  23.             <param-value>/WEB-INF/json-servlet.xml</param-value>  
  24.         </init-param>  
  25.     </servlet>  
  26.     <servlet-mapping>  
  27.         <servlet-name>json</servlet-name>  
  28.         <url-pattern>/json/*</url-pattern>  
  29.     </servlet-mapping>  
  30.     <!-- 声明一个Servlet END -->  


其他配置略过
首先是第一个Servlet – rest,指定的配置文件rest-servlet.xml(默认也是,,,)

 

 

[html] view plaincopy技术分享技术分享
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  6.   
  7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  8.   
  9.   
  10. http://www.springframework.org/schema/context  
  11.   
  12.   
  13. http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  14.   
  15.   
  16. http://www.springframework.org/schema/mvc  
  17.   
  18.   
  19. http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">  
  20.   
  21.     <!-- 搜索Controller路径 -->  
  22.     <context:component-scan base-package="com.znn.rest.controller">  
  23.         <!-- 忽略这个包 -->  
  24.         <!-- <context:exclude-filter type="assignable" expression="com..."/> -->  
  25.     </context:component-scan>  
  26.     <!-- 简写形式 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter两个bean,是spring  
  27.         MVC为@Controllers分发请求所必须的。 -->  
  28.     <mvc:annotation-driven />  
  29.     <!-- 视图解析器 -->  
  30.     <bean  
  31.         class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  32.         <property name="prefix" value=http://www.mamicode.com/"/WEB-INF/jsp/" />  
  33.         <property name="suffix" value=http://www.mamicode.com/".jsp" />  
  34.     </bean>  
  35. </beans>  


在包com.znn.rest.controller下创建一个Controller:UserController.java
用注解@Controller进行声明这是一个Controller,Spring会自动扫描到

 

 

[java] view plaincopy技术分享技术分享
  1. package com.znn.rest.controller;  
  2.   
  3. import java.lang.reflect.Method;  
  4. import java.util.List;  
  5.   
  6. import org.springframework.context.ApplicationContext;  
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  8. import org.springframework.stereotype.Controller;  
  9. import org.springframework.ui.Model;  
  10. import org.springframework.web.bind.annotation.PathVariable;  
  11. import org.springframework.web.bind.annotation.RequestHeader;  
  12. import org.springframework.web.bind.annotation.RequestMapping;  
  13. import org.springframework.web.bind.annotation.RequestMethod;  
  14. import org.springframework.web.bind.annotation.RequestParam;  
  15.   
  16. import com.znn.dao.UserDao;  
  17. import com.znn.vo.User;  
  18. /** 
  19.  * RestFul 返回视图 
  20.  * 
  21.  * @author RANDY.ZHANG 
  22.  * 2014-5-7 
  23.  */  
  24. @Controller  
  25. public class UserController {  
  26.     ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");  
  27.     UserDao dao = (UserDao) applicationContext.getBean("userDao");  
  28.   
  29.     @RequestMapping("/hi")  
  30.     public String helloWorld(Model model) {  
  31.         model.addAttribute("msg", "Hello HelloWorld");  
  32.         return "hello";  
  33. //      return "redirect:hello.jsp";  
  34.     }  
  35.     @RequestMapping("/user/{id:\\d+}")  
  36.     public String getUser(Model model,@PathVariable("id") int userid) {  
  37.         User user;  
  38.         user = dao.queryAUser(userid);  
  39.         if (user == null) {  
  40.             model.addAttribute("tip", "<font color=‘red‘>用户不存在!</font>");  
  41.         }else {  
  42.             model.addAttribute("tip", user.toString());  
  43.         }  
  44.         return "user";  
  45.     }  
  46.     @RequestMapping(value = "/user/*",method=RequestMethod.GET)  
  47.     public String getAllUser(Model model) {  
  48.         List<User> list = dao.query();  
  49.         String tipString = "";  
  50.         for (int i = 0; i < list.size(); i++) {  
  51.             tipString += list.get(i).toString()+"<br />";  
  52.         }  
  53.         model.addAttribute("tip",tipString);  
  54.         return "user";  
  55.     }  
  56.     @RequestMapping(value = "/user",method=RequestMethod.GET)  
  57.     public String getAUser(Model model,  
  58.             @RequestParam(value=http://www.mamicode.com/"id",required=false,defaultValue=http://www.mamicode.com/"1") int userid,  
  59.             @RequestHeader("user-agent") String agent) {  
  60.         User user;  
  61.         user = dao.queryAUser(userid);  
  62.         if (user == null) {  
  63.             model.addAttribute("tip", "<font color=‘red‘>用户不存在!</font>");  
  64.         }else {  
  65.             model.addAttribute("tip", user.toString());  
  66.         }  
  67.         System.out.println(agent);  
  68.         return "user";  
  69.     }  
  70. }  



 

 

使用InternalResourceViewResolver进行视图适配,方法返回的字符串会自动添加上前后缀,另外还支持redirect:和forward:两种特殊配置,只是注意下要路径。
关于MVC的注解以及RequestMapping的配置用法到:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/mvc.html#mvc-introduction,里面讲的挺详细。

第二种输出JSON:
从Spring 3.1开始支持@ResponseBody来直接将数据返回到HTTP响应体重,不在需要ModalView或者其他进行渲染。Spring提供了一些HttpMessageConverter来对数据进行转换,比如StringHttpMessageConverter,FormHttpMessageConverter,MappingJackson2HttpMessageConverter ,其他见这里,这里用到了StringHttpMessageConverter用来进行编码转换,MappingJackson2HttpMessageConverter 用来将数据转为Json形式。
json-servlet.xml

[html] view plaincopy技术分享技术分享
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  6.   
  7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  8.   
  9.   
  10. http://www.springframework.org/schema/context  
  11.   
  12.   
  13. http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  14.   
  15.   
  16. http://www.springframework.org/schema/mvc  
  17.   
  18.   
  19. http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">  
  20.   
  21.     <!-- 搜索Controller路径 -->  
  22.     <context:component-scan base-package="<strong>com.znn.json.controller</strong>">  
  23.         <!-- 忽略这个包 -->  
  24.         <!-- <context:exclude-filter type="assignable" expression="com..."/> -->  
  25.     </context:component-scan>  
  26.   
  27.     <!-- Spring 3.1之后开始用这两个 -->  
  28.     <bean  
  29.         class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />  
  30.     <bean  
  31.         class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">  
  32.         <property name="messageConverters">  
  33.             <list>  
  34.                 <bean  
  35.                     class="org.springframework.http.converter.StringHttpMessageConverter">  
  36.                     <property name="supportedMediaTypes">  
  37.                         <list>  
  38.                             <value>text/html; charset=UTF-8</value>  
  39.                         </list>  
  40.                     </property>  
  41.                 </bean>  
  42.                 <bean  
  43.                     class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">  
  44.                     <property name="supportedMediaTypes">  
  45.                         <list>  
  46.                             <value>text/html; charset=UTF-8</value>  
  47.                         </list>  
  48.                     </property>  
  49.                 </bean>  
  50.             </list>  
  51.         </property>  
  52.     </bean>  
  53. </beans>  


从3.1开始推荐使用RequestMappingHandlerMapping和RequestMappingHandlerAdapter来代替DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。不过不换也木事。。。。
在com.znn.json.controller下新建一个Controller
UserJson.java

 

[java] view plaincopy技术分享技术分享
  1. package com.znn.json.controller;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7.   
  8. import org.springframework.context.ApplicationContext;  
  9. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  10. import org.springframework.stereotype.Controller;  
  11. import org.springframework.ui.Model;  
  12. import org.springframework.web.bind.annotation.PathVariable;  
  13. import org.springframework.web.bind.annotation.RequestMapping;  
  14. import org.springframework.web.bind.annotation.RequestMethod;  
  15. import org.springframework.web.bind.annotation.ResponseBody;  
  16.   
  17. import com.znn.dao.UserDao;  
  18. import com.znn.vo.User;  
  19. /** 
  20.  * 返回@ResponseBody需要配置HttpMessageConverters 
  21.  * 
  22.  * @author RANDY.ZHANG 
  23.  * 2014-5-7 
  24.  */  
  25. @Controller  
  26. public class UserJson {  
  27.     ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");  
  28.     UserDao dao = (UserDao) applicationContext.getBean("userDao");  
  29.   
  30.     @RequestMapping("/hi")  
  31.     public @ResponseBody String helloWorld(Model model) {  
  32. //      model.addAttribute("msg", "Hello HelloWorld");  
  33.         return "hello world";  
  34. //      return "redirect:hello.jsp";  
  35.     }  
  36.   
  37.     @RequestMapping("/user/{id:\\d+}")  
  38.     public @ResponseBody User getUser(Model model,@PathVariable int id) {  
  39.         User user;  
  40.         user = dao.queryAUser(id);  
  41.         if (user == null) {  
  42.             model.addAttribute("tip", "<font color=‘red‘>用户不存在!</font>");  
  43.         }else {  
  44.             model.addAttribute("tip", user.toString());  
  45.         }  
  46.         return user;  
  47.     }  
  48.     @RequestMapping(value = {"/user/*","/user"},method=RequestMethod.GET)//,produces="application/json" 406  
  49.     public @ResponseBody List<User> getAllUser(Model model) {  
  50.         List<User> list = dao.query();  
  51.         String tipString = "";  
  52.         for (int i = 0; i < list.size(); i++) {  
  53.             tipString += list.get(i).toString()+"<br />";  
  54.         }  
  55.         model.addAttribute("tip",tipString);  
  56.         return list;  
  57.     }  
  58.     @RequestMapping(value = "/user/aaa",method=RequestMethod.GET)  
  59.     public  @ResponseBody List<User> getTest(Model model,HttpServletResponse response, HttpServletRequest request) {  
  60.         List<User> list = dao.query();  
  61.         String tipString = "";  
  62.         for (int i = 0; i < list.size(); i++) {  
  63.             tipString += list.get(i).toString()+"<br />";  
  64.         }  
  65.         model.addAttribute("tip",tipString);  
  66.         return list;  
  67.     }  
  68. }  

 

 

木有啥好说的….

跟JDBC连接的及DAO层代码和http://www.erdian.net/?p=141是一样的,不再写。

源码:https://github.com/qduningning/SpringAll

spring_restful_json_jdbc