0%

【SpringMVC】SpringMVC框架入门

SpringMVC的简单介绍

一、SpringMVC介绍

1.1 简介

  • SpringMVC是Spring框架的一部分,是基于Java实现MVC轻量级Web框架
  • (SpringMVC底层还是Servlet)

1.2 特点

  • (1)轻量级,简单易学
  • (2)高效,基于请求响应的MVC框架(处理请求,返回视图)
  • (3)与Spring兼容性好,无缝结合
  • (4)约定优于配置
  • (5)功能强大:RESTful、数据验证、格式化、本地化、主题等
  • (6)简介灵活

1.3 实例演示:配置文件实现

  • SpringWeb框架围绕DispatcherServlet设计,DispatcherServlet的作用是将请求分发到不同的处理器。
  • SpringMVC框架,和其他MVC框架一样,一请求为驱动,围绕一个中心Servlet分派请求级提供其他功能,DispatcherServlet是一个世纪的Servlet
  • 本框架全部是基于Maven来实现导包,不再手动导包
  • (1)创建Maven空白项目
  • (2)右键项目名称,添加web项目支持
  • (3)Maven的pom.xml设置导包
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>SpringMVC框架</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</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>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
</dependencies>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

</project>
  • (4)创建JSP页面
    • 在/WEB-INF/jsp,下创建一个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>
  • (5)建包,并创造类实现Controller接口
    • 创建一个包,并创建一个HelloController.java的类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class HelloCotroller implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//模块和视图
ModelAndView mv = new ModelAndView();

//封装对象,放在ModelAndView中
mv.addObject("msg", "HelloSpringMVC");

//封装要跳转的视图,放在ModelAndView中
mv.setViewName("hello");//自动拼接为:"/WEB-InF/jsp/" + "hello" + ".jsp" = /WEB-InF/jsp/hello.jsp

return mv;
}
}
  • (6)在Resources包下创建SpringMVC的配置文件
    • 在src/main/resources下创建一个Spring配置文件,名字为springmvc-servlet.xml
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
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--添加处理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>

<!--添加处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

<!--添加视图解析器
1.获取ModelAndView的数据
2.解析ModelAndeView的视图名字
3.拼接视图的名字,找到对应的视图
4.将数据渲染到视图上
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!--后缀-->
<property name="suffix" value=".jsp"></property>
</bean>

<!--handler:处理器-->
<bean id="/hello" class="com.letere.controller.HelloCotroller"></bean>

</beans>
  • (7)在web.xml注册Servlet
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
<?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">

<!--注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
<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映射器-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern><!-- /拦截非.jsp页面的所有请求-->
</servlet-mapping>
</web-app>
  • (8)整体目录结构
  • (9)配置Tomcat服务器
  • (10)点击启动按,启动tomcat

二、SpringMVC执行原理

2.1 各文件功能

  • (1)web.xml
    • 注册SpringMVC自带的Servlet
    • 页面跳转经过此Servlet进行处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!--配置DispatcherServlet:前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--DispatcherServlet要绑定springmvc的配置文件-->
<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>

<!--
SpringMVC中:'/'和'/*'是有区别的
/ :只匹配所有的请求,不会去匹配jsp
/*:匹配所有的请求,包括jsp页面
-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
  • (2)SpringMVC配置文件
    • 开启映射器,适配器,视图解析器,配置关联的类
    • 视图解析器:解析要跳转的页面
    • 视图解析器,映射器,适配器都为SpringMVC自带的类,不用自己写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!--处理器映射器:此处理器会根据Bean来寻找-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--视图解析器:模板引擎Thymeleaf,freemarker-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<!--后缀-->
<property name="suffix" value=".jsp"></property> <!--用于拼接:拼接为/WEB-INF/jsp/xxx.jsp-->
</bean>

<!--Servlet分发跳转为/test,去执行HelloController类-->
<bean id="/test" class="com.letere.controller.HelloController"/>
  • (3)Controller实现类
    • 类实现接口,重写方法,并返回一个ModelAndView类的对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
//业务代码
String result = "HelloSpringMVC";
mv.addObject("msg", result);

//视图跳转
mv.setViewName("test"); //跳转jsp页面的名称

return mv;
}
}

2.2 执行流程

  • (1)DispatcherServlet:表示前段控制器,是整个SpringMVC的控制中心,用户发送请求,DispatcherServlet接受请求并拦截请求

  • (2)HandlerMapping:处理器映射,由DispatcherServlet自行调用,HandlerMappping根据请求的url查找handler

  • (3)HandlerExecution:具体的Handler,根据url查找控制器controller,并将解析后的信息传递给DispatcherServlet(如:解析控制器映射)

  • (4)HandlerAdapter:处理器适配器,按特定的规则去执行Handler

  • (5)Handler让具体的Controller执行

  • (6)Controller将具体的执行信息返回HandlerAdapter,如MoudleAndView类

  • (7)HandlerAdapter将MoudleAndView传递给DispatcherServlet

  • (8)DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的ModelAndView

  • (9)视图解析器将解析的逻辑视图名传递给DispatcherServlet

  • (10)DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图

  • (11)最终将视图呈现给用户


三、基于注解实现

3.1 操作实例

  • (1)web.xml注册Servlet
    • 配置方法和前面一样,就不添加注解解释了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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">

<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--SpringMVC配置文件名称-->
<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>
  • (2)创建SpringMVC的配置文件
    • 开启注解扫描(Spring里学过)
    • 加载mvc注解驱动
    • 添加视图解析器
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
<?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 http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

<!--1.创建context名称空间-->
<!--2.开始注解扫描-->
<context:component-scan base-package="com.letere.controller"></context:component-scan>

<!--3.创建mvc名称空间-->
<!--4.让Spring MVC不处理静态资源 .css .js. html .mp3 .mp4-->
<mvc:default-servlet-handler />

<!--5.开启mvc注解驱动
不用再配置handler(处理器) 和 adapter(适配器)
-->
<mvc:annotation-driven />

<!--6.视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>

</beans>
  • (3)创建类,添加Controller注解
    • 类添加Controller注解
    • 类方法使用返回值为String的
    • 如果需要先前端返回数据,使用Model对象进行返回
    • 类方法添加RequestMapping,表示访问此方式时的网址路径
1
2
3
4
5
6
7
8
9
10
11
@Controller
public class HelloController {

@RequestMapping("/hello")
public String Hello(Model model){
//封装数据
model.addAttribute("msg", "Hello, SpringMVCAnnotation!");

return "hello"; //会被视图解析器处理,进行拼接跳转
}
}