【後端】SpringMVC Controller(介面定義 & 註解開發)
阿新 • • 發佈:2021-08-24
✨控制器Controller
- 控制器複雜提供訪問應用程式的行為,通常通過介面定義或註解定義兩種方法實現。
- 控制器負責解析使用者的請求並將其轉換為一個模型。
- 在 SpringMVC 中一個控制器類可以包含多個方法
- 在 SpringMVC 中,對於Controller的配置方式有很多種
✨專案環境搭建
新建Maven專案
匯入依賴
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.9</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> </dependencies>
新增Web框架支援
在新建模組根目錄右鍵 -> 新增框架支援
選擇 Web 應用程式 注意版本:4.0
配置DispatchServlet
在 web/WEB-INF
下修改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"> <!-- 配置DispatchServlet--> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!-- 繫結SpringMVC配置檔案--> <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>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
配置SpringMVC
在src/main/resources
目錄下新建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"> <context:component-scan base-package="com.example.controller"/> <mvc:default-servlet-handler/> <mvc:annotation-driven/> <!-- 檢視解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 字首--> <property name="prefix" value="/WEB-INF/jsp/"/> <!-- 字尾--> <property name="suffix" value=".jsp"/> </bean> </beans>
前端JSP
在web/WEB-INF
下新建目錄jsp
在web/WEB-INF/jsp
目錄下新建test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
配置Tomcat
新增Tomcat配置後 在“部署”選擇對應工件
✨實現方式一:介面定義
實現Controller介面
在src/main/java
下新建軟體包com.example.controller
新建類ControllerTest01
package com.example.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 ControllerTest01 implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", "ControllerTest01");
modelAndView.setViewName("test");
return modelAndView;
}
}
注入Controller
在springmvc-servlet.xml
中注入Controller
<bean name="/test01" class="com.example.controller.ControllerTest01"/>
/test01
為url跳轉地址
啟動Tomcat服務後在url後輸入/test01
專案結構修改
在專案結構設定中選擇“工件”
在WEB-INF
目錄下新建lib
目錄
在lib
目錄右鍵 -> 新增副本 -> 庫檔案
選擇新增所有外部庫
測試
重啟Tomcat服務 在url後輸入/test01
測試成功
過程詳解
此時專案結構如下
- 接收到url引數
/test01
時由ControllerTest01
中的handleRequest
方法返回名稱為test
的modelAndView
- 檢視解析器根據檢視名稱
test
拼接得到/WEB-INF/jsp/test.jsp
定位到資源 - 將test中的
${msg}
渲染為handleRequest
方法返回的modelAndView
中的msg
對應資料
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", "ControllerTest01");
modelAndView.setViewName("test");
return modelAndView;
}
<!-- 檢視解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!-- 字首-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 字尾-->
<property name="suffix" value=".jsp"/>
</bean>
✨實現方式一:註解開發
Controller類
在src/main/java
下的軟體包com.example.controller
中
新建類ControllerTest02
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
//代表這個類被Spirng接管 被註解的類中的所有方法 如果返回值是String 並且有具體頁面可以跳轉 就會被檢視解析器解析
public class ControllerTest02 {
// /test02 對映到該方法 返回test檢視
@RequestMapping("/test02")
public String test02(Model model){
model.addAttribute("msg", "ControllerTest02");
// 返回檢視名稱
return "test";
}
@RequestMapping("/test03")
public String test03(Model model){
model.addAttribute("msg", "ControllerTest03");
return "test";
}
}
SpringMVC配置解析
之前在springmvc-servlet
有如下配置項
<context:component-scan base-package="com.example.controller"/>
<mvc:default-servlet-handler/>
<mvc:annotation-driven/>
作用如下
<!-- 自動掃描包 讓指定包下的註解生效 由IoC容器統一管理 -->
<context:component-scan base-package="com.example.controller"/>
<!-- 讓SpringMVC不處理靜態資源 -->
<mvc:default-servlet-handler/>
<!--
支援mvc註解驅動
在spring中一般採用@RequestMapping註解來完成對映關係
要想使@RequestMapping註解生效
必須向上下文中註冊DefaultAnnotationHandlerMapping
和一個AnnotationMethodHandlerAdapter例項
這兩個例項分別在類級別和方法級別處理。
而annotation-driven配置幫助我們自動完成上述兩個例項的注入。
-->
<mvc:annotation-driven/>
測試
重啟Tomcat服務 在url後輸入/test02
與/test03
測試成功
過程詳解
此時專案結構如下
- 接收到url引數
/test02
時由ControllerTest02
中的test02
方法返回檢視名稱test
- 檢視解析器根據檢視名稱
test
拼接得到/WEB-INF/jsp/test.jsp
定位到資源 - 將test中的
${msg}
渲染為handleRequest
方法返回的modelAndView
中的msg
對應資料
// /test02 對映到該方法 返回test檢視
@RequestMapping("/test02")
public String test02(Model model){
model.addAttribute("msg", "ControllerTest02");
// 返回檢視名稱
return "test";
}
✨參考及引用
https://www.bilibili.com/video/BV1aE41167Tu?p=8
狂神說SpringMVC04:資料處理及跳轉 (qq.com)
⭐轉載請註明出處
本文作者:雙份濃縮馥芮白
原文連結:https://www.cnblogs.com/Flat-White/p/15182672.html
版權所有,如需轉載請註明出處。