1. SpringMVC概述
作用: 用于前端请求处理,即Servlet的创建。
优点:
- 基于 MVC 架构 : 基于 MVC 架构,功能分工明确。解耦合,
- 容易理解,上手快;使用简单。就可以开发一个注解的 SpringMVC 项目,SpringMVC 也是轻量级的,jar 很小。不依赖的
特定的接口和类。 - 作 为 Spring 框 架 一 部 分 , 能 够 使 用 Spring 的 IoC 和 Aop 。 方 便 整 合Strtus,MyBatis,Hiberate,JPA 等其他框架。
- SpringMVC 强化注解的使用,在控制器,Service,Dao 都可以使用注解。方便灵活。使用@Controller 创建处理器对象,@Service 创建业务对象,@Autowired 或者@Resource在控制器类中注入 Service, Service 类中注入 Dao。
1.1 第一个SpringMVC程序的实现。
需求:
需求: 用户在页面发起一个请求, 请求交给springmvc的控制器对象,
并显示请求的处理结果(在结果页面显示一个欢迎语句)。
实现步骤:
1. 新建web maven工程
2. 加入依赖
spring-webmvc依赖,间接把spring的依赖都加入到项目
jsp,servlet依赖
3.重点: 在web.xml中注册springmvc框架的核心对象DispatcherServlet
1)DispatcherServlet叫做中央调度器, 是一个servlet, 它的父类是继承HttpServlet
2)DispatcherServlet页叫做前端控制器(front controller)
3)DispatcherServlet负责接收用户提交的请求, 调用其它的控制器对象,并把请求的处理结果显示给用户
4.创建一个发起请求的页面 index.jsp
5.创建控制器(处理器)类
1)在类的上面加入@Controller注解,创建对象,并放入到springmvc容器中
2)在类中的方法上面加入@RequestMapping注解。
6.创建一个作为结果的jsp,显示请求的处理结果。
7.创建springmvc的配置文件(spring的配置文件一样)
1)声明组件扫描器, 指定@Contorller注解所在的包名
2)声明视图解析器。帮助处理视图的。
主要内容及扩展内容:
- 依赖的引入
- 中央调度器DispatcherServlet的配置
- 处理器类的使用规则
- 请求映射RequestMapping
- 视图解析器
具体工作:
-
第一步:POM文件中的依赖引入
<!--servlet依赖--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--springmvc依赖:注意它会将spring的依赖全部自动加入--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.5.RELEASE</version> </dependency>
-
第二步: 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"> <!--声明,注册springmvc核心对象DispatcherServlet(中央调度器) 需要在Tomcat服务器动时,自动创建DispatcherServlet对象实例 为什么要创建DispatcherServlet对象实例?? 因为:在使用springMVC时需要使用springMVC的容器,而在创建过程中,容器并不是手动创建的, 所以在DispatcherServlet创建对象时,会自动创建springMVC的容器。 读取springmvc的配置文件,将配置文件中的对象都创建好,当用户发起请求时,可以直接使用对象。 servlet初始化会执行init()方法, DispatcherServlet在init()中会做如下操作 init(){ // 创建容器,读取配置文件 WebApplicationContext ctx = new ClassPathXmlApplicationContext("springmvc.xml") // 将容器对象,放入到ServletContext中 getServletContext.getAttribute(key,ctx);// 获取容器 } Tomcat启动异常:Could not open ServletContext resource [/WEB-INF/(servlet-name的名字)-servlet.xml] springmvc创建容器对象时,需要读取配置文件的默认规则是:在/WEB-INF/(servlet-name的名字)-servlet.xml --> <servlet> <servlet-name>myweb</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启动后创建对象的顺序,它的值是整数, 数值越小Tomcat创建对象的时间越早,大于等于0的整数 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>myweb</servlet-name> <!-- 注意: 这里的url-pattern方式可以有两种 1. 使用扩展名的方式,语法 *.xxx : xxx是自定义的扩展名,常用方式是 *.do,*.action,*.mvc等 2. 使用 “/” --> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
-
第三步: SpringMVC 配置文件的创建 : 声明组件扫描器、视图解析器。
<?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.bjpowernode.controller"/> <!--声明视图解析器,作用:帮助开发人员设置视图文件的路径--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--前缀:视图文件路径--> <property name="prefix" value="/WEB-INF/view/"/> <!--后缀:视图文件的扩展名--> <property name="suffix" value=".jsp"/> </bean> </beans>
-
第四步: 使用@Controller注解:将类转换为处理器类,使用@RequeastMapping注解:将请求转交给指定的方法处理。
package com.bjpowernode.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; /** * @Controller:创建处理器对象,对象放在springmvc容器中 * * 位置: 类上方 * 作用: 和spring中的@service,@component一样 */ @Controller public class MyController { /** * 处理用户提交的请求,springmvc是使用方法来处理的, * 方法是自定义的,可以有多种返回值,多种参数 */ /** * 准备使用dosome方法处理some.do请求 * @RequestMapping: 请求映射,作用是把一个请求地址和一个方法绑定在一起。 * 一个请求制定一个方法处理 * * 属性: 1. value: 是一个String,表示请求的url地址(some.do) * value的值必须是唯一的,不能重复。 在使用时,推荐地址以"/"开头 * 位置: 1. 在方法的上面,常用的 * 2. 在类的上面 * 说明:使用RequestMapping修饰的方法叫做处理器方法或者控制器方法 * 使用RequestMapping修饰的方法可以处理请求的,类似servlet中的doGet,doPost * * * 返回值: ModelAndView * model:数据,请求处理完成后,要显示给用户的数据 * view:视图,比如jsp等等 */ @RequestMapping(value = { "/some.do","first.do"}) public ModelAndView doSome(){ // 处理some.do请求了 ModelAndView mv = new ModelAndView(); // 添加数据,框架在请求的最后把数据放入到request作用域。 mv.addObject("msg","欢迎使用springmvc做web开发"); mv.addObject("fun","执行的是doSome方法"); // 指定视图,制定视图的完整路径 // 框架对视图的执行的forward操作,相当于request.getRequestDispather("/show.jsp").forward(...) //mv.setViewName("/show.jsp"); //mv.setViewName("/WEB-INF/view/show.jsp"); //当设置了视图解析器后,可以使用逻辑名称(文件名),制定视图 //框架会使用视图解析器的前缀+逻辑名称+后缀组成完整路径 mv.setViewName("show"); // 返回mv return mv; } @RequestMapping(value = { "/other.do","second.do"}) public ModelAndView doOther(){ ModelAndView mv = new ModelAndView(); mv.addObject("msg","欢迎使用springmvc做web开发"); mv.addObject("fun","执行的是doOther方法"); mv.setViewName("other"); return mv; } }
1.2 使用 SpringMVC 框架 web 请求处理顺序
1.3 SpringMVC 执行流程
处理步骤解析:
- 第一步:浏览器提交请求到中央调度器
- 第二步:中央调度器直接将请求转给处理器映射器。(处理映射器:可以看做是我们写的bean标签和controller和requestMapping合在一起的请求处理地址的字符串拼接路径)
- 第三步:处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链(这个执行链可以看做就是处理器地址路径)后返回给中央调度器。
- 第四步:中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器。
- 第五步:处理器适配器调用执行处理器。
- 第六步:处理器将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给处理器适配器。
- 第七步:处理器适配器直接将结果返回给中央调度器。
- 第八步:中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。
- 第九步:视图解析器将封装了的视图对象返回给中央调度器。
- 第十步:中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对象。
- 第十一步:中央调度器响应浏览器。
2. SpringMVC注解式开发
2.1 @RequestMapping 定义请求规则
2.1.1 注解出现的位置
-
方法上:如下所示:当在方法上时表示的是该处理请求的路径。
@RequestMapping(value = { "/some.do","first.do"}) public ModelAndView doSome(){ ModelAndView mv = new ModelAndView(); mv.addObject("msg","欢迎使用springmvc做web开发"); mv.addObject("fun","执行的是doSome方法"); mv.setViewName("show"); return mv; }
-
类上:如下所示:在类上时,表示的是该处理请求的模块名。
如:此时我们需要发送多个请求,test/one.do,test/two.do,test/three.do。。。。,可以发现这些请求的url地址都包含了“test”,因此我们可以在类的上方加入@RequestMapping(value = “/test”),表示该类处理的请求时test模块的,在后面的函数中@RequestMapping只需要写 one.do,two.do,three.do不需要写test/one.do,test/two.do,test/three.do,更加的便捷。
value 属性值常以“/”开始。
2.1.2 对请求提交方式的定义
对于@RequestMapping,其有一个属性 method,用于对被注解方法所处理请求的提交方式进行限制,即只有满足该 method 属性指定的提交方式的请求,才会执行该被注解方法。
Method 属性的取值为 RequestMethod 枚举常量。常用的为 RequestMethod.GET 与RequestMethod.POST,分别表示提交方式的匹配规则为 GET 与 POST 提交。