SpringMVC-03 RestFul和控制器
SpringMVC-03 RestFul和控制器
控制器Controller
- 控制器複雜提供訪問應用程序的行為,通常通過接口定義或註解定義兩種方法實現。
- 控制器負責解析用戶的請求並將其轉換為一個模型。
- 在Spring MVC中一個控制器類可以包含多個方法
- 在Spring MVC中,對於Controller的配置方式有很多種
RequestMapping
註解方式是平時使用的最多的方式!
@RequestMapping
-
@RequestMapping註解用於映射url到控制器類或一個特定的處理程序方法。可用於類或方法上。用於類上,表示類中的所有響應請求的方法都是以該地址作為父路徑。
-
為了測試結論更加準確,我們可以加上一個項目名測試
只註解在方法上面
@Controller
public class TestController {
@RequestMapping("/h1")
public String test(){
return "test";
}
}
訪問路徑://localhost:8080 / 項目名 / h1
同時註解類與方法
@Controller
@RequestMapping("/admin")
public class TestController {
@RequestMapping("/h1")
public String test(){
return "test";
}
}
訪問路徑://localhost:8080 / 項目名/ admin /h1
RestFul 風格
1.概念
Restful就是一個資源定位及資源操作的風格。不是標準也不是協議,只是一種風格。基於這個風格設計的軟件可以更簡潔,更有層次,更易於實現緩存等機制。
2.功能
資源:互聯網所有的事物都可以被抽象為資源
資源操作:使用POST
、DELETE
、PUT
、GET
,使用不同方法對資源進行操作。
分別對應 添加、 刪除、修改、查詢。
傳統方式操作資源 :通過不同的參數來實現不同的效果,方法單一,post 和 get
//localhost:8080/item/queryItem.action?id=1 查詢,GET
//localhost:8080/item/saveItem.action 新增,POST
//localhost:8080/item/updateItem.action 更新,POST
//localhost:8080/item/deleteItem.action?id=1 刪除,GET或POST
使用RESTful操作資源 :可以通過不同的請求方式來實現不同的效果。如下:請求地址一樣,但是功能可以不同。
//localhost:8080/item/1 查詢,GET
//localhost:8080/item 新增,POST
//localhost:8080/item 更新,PUT
//localhost:8080/item/1 刪除,DELETE
3.案例測試
3.1 編寫web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="//xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//xmlns.jcp.org/xml/ns/javaee //xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.2 創建springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="//www.springframework.org/schema/beans"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xmlns:context="//www.springframework.org/schema/context"
xmlns:mvc="//www.springframework.org/schema/mvc"
xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd //www.springframework.org/schema/context //www.springframework.org/schema/context/spring-context.xsd //www.springframework.org/schema/mvc //www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="Controller"/>
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
<!-- 添加 視圖解析器 -->
<!--視圖解析器:DispatcherServlet給他的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<!--前綴-->
<property name="prefix" value="/jsp/"/>
<!--後綴-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
3.3 新建一個Controller類
@Controller
public class RestFulController {
//映射訪問路徑
@RequestMapping("/commit/{p1}/{p2}")
public String index(@PathVariable int p1, @PathVariable int p2, Model model){
int result = p1+p2;
//Spring MVC會自動實例化一個Model對象用於向視圖中傳值
model.addAttribute("msg", "結果:"+result);
//返回視圖位置
return "test";
}
}
3.4 創建test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>RestFul</title>
</head>
<body>
${msg}
</body>
</html>
3.5 配置Tomcat,測試
思考:使用路徑變量的好處?
-
- 使路徑變得更加簡潔;
- 獲得參數更加方便,框架會自動進行類型轉換;
- 通過路徑變量的類型可以約束訪問參數,如果類型不一樣,則訪問不到對應的請求方法,如這裡訪問是的路徑是
/commit/1/a
,則路徑與方法不匹配,而不會是參數轉換失敗;
3.6 修改參數類型
@Controller
public class RestFulController {
//映射訪問路徑
@RequestMapping("/commit/{p1}/{p2}")
public String index(@PathVariable int p1, @PathVariable String p2, Model model){
String result = p1+p2;
//Spring MVC會自動實例化一個Model對象用於向視圖中傳值
model.addAttribute("msg", "結果:"+result);
//返回視圖位置
return "test";
}
}
3.7 指定請求類型
使用method屬性指定請求類型
用於約束請求的類型,可以收窄請求範圍。指定請求謂詞的類型如GET
, POST
, HEAD
, OPTIONS
, PUT
, PATCH
, DELETE
, TRACE
……
我們來測試一下:
- 增加一個方法:
//映射訪問路徑,必須是POST請求
@RequestMapping(value = "/hello",method = {RequestMethod.POST})
public String index2(Model model){
model.addAttribute("msg", "hello!");
return "test";
}
- 我們使用瀏覽器地址欄進行訪問默認是Get請求,會報錯405:
如果將POST修改為GET則正常了
HTTP 請求
我們正常發送HTTP請求,可以正常發送的只有GET
、POST
,而在RestFul風格中PUT
、DELETE
,PATCH
則不能直接發送,可以使用以下方法:
1.配置web.xml
<!-- HTTP PUT Form -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.編寫form表單
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form method="POST" action="put">
<input type="hidden" name="_method" value="PUT">
<p>姓名:</p><input type="text" name="name" /><br/>
<p>性別:</p><input type="text" name="sex" /><br/>
<p>年齡:</p><input type="text" name="age" /><br/>
<button type="submit">提交</button>
</form>
</body>
</html>
form表單中有一個隱藏的input
,name必須為_method
,value=”xxx”即為xxx請求。
3.編寫Controller類
@Controller
public class RestFulController {
@PutMapping("/put")
@ResponseBody
public String index3(HttpServletRequest req, HttpServletResponse resp){
String name = req.getParameter("name");
String sex = req.getParameter("sex");
String age = req.getParameter("age");
return "name:" + name + ",sex:" + sex + ",age:" + age;
}
}
注意:
這裡可以使用 @RequestMapping(value = “/put”,method = {RequestMethod.PUT})
也可以直接使用: @PutMapping(“/put”)
由上面可以看出:
是method設置不同類型的請求
或者
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
4.測試
會發現填寫的中文
都成為了?
,這時候可以嘗試在web.xml
中設置字符過濾器
:
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
這種過濾器對大部分中文亂碼都有用了,但是還有一種情況為json中文亂碼:
導入依賴
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
在springmvc.xml中配置
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>