【后端】SpringMVC Controller(接口定义 & 注解开发)
✨控制器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
狂神说SpringMVC03:RestFul和控制器 (qq.com)
⭐转载请注明出处
本文作者:双份浓缩馥芮白
原文链接:https://www.cnblogs.com/Flat-White/p/15182672.html
版权所有,如需转载请注明出处。