3 Controller(控制器)和RestFul風格
控制器Controller
- 控制器負責提供訪問應用程式的行為,通常通過介面定義或注解定義兩種方法實作,
- 控制器負責決議用戶的請求并將其轉換為一個模型,
- 在Spring MVC中一個控制器類可以包含多個方法,
- 在Spring MVC中,對于Controller的配置方式有很多種,
module:springmvc-04-controller
環境搭建
添加web框架支持,以及Artifacts中的lib配置!
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--1 配置DispatcherServlet-->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--自動掃描包,讓指定包下的注解生效,由IOC容器統一管理-->
<context:component-scan base-package="com.zzb.controller"/>
<!--讓Spring MVC不處理靜態資源,例如.mp3 .css .jpg等不走視圖決議器-->
<mvc:default-servlet-handler/>
<!--
支持mvc注解驅動
在spring中一般采用@RequestMapping注解來完成映射關系
要想使@RequestMapping注解生效
必須向背景關系中注冊DefaultAnnotationHandlerMapping
和一個AnnotationMethodHandlerAdapter實體
這兩個實體分別在類級別和方法級別處理,
而annotation-driven配置幫助我們自動完成上述兩個實體的注入
-->
<mvc:annotation-driven/>
<!--視圖決議器-->
<bean id="InternalResourceViewResolver">
<!--前綴-->
<property name="prefix" value="https://www.cnblogs.com/WEB-INF/jsp/"/>
<!--后綴-->
<property name="suffix" value="https://www.cnblogs.com/zzbstudy/archive/2020/12/11/.jsp"/>
</bean>
</beans>
代碼實作
實作Controller介面
Controller是一個介面,在org.springframework.web.servlet.mvc包下,介面中只有一個方法;
@FunctionalInterface
public interface Controller {
@Nullable
ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}
1、撰寫一個ControllerTest1類,實作Contoller介面
package com.zzb.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ControllerTest1 implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
// 創建模型視圖
ModelAndView modelAndView = new ModelAndView();
// 呼叫業務層
String msg = "ControllerTest1";
modelAndView.addObject("msg", msg);
// 設定跳轉視圖
modelAndView.setViewName("test");
return modelAndView;
}
}
2、去Spring組態檔中注冊請求的bean,name或id對應請求路徑,class對應處理請求的類
<bean id="/t1" />
3、撰寫前端展示頁面test.jsp,注意在WEB-INF/jsp目錄
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
4、配置Tomcat,啟動測驗!
測驗結果:

說明:
- 實作Controller介面定義控制器的方法比較老了,一般不推薦使用!
- 缺點是一個控制器只有一個方法,如果要多個方法則需要定義多個Controller,
使用注解@Controller
-
@Controller注解型別用于宣告Spring類的實體是一個控制器(在講IOC時還提到了另外3個注解);
-
Spring可以使用掃描機制來找到應用程式中所有基于注解的控制器類,為了保證Spring能找到你的控制器,需要在組態檔中宣告組件掃描,
<!--自動掃描包,讓指定包下的注解生效,由IOC容器統一管理-->
<context:component-scan base-package="com.zzb.controller"/>
- 增加一個ControllerTest2類,使用注解!
package com.zzb.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ControllerTest2 {
@RequestMapping("/t2")
public String test2(Model model){
model.addAttribute("msg", "ControllerTest2");
// 回傳視圖位置
return "test";
}
}
- 啟動Tomcat測驗

可以發現,我們的兩個請求都可以指向一個視圖,但是頁面結果的結果是不一樣的,從這里可以看出視圖是被復用的,而控制器與視圖之間是弱偶合關系,
注解方式是平時使用的最多的方式!
RequestMapping
@RequestMapping
@RequestMapping注解用于映射url到控制器類或一個特定的處理程式方法,可用于類或方法上,用于類上,表示類中的所有回應請求的方法都是以該地址作為父路徑,
package com.zzb.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/myweb")
public class ControllerTest2 {
@RequestMapping("/t2")
public String test2(Model model){
model.addAttribute("msg", "ControllerTest2");
// 回傳視圖位置
return "test";
}
}

注意觀察url
RestFul 風格
概念
Restful就是一個資源定位及資源操作的風格,不是標準也不是協議,只是一種風格,基于這個風格設計的軟體可以更簡潔,更有層次,更易于實作快取等機制,
功能
資源:互聯網所有的事物都可以被抽象為資源
資源操作:使用POST、DELETE、PUT、GET,使用不同方法對資源進行操作,
分別對應 添加、 洗掉、修改、查詢,
傳統方式操作資源 :通過不同的引數來實作不同的效果!方法單一,post 和 get
? http://127.0.0.1/item/queryItem.action?id=1 查詢,GET
? http://127.0.0.1/item/saveItem.action 新增,POST
? http://127.0.0.1/item/updateItem.action 更新,POST
? http://127.0.0.1/item/deleteItem.action?id=1 洗掉,GET或POST
使用RESTful操作資源 :可以通過不同的請求方式來實作不同的效果!如下:請求地址一樣,但是功能可以不同!
? http://127.0.0.1/item/1 查詢,GET
? http://127.0.0.1/item 新增,POST
? http://127.0.0.1/item 更新,PUT
? http://127.0.0.1/item/1 洗掉,DELETE
代碼實作
1、新建一個RestFulController
package com.zzb.controller;
import org.springframework.stereotype.Controller;
@Controller
public class RestFulController {
}
2、在Spring MVC中可以使用 @PathVariable 注解,讓方法引數的值對應系結到一個URI模板變數上,
package com.zzb.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class RestFulController {
@RequestMapping("/t3/{p1}/{p2}")
public String test3(@PathVariable int p1,@PathVariable int p2, Model model){
int result = p1 + p2;
model.addAttribute("msg", result);
return "test";
}
}
3、測驗

使用路徑變數的好處?
-
使路徑變得更加簡潔;
-
獲得引數更加方便,框架會自動進行型別轉換;
-
通過路徑變數的型別可以約束訪問引數,如果型別不一樣,則訪問不到對應的請求方法,如這里訪問是的路徑是/t3/1/a,則路徑與方法不匹配,而不會是引數轉換失敗,

4、修改引數型別,再次測驗
package com.zzb.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class RestFulController {
@RequestMapping("/t3/{p1}/{p2}")
public String test3(@PathVariable int p1,@PathVariable String p2, Model model){
String result = p1 + p2;
model.addAttribute("msg", result);
return "test";
}
}
測驗結果:

使用method屬性指定請求型別
用于約束請求的型別,可以收窄請求范圍,指定請求謂詞的型別如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等
測驗:
1、增加一個方法
// 映射訪問路徑,必須是post請求
@RequestMapping(value = "https://www.cnblogs.com/t4", method = {RequestMethod.POST})
public String test4(Model model){
model.addAttribute("msg", "Hello");
return "test";
}
2、使用瀏覽器地址欄進行訪問默認是Get請求,會報錯405

3、將指定方法從POST改為GET
@RequestMapping(value = "https://www.cnblogs.com/t4", method = {RequestMethod.GET})

總結:
Spring MVC 的 @RequestMapping 注解能夠處理 HTTP 請求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH,
所有的地址欄請求默認都會是 HTTP GET 型別的,
方法級別的注解變體有如下幾個:組合注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@GetMapping 是一個組合注解,平時使用的會比較多!
它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一個快捷方式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/233404.html
標籤:其他
上一篇:2 第一個MVC程式
