自学内容网 自学内容网

SSM--SpringMVC复习(一)

SpringMVC

Spring MVC 是一个实现了MVC设计模式的请求驱动类型的轻量级Web框架, 本质上相当于 Servlet,以 DispatcherServlet 为核心,负责协调和组织不同组件以完成请求处理并返回响应。通过控制器(C)对模型数据(M)进行封装,并对视图(V)进行解析。

教程:Spring MVC框架入门教程 - C语言中文网

第一个 SpringMVC程序

1. 向 web项目中导入 jar 包

除了依赖于 Spring 的基础模块外,SpringMVC 还需引入下面的支持 jar 包。

<!-- Spring MVC web 支持 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.20</version>
</dependency>
​
<!-- Spring MVC json 处理 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version>
</dependency>

2. 配置文件

配置 WEB-INF/web.xml ,在容器中部署 DispatcherServlet

<!-- 配置前端控制器 DispatcherServlet -->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </init-param>
    <!-- 容器启动时立即加载 DispatcherServlet  -->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <!-- 处理所有URL -->
    <url-pattern>/</url-pattern>
</servlet-mapping>

配置 applicationContext.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: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/mvc
                            https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!-- 方式 1:xml 配置-->
    <bean name="/login" class="com.lsy.demo.controller.LoginController"/>
    
    <!-- 方式 2:注解配置 -->
    <mvc:annotation-driven/>
    <context:component-scan base-package="com.lsy.demo" />
</beans>

3. 创建 Controller

//方式 1 : xml 配置
public class LoginController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView mv = new ModelAndView();
        mv.setViewName("test.jsp");             // 设置 view 视图
        mv.addObject("msg","hello,mvc");        // 设置 model 数据
        return mv;
    }
}
​
//方式2: 注解配置
@Controller
public class LoginController{
    @RequestMapping("/login")               // 映射请求URL: /login
    public ModelAndView doLogin(User user){ // 封装用户数据到 user 中
        ModelAndView mv = new ModelAndView();
        mv.setViewName("test.jsp");         // 设置 view 视图
        mv.addObject("msg","hello,mvc");    // 设置 model 数据
        return mv;                          // 返回响应数据
    }
}

4. 创建 View

<a href="${pageContext.request.contextPath }/login"> 登录</a>

SpringMVC 执行流程

SpringMVC 的执行流程如下:

  1. 用户发起一个 HTTP 请求,该请求会被提交到 DispatcherServlet(前端控制器);

  2. 由 DispatcherServlet 请求一个或多个 HandlerMapping(处理器映射器),并返回一个执行链(HandlerExecutionChain)。

  3. DispatcherServlet 将执行链返回的 Handler(处理器,即程序中我们写的 Controller) 信息发送给 HandlerAdapter(处理器适配器);

  4. HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler;

  5. Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);

  6. HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;

  7. DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;

  8. ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;

  9. DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中,生成最终的 View(视图);

  10. 视图负责将结果显示到浏览器(客户端)。

Spring MVC接口

  • DispatcherServlet 是前端控制器,Spring MVC 的所有请求都要经过 DispatcherServlet 来统一分发。DispatcherServlet 相当于一个转发器或中央处理器,控制整个流程的执行,对各个组件进行统一调度,以降低组件之间的耦合性,有利于组件之间的拓展。

  • HandlerMapping 是处理器映射器,其作用是根据请求的 URL 路径,通过注解或者 XML 配置,寻找匹配的处理器(Handler)信息。

  • HandlerAdapter 是处理器适配器,其作用是根据映射器找到的处理器(Handler)信息,按照特定规则执行相关的处理器(Handler)。

  • Handler 是处理器,和 Java Servlet 扮演的角色一致。其作用是执行相关的请求处理逻辑,并返回相应的数据和视图信息,将其封装至 ModelAndView 对象中。

  • View Resolver 是视图解析器,其作用是进行解析操作,通过 ModelAndView 对象中的 View 信息将逻辑视图名解析成真正的视图 View(如通过一个 JSP 路径返回一个真正的 JSP 页面)。

  • View 是视图,其本身是一个接口,实现类支持不同的 View 类型(JSP、FreeMarker、Excel 等)。

注意:以上组件中,需要开发人员进行开发的是处理器(Handler,常称Controller)和视图(View)

静态资源放行

在项目中的 web.xml 文件中,配置 SpringMVC 前端控制器(DispatcherServlet)时,通过映射路径都会配置为 / (<url-pattern>/</url-pattern>),这就导致请求的静态资源 url 也会被 DispatcherServlet 捕获而又得不到处理,造成静态资源访问失败。如果想放行静态资源,可通过下面几种方式。

<!-- 配置前端控制器 DispatcherServlet -->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

方式一: default Servlet 放行静态资源

修改 web.xml ,利用源默认servlet放行静态资源。default servlet 由 tomcat 默认提供,配置在 tomcat 的 /conf/web.xml 中。

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>

方式二:mvc:default-servlet 放行静态资源

修改 springmvc.xml ,添加默认的 Servlet 控制器放行所有资源 。

<mvc:default-servlet-handler/>

方式三:mvc:resources 放行静态资源

修改 springmvc.xml ,使用静态资源访问 。

<!-- 使用SpringMVC提供的静态资源映射进行处理-->
<mvc:resources mapping="/image/**" location="/image/" />
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/js/**" location="/js/" />

方式四:dispatcherServlet 只处理固定后缀的请求

在 web.xml 中配置前端控制器时,指定只处理某种后缀的 URL (比如 *.do 或 *.action)

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

原文地址:https://blog.csdn.net/qq_63843408/article/details/144012577

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!