springmvc的核心Controller簡介
控制器Controller
- 控制器複雜提供通路應用程式的行為,通常通過接口定義或注解定義兩種方法實作。
- 控制器負責解析使用者的請求并将其轉換為一個模型。
- 在Spring MVC中一個控制器類可以包含多個方法
- 在Spring MVC中,對于Controller的配置方式有很多種
以下是兩種編寫Controller的方式
實作Controller接口
Controller是一個接口,在org.springframework.web.servlet.mvc包下,接口中隻有一個方法;
//實作該接口的類獲得控制器功能
public interface Controller {
//處理請求且傳回一個模型與視圖對象
ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}
測試
- 建立一個Moudle,springmvc-04-controller 。
- mvc的配置檔案隻留下 視圖解析器!
- 編寫一個Controller類,ControllerTest1
//定義控制器 //注意點:不要導錯包,實作Controller接口,重寫方法; public class ControllerTest1 implements Controller { public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //傳回一個模型視圖對象 ModelAndView mv = new ModelAndView(); mv.addObject("msg","Test1Controller"); mv.setViewName("test"); return mv; } }
- 編寫完畢後,去Spring配置檔案中注冊請求的bean;name對應請求路徑,class對應處理請求的類
- 編寫前端test.jsp,注意在WEB-INF/jsp目錄下編寫,對應我們的視圖解析器
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Kuangshen</title> </head> <body> ${msg} </body> </html>
- 配置Tomcat運作測試,我這裡沒有項目釋出名配置的就是一個 / ,是以請求不用加項目名,OK!
說明:
- 實作接口Controller定義控制器是較老的辦法
- 缺點是:一個控制器中隻有一個方法,如果要多個方法則需要定義多個Controller;定義的方式比較麻煩;
使用注解@Controller( 常用
)
常用
- @Controller注解類型用于聲明Spring類的執行個體是一個控制器(在講IOC時還提到了另外3個注解);
- Spring可以使用掃描機制來找到應用程式中所有基于注解的控制器類,為了保證Spring能找到你的控制器,需要在配置檔案中聲明元件掃描。
<!-- 自動掃描指定的包,下面所有注解類交給IOC容器管理 --> <context:component-scan base-package="com.kuang.controller"/>
- 增加一個ControllerTest2類,使用注解實作;
//@Controller注解的類會自動添加到Spring上下文中 @Controller public class ControllerTest2{ //映射通路路徑 @RequestMapping("/t2") public String index(Model model){ //Spring MVC會自動執行個體化一個Model對象用于向視圖中傳值 model.addAttribute("msg", "ControllerTest2"); //傳回視圖位置 return "test"; } }
- 運作tomcat測試
可以發現,我們的兩個請求都可以指向一個視圖,但是頁面結果的結果是不一樣的,從這裡可以看出視圖是被複用的,而控制器與視圖之間是弱偶合關系。
注解方式是平時使用的最多的方式!
@RequestMapping
- @RequestMapping注解用于映射url到控制器類或一個特定的處理程式方法。可用于類或方法上。用于類上,表示類中的所有響應請求的方法都是以該位址作為父路徑。
- 為了測試結論更加準确,我們可以加上一個項目名測試 myweb
- 隻注解在方法上面
通路路徑:http://localhost:8080 / 項目名 / h1@Controller public class TestController { @RequestMapping("/h1") public String test(){ return "test"; } }
- 同時注解類與方法
通路路徑:http://localhost:8080 / 項目名/ admin /h1 , 需要先指定類的路徑再指定方法的路徑;@Controller @RequestMapping("/admin") public class TestController { @RequestMapping("/h1") public String test(){ return "test"; } }
Controller的使用
Controller結果跳轉方式【springmvc】
Controller 接收資料+顯示資料【springmvc】