【SpringMVC】SpringMVC基础教程(3)
前言:
本文内容:使用注解开发SpringMVC、Controller配置总结、RequestMapping说明
推荐免费SpringMVC基础教程视频:【狂神说Java】SpringMVC最新教程IDEA版通俗易懂_哔哩哔哩_bilibili
使用注解开发SpringMVC
使用注解
-
新建module
springmvc-04-annotation
,添加web支持 -
由于Maven可能存在资源过滤问题,我们将配置完善
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build> -
在pom.xml文件引入相关的依赖
主要有SpringMVC,servlet,jstl等,我们之前在父类已经引入了
-
配置web.xml
配置注意点:
- 注意web.xml版本问题,要最新版
- 注册
DispatcherServlet
- 关联SpringMVC的配置文件
- 启动级别为1
- 映射路径为/(使用/*可能会导致报错)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<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">
<!-- 配置DispatcherServlet-->
<servlet>
<servlet-name>springMVC</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>
<!-- 启动级别 1-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app> -
添加Spring-MVC配置文件
- 让IOC的注解生效
- 静态资源过滤:HTML,JS,CSS,图片,视频…
- MVC的注解驱动
- 配置视图解析器
在resources目录下添加
springmvc-servlet.xml
的配置文件,配置的形式与Spring容器配置基本类似,为了支持基于注解的IOC,设置了自动扫描包功能,配置如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--自动扫描包,让指定包下的注解生效,由IOC容器统一管理-->
<context:component-scan base-package="com.jokerdig.controller"/>
<!--过滤静态资源,让SpringMVC不处理静态资源 .css .js .html等等-->
<mvc:default-servlet-handler/>
<!--
支持mvc注解驱动
在spring中一般用@RequestMapping注解完成映射关系
要想使@RequestMapping注解生效
必须向上下文中注册DefaultAnnotationHandLerMapping(处理器映射器)
和一个AnnotationMethodHandLerAdapter(处理器适配器)实例
这两个实例分别在类级别和方法级别处理
annotation-driven配置帮助我们自动完成上述两个实例的注入
-->
<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>在试图解析器中我们把所有的视图都存放在/WEB-INF/目录下,可以保证视图安全,因为这个目录下的文件,客户端不能直接访问
-
创建Controller
编写一个控制类
HelloController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23package com.jokerdig.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author Joker大雄
* @data 2022/6/1 - 11:58
**/
public class HelloController {
// 真实访问地址 项目名/HelloController/hello
public String hello(Model model){
// 封装数据
model.addAttribute("msg","Hello,SpringMVC-Annotation");
// return 的结果会被视图解析器处理
return "hello";
}
} -
创建hello.jsp页面
1
2
3
4
5
6
7
8
9<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html> -
运行测试
1
2浏览器显示:
Hello,SpringMVC-Annotation
小结
实现步骤:
- 新建一个web项目
- 导入相关依赖
- 编写web.xml,注册DispatcherServlet
- 编写SpirngMVC配置文件
- 创建对应的控制类,controller
- 最后完善前端视图和Controller之间的对应
- 测试运行
SpringMVC必须配置:
- 处理器映射器
- 处理器适配器
- 视图解析器
通常我们只需要手动配置视图解析器,而处理器映射器和处理器适配器只需要开启注解驱动即可自动配置。
Controller配置总结
控制器Controller
- 控制器负责提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现
- 控制器负责解析用户的请求并将其转换为一个模型(Model)
- 在SpringMVC中一个控制器类可以包含多个方法
- 在SpringMVC中,对于Controller的配置方式有很多种
实现Controller接口
Controller是一个接口,在org.springframework.web.servlet.mvc
包下,接口中只有一个方法:
1 | // 实现该接口的类获得控制器功能 |
创建项目并分析Controller
-
新建Module
springmvc-05-controller
,添加web支持 -
配置web.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<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">
<servlet>
<servlet-name>springMVC</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>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app> -
在resources下创建
springmvc-servlet.xml
并在java下新建controller包1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 自动扫包-->
<context:component-scan base-package="com.jokerdig.controller"/>
<!-- 过滤静态资源-->
<mvc:default-servlet-handler/>
<!-- 支持注解驱动-->
<mvc:annotation-driven/>
<!-- 视图解析器-->
<bean id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
第一种,在类中实现Controller接口
-
新建Controller类,
ControllerTest.java
实现Controller1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23package com.jokerdig.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author Joker大雄
* @data 2022/6/1 - 12:35
**/
// 只要实现Controller接口的类 就是一个控制器
public class ControllerTest implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView();
mav.addObject("msg","ControllerTest1");
mav.setViewName("test");
return mav;
}
} -
在
springmvc-servlet.xml
中配置<bean/>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<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
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--<!– 自动扫包–>-->
<!-- <context:component-scan base-package="com.jokerdig.controller"/>-->
<!--<!– 过滤静态资源–>-->
<!-- <mvc:default-servlet-handler/>-->
<!--<!– 支持注解驱动–>-->
<!-- <mvc:annotation-driven/>-->
<!-- 视图解析器-->
<bean id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 第一种方法实现controller-->
<bean id="/test" class="com.jokerdig.controller.ControllerTest"/>
</beans> -
运行测试
1
2浏览器显示:
ControllerTest1 -
小结
- 实现Controller是一种较老的办法,尽量不要使用
- 一个控制器只有一个方法,如果需要多个方法则要创建多个类并实现Controller,较为繁琐
第二种,使用注解实现
@Controller注解类型用于声明Spring类的实例是一个控制器
Spirng可以使用扫描机制来找到应用程序中所有基于注解的控制器类
-
在Spring配置文件中定义自动扫描包,过滤静态资源,支持注解驱动
1
2
3
4
5
6<!-- 自动扫包 所有注解类交给IOC容器管理-->
<context:component-scan base-package="com.jokerdig.controller"/>
<!-- 过滤静态资源-->
<mvc:default-servlet-handler/>
<!-- 支持注解驱动-->
<mvc:annotation-driven/> -
新建ControllerTest2类,使用注解实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27package com.jokerdig.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author Joker大雄
* @data 2022/6/1 - 13:55
**/
// Spring接管
public class ControllerTest2 {
public String test2(Model model){
model.addAttribute("msg","ControllerTest2");
return "test"; // 我们要访问的页面名
}
public String test3(Model model){
model.addAttribute("msg","ControllerTest3");
return "test"; // 也可以多个方法访问一个页面
}
} -
运行测试
1
2
3
4浏览器显示:
ControllerTest2
输入/t3显示
ControllerTest3
RequestMapping说明
@RequestMapping
-
@RequestMapping
注解用于映射url到控制器类或一个特定的处理程序方法,可用于类或方法上。用于类,表示类中所有的响应请求的方法都是以该地址作为父路径 -
简单测试,新建
ControllerTest3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18package com.jokerdig.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author Joker大雄
* @data 2022/6/1 - 14:11
**/
public class ControllerTest3 {
public String test1(Model model){
model.addAttribute("msg","RequestMapping");
return "test";
}
}访问地址为:http://localhost:8080/项目名/t1
-
当我们添加注解类的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19package com.jokerdig.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author Joker大雄
* @data 2022/6/1 - 14:11
**/
public class ControllerTest3 {
public String test1(Model model){
model.addAttribute("msg","RequestMapping");
return "test";
}
}访问地址为:http://localhost:8080/项目名/admin/t1