SpringMVC简介
SpringMVC :是基于spring
的一个框架, 实际上就是spring
的一个模块, 专门是做 web 开发的。可以理解是servlet
的一个升级。 web 开发底层是servlet
, 框架是在servlet
基础上面加入一些功能,让你做 web 开发方便。
SpringMVC就是一个Spring。 Spring是容器,ioc能够管理对象,使用<bean>
, @Component
, @Repository
, @Service
, @Controller
SpringMVC能够创建对象, 放入到容器中(SpringMVC容器), Springmvc容器中放的是控制器对象,我们要做的是 使用@Contorller
创建控制器对象, 把对象放入到springmvc容器中, 把创建的对象作为控制器使用。这个控制器对象能接收用户的请求, 显示处理结果,就当做是一个servlet使用。
使用@Controller
注解创建的是一个普通类的对象, 不是Servlet。 Springmvc赋予了控制器对象一些额外的功能。
web开发底层是servlet, Springmvc中有一个对象是Servlet : DispatherServlet
(中央调度器)
DispatherServlet
: 负责接收用户的所有请求, 用户把请求给了DispatherServlet
, 之后DispatherServlet
把请求转发给我们的Controller
对象, 最后是Controller
对象处理请求。
创建第一个项目
所谓 SpringMVC 的注解式开发是指,在代码中通过对类与方法的注解,便可完成处理器在 SpringMVC 容器的注册。注解式开发是重点。
1. 新建web maven工程
2. 引入依赖:
<!--servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--springmvc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
3. 注册DispatcherServlet
- DispatcherServlet叫做中央调度器,是一个servlet ,它的父类是继承HttpServlet
- DispatcherServlet页叫做前端控制器( front controller)
- DispatcherServlet负责接收用户提交的请求,调用其它的控制器对象,并把请求的处理结果显示给用户
声明,注册Springmvc的核心对象DispatcherServlet
,需要在tomcat服务器启动后,创建DispatcherServlet
对象的实例。
为什么要创建 DispatcherServlet 对象的实例呢?
因为DispatcherServlet
在他的创建过程中,会同时创建 Springmvc 容器对象,读取 Springmvc 的配置文件,把这个配置文件中的对象都创建好,当用户发起请求时就可以值接使用对象了。启动 tomcat 报错,读取这个文件/WEB-INF/springmvc-servlet.xml
(这里的 springmvc 是 servlet-name 的名字)
web.xml文件
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--自定义springmvc读取的配置文件的位置-->
<init-param>
<!--springmvc的配置文件的位道的属性-->
<param-name>contextConfigLocation</param-name>
<!--指定自定义文件的位置-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--在tomcat启动后,创建servlet对象
load-on-startup:表示tomcat启动后创建对象的顺序。
它的值是个整数,越小表示创建越早。大于等于0,其实0也很少用
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
使用框架的时候,url-pattern可以使用两种值
1,使用扩展名方式,语法*.xXXX , xxxx是自定义的扩展名。常用的方式*.do,*.action,*.mvc等等
http://localhost:8080/springmvc/some.do
http://localhost:8080/springmvc/other.do
2.使用斜杠"/"
-->
<url-pattern>*.do</url-pattern><!--这里我们先使用*.do的方式-->
</servlet-mapping>
4. 创建一个发起请求的页面
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>第一个springmvc项目</p>
<p><a href="some.do">发起some.do</a></p>
</body>
</html>
5. 创建控制器类
@Controller
:创建处理器对象,对象放在 Springmvc 容器中。
能处理请求的都是控制器(处理器): MyController
能处理请求,叫做后端控制器 (back controller)
准备使用dosome方法处理some.do请求。@ RequestMapping
: 请求映射,作用是把一个请求地址和一个方法绑定在一起。一个请求指定一个方法处理。
属性: value是一个 String,表示请求的 uri 地址的 (some.do)。value的值必须是唯一的,不能重复。在使用时以“/”
说明: 使用RequestMapping
修饰的方法叫做处理器方法或者控制器方法。
使用@RequestMapping
修饰的方法可以处理请求的,类似 Servlet 中的doGet
, doPost
返回值:ModelAndView
表示本次请求的处理结果
ModeL : 数据,请求处理完成后,要显示给用户的数据
View : 视图,比如 jsp 等等。
@Controller
public class MyController {
@RequestMapping(value = "/some.do")
public ModelAndView doSome(){//doGet--service请求处理
//处理some.do请求
ModelAndView mv=new ModelAndView();
//添加数据,框架在请求的最后把数据放入到request作用域。
// request.setAttribute("msg","欢迎使用springmvc做web开发");
mv.addObject("msg","欢迎使用springmvc做web开发");
mv.addObject("fun","执行的是doSome方法");
//指定视图,指定视图的完整路怪
//框架对视图执行的forward操作,request.getRequestDispatcher("/show.jsp).forward(...);
mv.setViewName("/show.jsp");
//当配置了视图解析器后,可以使用逻辑名称(文件名),指定视图
//框架会使用视图解析器的前缀+逻辑名称+后缀组成完成路径,这里就是字符连接操作
// /WEB-INF/view/ + show + .jsp
//mv.setViewName("show");
return mv;
}
}
6. 创建一个作为结果的jsp
show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>show.jsp</h3><br/>
<h3>msg信息:${msg}</h3><br/>
<h3>fun数据:${fun}</h3>
</body>
</html>
7. 创建Springmvc的配置文件
springmvc.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"
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">
<!--声明组件扫描器-->
<context:component-scan base-package="com.controller"/>
<!--声明springmvc框架中的视图解析器,帮助开发人员设置视图文件的路怪-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀:视图文件的路径-->
<property name="prefix" value="/WEB-INF/view/"/>
<!--后缀:视图文件的扩展名-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
SpringMVC的执行流程
Springmvc执行过程源代码分析
1.tomcat启动,创建容器的过程
通过load-on-start
标签指定的1,创建DisaptcherServlet
对象,DisaptcherServlet
它的父类是继承HttpServlet
的, 它是一个serlvet
, 在被创建时,会执行init()
方法。
在init()方法中
//创建容器,读取配置文件
WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml");
//把容器对象放入到ServletContext中
getServletContext().setAttribute(key, ctx);
上面创建容器作用: 创建@controller
注解所在的类的对象, 创建MyController
对象,这个对象放入到 Springmvc的容器中, 容器是 map , 类似 map.put("myController",MyController对象)