SpringMVC簡單構造restful, 并返回json

jopen 10年前發布 | 232K 次閱讀 SpringMVC Spring MVC Web框架

文章要要點:

  1. 快速搭建構造restful的StringMvc

  2. GET, POST , PUT , DELETE的各種調用

  3. 同一資源 多種表述 (ContentNegotiatingViewResolver解析器),既可以返回對象給JSP, 也可以返回JSON

快速搭建構造restful的StringMvc

首現搭建一個簡單的restfulMvc框架,  并上配置文件, 后期會增加帶JSON返回值的配置

JAR包

SpringMVC簡單構造restful, 并返回json

web.xml配置

<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 可以自定義servlet.xml配置文件的位置和名稱,默認為WEB-INF目錄下,名稱為[<servlet-name>]-servlet.xml,如spring-servlet.xml-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:config/spring-servlet.xml</param-value><!-- 現定義為src下config包里(個人習慣) -->
    </init-param>
    <load-on-startup>1</load-on-startup>
   </servlet>
  
 <servlet-mapping>
     <servlet-name>spring</servlet-name>
     <url-pattern>/api/*</url-pattern>
 </servlet-mapping>
 
 <!-- Spring配置 -->
 <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 
 <!-- 指定Spring Bean的配置文件所在目錄。默認配置在WEB-INF目錄下 -->
 <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath:config/applicationContext-*.xml</param-value>
 </context-param>

spring-servlet.xml配置

 <!-- 啟動注解驅動的Spring MVC功能,注冊請求url和注解POJO類方法的映射-->  
 <mvc:annotation-driven />  
 <!-- 啟動包掃描功能,以便注冊帶有@Controller、@Service、@repository、@Component等注解的類成為spring的bean -->  
 <context:component-scan base-package="com.dsp" />  
    
 <!-- 對模型視圖名稱的解析,在請求時模型視圖名稱添加前后綴 -->  
 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />

applicationContext.xml暫時沒寫東西

該配置的配置完了,下面就是寫第一個HelloWord

package com.dsp.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Scope("prototype")//單列模式
@Controller
@RequestMapping("/products")
public class TestController{
 
 /**
  * 測試方法,HelloWord
  * @param request
  * @param response
  * @return
  * @throws Exception
  */
 @RequestMapping(value="/list",method=RequestMethod.GET)
    public String getProducts(HttpServletRequest request,HttpServletResponse response) throws Exception {
  
        request.setAttribute("name", "helloWord");
        
        return "products/list";
        
    }
}

@Scope("##") : spring默認的Scope是單列模式(singleton),顧名思義,肯定是線程不安全的.  而@Scope("prototype")

    可以保證每個請求都會創建一個新的實例,  還有幾個參數: session  request

    @Scope("session")的意思就是,只要用戶不退出,實例就一直存在,

    request : 就是作用域換成了request

@Controller : 不多做解釋 , 標注它為Controller

@RequestMapping :是一個用來處理請求地址映射的注解,可用于類或方法上。用于類上,表示類中的所有響應請求的方法都是   以該地址作為父路徑。 比如現在訪問getProducts方法的地址就是 :

   http://localhost:8080/項目名/上面web.xml配置(api)/products/list

  l

暫時先介紹兩個屬性 value和method

具體可以參考我參考的文章 http://blog.sina.com.cn/s/blog_72827fb10101pl9i.html

value: 就是映射的實際地址,這個上面有說過,  而重要的是里面的值 , 有幾個比較感興趣的

   1. 正常的 /list                          訪問地址類似 http://localhost:8080/項目名/api/products/list

   2. 帶參數的 /info/{proId}          訪問地址類似 http://localhost:8080/項目名/api/products/info/0001

method: 請求的method類型 GET POST PUT DELETE等

好,做個測試 JSP代碼:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title> 你好</title>
</head>
<body>
${name }
</body>
</html>

地址欄輸入 http://localhost:8080/RestFulMvc/api/products/list

得到結果

SpringMVC簡單構造restful, 并返回json

 

 

GET, POST , PUT , DELETE的各種調用

剛才寫的是第一種GET, 第二種GET:

@RequestMapping(value="/info/{proId}",method=RequestMethod.GET)
    public String getProductInfo(@PathVariable String proId, HttpServletRequest request,HttpServletResponse response) throws Exception {
  
          request.setAttribute("name", proId);
          
          return "products/list";
        
    }

@PathVariable注解獲取的就是大括號里的值

測試 : 輸入地址 http://localhost:8080/RestFulMvc/api/products/info/00001

測試結果為

SpringMVC簡單構造restful, 并返回json

如果不用@PathVariable接收大括號里的值,也可以用bean來接收:

public String getProductInfo(Product pro, HttpServletRequest request,HttpServletResponse response)...

