SpringMVC
- Spring MVC概述:
- **什么是Spring MVC ?**
- **什么是MVC?**
- 第一个SpringMVC程序
- 具体步骤:
- 具体实现:
- 第一个SpringMVC小程序的完善
Spring MVC概述:
什么是Spring MVC ?
他是基于MVC开发模式的框架,用来优化控制器,他是Spring家族的一员,它也具备IOC和AOP。他是基于spring的一个框架,实际上就是spring的一个模块,专门做web开发(web开发底层就是servlet,框架就是在servlet基础上面加入一些功能,让你做web开发更加方便)的,可以简单的理解为一个servlet的升级
我们要做的是什么?
我们需要使用@Controller创建控制器对象**(创建的是一个普通类对象,不是servlet,spring mvc赋予了控制器对象一些额外的功能)**,把对象放入到springmvc容器中,把创建的对象作为控制器使用,这个控制器对象能接收用户请求,显示处理结果,可以把它当做是一个servlet(但他绝对不是servlet)
web开发流程:
index.jsp---------->DispaterServlet(Servlet)--------转发,分配给----Controller对象(就是用@Controller注解创建的对象)
web开发底层是servlet,SpringMVC中有一个对象是servlet,这个对象就是**DispaterServlet**** :负责接收用户的所有请求,用户把请求给了DispaterServlet,之后DispaterServlet把请求转发给我们的Controller对象,最后是Controller对象处理请求
什么是MVC?
他是一种开发模式,是模型视图控制器的简称,所有的web应用都是基于MVC开发的
**M:**模型层,包含实体类、业务逻辑层、数据访问层
**V:**视图层,用来呈现数据的,例如:html,javascript,vue等
**C:**控制器,用来接收客户端的请求,并返回响应到客户端的组件,Servlet就是组件
Spring MVC优点:
- 轻量级的,基于MVC的框架
- 易于上手,容易理解,功能强大
- 它具备IOC和AOP
- 完全基于注解开发
SpringMVC的执行流程
上图的执行流程说明:
-
向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获。
-
DispatcherServlet 根据中的配置对请求的URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用 HandlerMapping 获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。
-
DispatcherServlet 根据获得的Handler,选择一个合适的 HandlerAdapter。
-
提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。
数据格式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。
数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
-
Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象。
-
根据返回的ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet。
-
ViewResolver 结合Model和View,来渲染视图。
-
视图负责将渲染结果返回给客户端
详细解析:一个好汉三个帮,这个好汉是指DispaterServlet
DispatcherServlet(中央调度器):**SpringMVC框架的核心处理器。由DispatcherServlet调用第一个帮手:HandlerMapper(地址映射器),然后再调用第二个帮手:**HandlerAdpter(处理器适配器)**在这里面创建当前的处理器对象,由所创建出来的处理器对象来调用业务逻辑层,再去调用数据访问层,然后将结果一层层的返回至DispatcherServlet中,DispatcherServlet再调用第三个帮手:**ViewResolver(他是用来返回客户端请求对的地址拼接)**Hander只需要返回上图中的main给DispaterSeverlet即可,ViewResolver会进行地址的拼接
第一个SpringMVC程序
项目案例功能:用户提交一个请求,服务端处理器在接收到这个请求后,给出一条欢迎信息,在响应页面中显示该信息。
具体步骤:
-
新建web maven工程
-
加入依赖:spring-webmvc依赖,简介的把spring的依赖都加入到了项目;jsp依赖、servlet依赖
-
重点:在web.xml文件中注册springmvc框架的核心对象DispaterServlet
- 它叫做中央调度器,是一个servlet,他的父类是继承HttpServlet
- 它负责接收客户端的请求,并根据请求的路径分派给对应的**action(控制器)**进行处理,处理结束后依然由核心处理器DispatcherServlet进行响应返回,将请求结果显示给用户
- 它也叫做前端控制器(form controller)
-
删除index.jsp页面,重新建index.jsp页面,因为自动生成的页面缺失指令设置。
-
创建控制器类
- 在类上面加入@Controller注解,创建对象,并放入到springmvc容器中
- 在类的方法上面加入@RequestMapping注解(表示路径映射。该注解可以加在类上相当于包名,还可以加在方法上相当于action的名称,都是来指定映射路径的)
-
创建一个作为结果的jsp,显示请求的处理结果
-
创建springmvc的配置文件(和spring的配置一样),在工程的类路径即resources目录下创建 SpringMVC 的配置文件 springmvc.xml。该文件名可以任意命名。推荐使用springmvc.xml.
- 在这个文件里面要声明组件扫描器,指定@Controller注解所在的包名。< context:component-scan>:用来进行包扫描,这里用于指@Controller注解所在的包路径
- 声明视图解析器,帮助处理视图。SpringMVC框架为了避免对于请求资源路径与扩展名上的冗余,在视图解析器InternalResouceViewResolver 中引入了请求的前辍与后辍。而action中只需给出要跳转页面的文件名即可,对于具体的文件路径与文件扩展名,视图解析器会自动完成拼接。
注意:
注册springmvc的核心对象Dispatcherservlet需要在tomcat服务器启动后,创建Dispatcherservlet对象的实例。
为什么要创建Dispatcherservlet对象的实例呢?
因为Dispatcherservlet在他的创建过程中,会同时创建springmvc容器对象,读取springmvc的配置文件,把这个配置文件中的对象都创建好,当用户发起请求时就可以疸接使用对象了。
servlet的初始化会执行init ()方法。DispatcherServlet在init ()中{
创建容器,读取配置文件
webApplicationcontext ctx = new ClassPathxmApplicationcontext(“springmvc.xml”)
把容器对象放入ServletContext中:
getServletContext().setAttribute(key,ctx);
具体实现:
新建web
添加依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
将自动生成的web.xml删了,重新新建
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0"
>
</web-app>
在web.xml中注册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.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
新建一个index.jsp文件(因为自动创建出来的没有指定的编码方式以及一些指令)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页发送请求</title>
</head>
<body>
<h1>发送请求</h1>
<!--当前路径是一个有斜杠的相对路径,参照路径就是当前的web服务器的根路径:http://localhost:8008/
点击链接之后提交的URL绝对地址是: http://localhost:8008/some.do
-->
<h1><a href="/some.do">前面加斜杠:点击发送some.do请求</a></h1>
<!-- 当前路径是前面没有斜杠的相对路径,参照的路径就是当前页面的路径:
参照的路径是http://localhost:8008/项目名/some.do-->
<h1><a href="some.do">前面不加斜杠:点击发送some.do请求</a></h1>
</body>
</html>
编写控制器
package com.cxy.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MyController {
@RequestMapping(value = "/some.do")
public ModelAndView doSome(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","我的第一个SpringMVC程序");
mv.addObject("fun","这个是一个函数方法");
mv.setViewName("/show.jsp");
return mv;
}
}
编写视图(show.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Show页面展示数据</title>
</head>
<body>
<h1>msg信息:${msg}</h1>
<h2>fun information:${fun}</h2>
</body>
</html>
要注意需要在springmvc.xml文件中配置组件扫描器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">
<context:component-scan base-package="com.cxy.springmvc.controller"/>
</beans>
第一个SpringMVC小程序的完善
当前程序不完善之处:
-
当在浏览器的地址栏直接输入show.jsp的时候能够直接访问页面
- 有些时候我们希望个别页面是用户无法直接在地址栏输入信息即可直接访问的,这个时候我们可以:将我们希望受到保护的文件放在WEB-INF目录下
-
当控制类中有多个请求路径时,设置视图的时候需要重复的编写代码
-
这些重复的代码,springmvc框架可以帮助我们实现简便开发
-
在springmvc.xml文件中配置视图解析器:视图解析器可以使用逻辑名称(文件名)来指定视图。
-
框架会使用视图解析器的 前缀+逻辑名称+后缀组成完整路径,这里就是字符串的连接操作
-
详细代码:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/view/"></property> <property name="suffix" value=".jsp"/> </bean>
-