文章要要點:javascript
快速搭建構造restful的StringMvchtml
GET, POST , PUT , DELETE的各類調用java
同一資源 多種表述 (ContentNegotiatingViewResolver解析器),既能夠返回對象給JSP, 也能夠返回JSONnode
快速搭建構造restful的StringMvcjquery
首現搭建一個簡單的restfulMvc框架, 並上配置文件, 後期會增長帶JSON返回值的配置web
JAR包ajax
web.xml配置spring
<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配置json
<!<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <!-- 啓動註解驅動的Spring MVC功能,註冊請求url和註解POJO類方法的映射--> <mvc:annotation-driven /> <!-- 啓動包掃描功能,以便註冊帶有@Controller、@Service、@repository、@Component等註解的類成爲spring的bean --> <context:component-scan base-package="com.esb" /> <!-- 對模型視圖名稱的解析,在請求時模型視圖名稱添加先後綴 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" /> </beans>
applicationContext.xml暫時沒寫東西api
該配置的配置完了,下面就是寫第一個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
獲得結果
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
測試結果爲
若是不用@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
獲得的結果爲 :
下面介紹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提交後結果爲
執行成功.
正常的FORM提交 , 只須要用對象接就能夠了
補上 PUT DELETE 就和表單不同了, 由於表單只支持GET和POST
這時候就須要用到ajax, 或者nodejs調用
貼上jsp代碼
<script type="text/javascript" src='<%=basePath%>/public/js/jquery-2.1.0.min.js'></script> <script type="text/javascript"> function savepro(){ var saveData = {"pid":"aa"}; //發送給服務器的JSON $.ajax({ type : "PUT", url : "/RestFulMvc/api/products/info.json", data:JSON.stringify(saveData), contentType:"application/json", //發送至服務器的類型 dataType : "json", //預期服務器返回類型 success: function(data){ alert(data); } }) } </script> </head> <body> <div> <input type="button" value="保存" onclick="savepro()"/> </div> </body>
後臺代碼
@RequestMapping(value="/info",method=RequestMethod.PUT) public ModelAndView updateProduct(@RequestBody Product pro, HttpServletRequest request,HttpServletResponse response) throws Exception { Map<String,Object> map1 = new HashMap<String,Object>(); map1.put("pid", pro.getPid()); ModelAndView mav=new ModelAndView("products/list",map1); return mav; }
和以往不同的是, 後臺接收參數的對象前面 加了個@RequestBody , 這個是用於把傳來的JSON 轉換成接收的對象, 若是是form提交就不須要了, 但若是前臺用的是application/json類型傳進來,就必定要加@RequestBody
獲得的結果:
同一資源 多種表述
若是寫完一個方法,返回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}"},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轉換爲對象裏的屬性