清茶书香

一杯清茶,一本书籍,一个下午。


  • 首页

  • 归档

  • 分类

  • 关于

  • 搜索
Redis JPA Solr SpringData SpringMVC localRepository local Mapper 事务 Mybatis JDBC AOP DI IOC 常用函数 触发器 存储过程 Promise Gateway SpringCloud vue-cli axios es6 webpack npm vue 个性化 zsh 终端 caffeine jvm缓存 guava cache validation Mapping MapStruct comment 小程序 建站 WeHalo config logback plugins database idea maven spring https http nginx password RabbitMQ 秒杀系统 Windows MySQL 数据备份 halo SpringBoot shell Linux ip Optional Stream Lambda k8s Docker 列编辑 vim MacOS 图片合成 Java 远程联调 nps 内网穿透

了解SpringMVC(一)

发表于 2019-07-08 | 分类于 spring系列 | 0 | 阅读次数 180

概述

Spring Web MVC是基于Servlet API构建的原始Web框架,但它通常被称为“Spring MVC”。是一个基于mvc设计模式的框架,和struts2一样是一个表现层框架。

spring架构图

图1-1 spring架构图

SpringMVC与Jsp+Servlet程序的区别

JSP+Servlet处理流程

JSP+Servlet处理流程

SpringMVC处理流程

SpringMVC处理流程

  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器查找Handler。
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  4. DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
  5. HandlerAdapter调用处理器Handler
  6. Handler执行完成返回ModelAndView
  7. HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器,ViewReslover根据逻辑视图名解析View
  9. ViewReslover返回View
  10. DispatcherServlet对View进行渲染视图(即将模型数据填充至request域)。
  11. 最后一步将视图结果返回给浏览器,展示给用户

快速上手

搭建环境

引入依赖

<!-- 引入spring mvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.1.5.RELEASE</version>
</dependency>
<!-- 引入servlet依赖 -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>3.1.0</version>
</dependency>

注册DispatherServlet

在web.xml中添加:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 指定SpringMVC 配置文件位置,DispatcherServlet初始化时会初始化Spring上下文(WebApplicationContext) -->
    <!-- 默认配置文件寻找位置:/WEB-INF/{servlet-name}-servlet.xml,如果名字符合默认寻找规则,可以不指定配置文件路径 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
    </init-param>
    <!-- 配置容器启动时初始化DispatcherServlet -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

关于DispatcherServlet拦截路径:
1、*.do 代表拦截所有以.do结尾的请求,例如:/user/add.do,弊端:所有的url都要以.do结尾。不会影响访问静态文件。
2、/app/* 代表拦截/app/下面的任何路径、文件,例如:/app/user/add、/app/user/add.jsp,弊端:请求的url都要包含/app
3、/ 代表将此Servlet设置为默认Servlet,它将拦截所有其他Servlet都无法拦截的请求,例如:/user/add、/user/test/aa.js,弊端:对jpg,js,css静态文件的访问也被拦截不能正常显示(因为它覆盖了Tomcat给我们提供的专门用于处理静态资源的Servlet)。后面有解决办法。
4、/* 拦截所有请求(包括*.jsp),可以走到Action中,但转发到jsp时再次被拦截,不能访问到jsp。

注:

  • 我们一般选择将DispatcherServlet的拦截路径配置成/或者指定后缀(如:*.action)。
  • 我们配置拦截路径是/时,为什么jsp页面不会被拦截,因为Tomcat中有专门处理*.jsp的Servlet
  • Servlet拦截路径的优先级是:完全路径匹配(/TestServlet) > 目录匹配(/aa/) > 扩展名匹配(.do) > /(默认Servlet)

配置SpringMVC

dispatcher-servlet.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:mvc="http://www.springframework.org/schema/mvc"
       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
        http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 开启扫描注解支持 -->
    <context:component-scan base-package="com.spring.springmvc" />

    <!-- 配置视图解析器,用于将Handler方法中返回的视图名解析成真正可展示的页面 -->
    <mvc:view-resolvers>
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/" />
            <property name="suffix" value=".jsp" />
        </bean>
    </mvc:view-resolvers>
</beans>

HelloWorld

index.jsp

<body>

    <pre>
    <a href="test/hello">SpringMVC测试</a>

    <a href="nihao/apple">SpringMVC apple测试</a>

    <a href="sihuoge">测试ResponseBody</a>
    </pre>
</body>

HelloAction.java

/**
 * 通过@Controller标注的类会被SpringIOC容器扫描和管理
 */
@Controller
public class HelloAction {

    /**
     * 定义一个Handler, 可以处理http://localhost:8080/springmvc/test/hello这个请求
     * @return
     */
    @RequestMapping("/test/hello")
    public String hello() {
        System.out.println("进入HelloAction.hello()方法");
        return "hello";
    }

    /**
     * 处理请求,并携带数据跳转到页面
     * @param mv
     * @return
     */
    @RequestMapping("/nihao/apple")
    public ModelAndView hello1(ModelAndView mv) {
        System.out.println("进入HelloAction.hello1()方法");
        mv.setViewName("hello");
        mv.addObject("key", "apple");
        return mv;
    }

    /**
     * 通过@ResponseBody注解标注的方法, 不会被解析成视图, 而是直接将返回的内容本身输出给调用方(浏览器、其他服务、抓包工具)
     * @return
     */
    @ResponseBody
    @RequestMapping("/sihuoge")
    public String test() {
        return "sihuo";
    }
}

通过本章我们初步了解了Spring MVC的处理请求的机制,以及简单的处理请求。下一章,我们学习一些Spring MVC的一些基本的知识点。

Bennett wechat
欢迎收藏我的微信小程序,方便查看更新的文章。
  • 本文作者: Bennett
  • 本文链接: https://hibennett.cn/archives/springmvc
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# spring
MyBatis详解(二)
了解SpringMVC(二)
  • 文章目录
  • 站点概览
Bennett

Bennett

60 日志
28 分类
74 标签
RSS
Github E-mail Gitee QQ
Creative Commons
Links
  • MacWk
  • 知了
0%
© 2020 — 2023 hibennett.cn版权所有
由 Halo 强力驱动
|
主题 - NexT.Pisces v5.1.4

浙公网安备 33010802011246号

    |    浙ICP备2020040857号-1