而且也可以設置多個參數

@RequestMapping(value="/info/{pid}/{pname}",method=RequestMethod.GET)

讓我們看下面這段代碼

@RequestMapping(value="/info/{pid}/{pname}",method=RequestMethod.GET)
    public String getProductInfo(Product pro, HttpServletRequest request,HttpServletResponse response) throws Exception {
  
  request.setAttribute("name", pro.getPid()+"___"+pro.getPname());
  
  return "products/list";
        
    }

訪問地址: http://localhost:8080/RestFulMvc/api/products/info/00001/23123

得到的結果為 :

SpringMVC簡單構造restful, 并返回json

 

下面介紹POST的調用

list.jsp新增form表單如下

<body>
    ${name }
    <form action="<%=basePath%>/api/products/info" method="post">
         <input type="text" name="pid"/> 
         <input type="text" name="pname"/> 
         <input type="submit"/>
    </form>
</body>

JAVA代碼

@RequestMapping(value="/info",method=RequestMethod.POST)
    public String insertProduct(Product pro, HttpServletRequest request,HttpServletResponse response) throws Exception {
  
        request.setAttribute("name", pro.getPid()+"___"+pro.getPname());
        
        return "products/list";
        
    }

form提交后結果為

SpringMVC簡單構造restful, 并返回json

執行成功.

正常的FORM提交 , 只需要用對象接就可以了

 

同一資源 多種表述

如果寫完一個方法,返回request到JSP, 可同時手機端需要調接口怎么辦, 如果前臺的一層皮換成了以nodejs為服務的框架調用怎么辦

可以每個需求再寫一個方法返回JSON, 可下面這個可以同一資源,多種返回

spring-servlet.xml加入如下配置

 <!-- ContentNegotiatingViewResolver視圖解析器,利用他就可以配置多種返回值 -->
 <bean  class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">   
      
   <!-- 這里是否忽略掉accept header,默認就是false -->
   <property name="ignoreAcceptHeader" value="true" />   
   
   <!-- 如果所有的mediaType都沒匹配上,就會使用defaultContentType -->
   <property name="defaultContentType" value="text/html" />   
   
   <property name="mediaTypes">    
    <map>     
     <entry key="json" value="application/json" />      
     <entry key="xml" value="application/xml" />      
    </map>    
   </property>   
  <!-- 默認使用MappingJacksonJsonView生成jsonview-->
  <property name="defaultViews">    
    <list>     
     <bean  class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">        
         <property  name="extractValueFromSingleKeyModel" value="true" />     
      </bean>        
      <bean  class="org.springframework.web.servlet.view.xml.MarshallingView">      
       <property name="marshaller">        
        <bean  class="org.springframework.oxm.xstream.XStreamMarshaller" />        
      </property>      
      </bean>      
     </list>     
    </property>  
  </bean>

 

這樣同一個地址,只要在后面加 .json  mediaTypes就可以把 http://localhost:8080/RestFulMvc/api/products/info/00001/23123.json 的 .json映射到application/json

值得注意的是, 如果不加 <property  name="extractValueFromSingleKeyModel" value="true" />

得出來的Product對象的JSON為

{"product":{"pid":"00001","pname":"23123"}}

如果想要的結果為

{"pid":"00001","pname":"23123"}

則不要前面的對象名稱包在外面時, 請加上它

 

后臺代碼

@RequestMapping(value={"/info/{pid}","/info/{pid}.json"},method=RequestMethod.GET)
    public ModelAndView getProductInfo(@PathVariable String pid, HttpServletRequest request,HttpServletResponse response) throws Exception {
  
          Map<String,Object> map = new HashMap<String,Object>();
          
          Product pro = new Product();
          pro.setPid(pid);
          map.put("name", pid);
          map.put("pro", pro);
          
          ModelAndView mav=new ModelAndView("products/list",map);
          
          return mav;
        
    }

 

測試: 輸入地址 :  http://localhost:8080/RestFulMvc/api/products/info/00001.json

 

得到的結果為

{"pro":{"pid":"00001","pname":null},"name":"00001"}

 

ModelAndView是springmvc自帶的重定向方法

第一個參數是返回的地址,和以往一樣,  第二個參數以后, 是傳給前臺的值 .

如果有第二個參數, 沒有第三個參數 , 那第二個參數只能是map的

也可以第二個參數為建, 第三個參數為值的方式傳給前臺,  具體大家可以new一個ModelAndView看看它提供的構造方法

 

 

最后 如果是nodejs  ajax提交的數據,以application/json格式提交時,

接收參數可以在參數前加 @@RequestBody

public ModelAndView getProductInfo(@RequestBody Product pro, HttpServletRequest request .....

它可以把json轉換為對象里的屬性

來自:http://my.oschina.net/u/2272916/blog/352297

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!