1. 程式人生 > 其它 >【4】控制器Controller

【4】控制器Controller

技術標籤:spring 5springmvc

4、控制器Controller

4.1、控制器Controller

  • 控制器複雜提供訪問應用程式的行為,通常通過介面定義或註解定義兩種方法實現。
  • 控制器負責解析使用者的請求並將其轉換為一個模型。
  • 在Spring MVC中一個控制器類可以包含多個方法
  • 在Spring MVC中,對於Controller的配置方式有很多種

4.2、實現Controller介面

Controller是一個介面,在org.springframework.web.servlet.mvc包下,介面中只有一個方法;

//實現該介面的類獲得控制器功能
public interface Controller
{ //處理請求且返回一個模型與檢視物件 ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception; }

測試

  1. 新建一個Moudle,springmvc-04-controller 。將剛才的03 拷貝一份, 我們進行操作!

    • 刪掉HelloController
    • mvc的配置檔案只留下 檢視解析器!
    <!--檢視解析器:模板引擎 Thymeleaf Freemarker-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    id="internalResourceViewResolver">
    <!--字首--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--字尾--> <property name="suffix" value=".jsp"/> </bean>
  2. 編寫一個Controller類,ControllerTest

    public class ControllerTest
    implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView mv = new ModelAndView(); mv.addObject("msg","Controller測試"); /*跳轉頁面的名字,在ViewResolver中拼接成字串檢視頁面名稱*/ mv.setViewName("controller1"); return mv; } }
  3. 編寫完畢後,去Spring配置檔案中註冊請求的bean;name對應請求路徑,class對應處理請求的類

    <!--BeanNameUrlHandlerMapping將實現類註冊成bean,bean的id就是url-pattern-->
    <bean id="/c1" class="com.kuber.controller.ControllerTest"/>
    
  4. 編寫前端controller1.jsp,注意在WEB-INF/jsp目錄下編寫,對應我們的檢視解析器

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>controller1</title>
    </head>
    <body>
        ${msg}
    </body>
    </html>
    
  5. 配置Tomcat執行測試,我這裡沒有專案釋出名配置的就是一個 / ,所以請求不用加專案名,OK!

    在這裡插入圖片描述

說明:

  • 實現介面Controller定義控制器是較老的辦法
  • 缺點是:一個控制器中只有一個方法,如果要多個方法則需要定義多個Controller;定義的方式比較麻煩;

4.3、使用註解@Controller

  • @Controller註解型別用於宣告Spring類的例項是一個控制器(在講IOC時還提到了另外3個註解);

  • Spring可以使用掃描機制來找到應用程式中所有基於註解的控制器類,為了保證Spring能找到你的控制器,需要在配置檔案中宣告元件掃描。此時不再需要註冊bean標籤

        <context:component-scan base-package="com.kuber.controller"/>
        <mvc:default-servlet-handler/>
        <mvc:annotation-driven/>
        <!--檢視解析器:模板引擎 Thymeleaf Freemarker-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
            <!--字首-->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!--字尾-->
            <property name="suffix" value=".jsp"/>
        </bean>
    
  • 增加一個ControllerTest2類,使用註解實現;

    @Controller/*代表這個類會被spring接管,
                   標有這個註解的類的所有方法如果其返回值為string,
                   並且返回值為相應的跳轉介面的名稱,那麼就會被檢視解析器解析*/
    public class ControllerTest2 {
    
        @RequestMapping("c2")
        public String test1(Model model){
            //Spring MVC會自動例項化一個Model物件用於向檢視中傳值
            model.addAttribute("msg","Controller測試2");
    		//返回檢視位置
            return "controller1";
        }
    }
    
  • 執行tomcat測試

    在這裡插入圖片描述

可以發現,我們的兩個請求都可以指向一個檢視,但是頁面結果的結果是不一樣的,從這裡可以看出檢視是被複用的,而控制器與檢視之間是弱偶合關係。

註解方式是平時使用的最多的方式!

4.4、RequestMapping

@RequestMapping

  • @RequestMapping註解用於對映url到控制器類或一個特定的處理程式方法。可用於類或方法上。用於類上,表示類中的所有響應請求的方法都是以該地址作為父路徑。

  • 為了測試結論更加準確,我們可以加上一個專案名測試 myweb

  • 只註解在方法上面

    @Controller
    public class TestController {
       @RequestMapping("/h1")
       public String test(){
           return "test";
      }
    }
    

    訪問路徑:http://localhost:8080 / 專案名 / h1

  • 同時註解類與方法

    @Controller
    @RequestMapping("/admin")
    public class TestController {
       @RequestMapping("/h1")
       public String test(){
           return "test";
      }
    }
    

    訪問路徑:http://localhost:8080 / 專案名/ admin /h1 , 需要先指定類的路徑再指定方法的路徑;