9.框架SpringMVC

news2024/11/16 1:38:10

一、基本概念

        Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。Spring MVC 使用 MVC 架构模式的思想,将 Web 应用进行职责解构,把一个复杂的 Web 应用划分成模型(Model)、控制器(Contorller)以及视图(View)三层,有效地简化了 Web 应用的开发,降低了出错风险,同时也方便了开发人员之间的分工配合。

        导入依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.22</version>
</dependency>

二、工作流程

        Spring MVC工作流程如下:

        Spring MVC 的常用组件共有 6 个,它们分别是: DispatcherServlet(前端控制器)、HandlerMapping(处理器映射器)、HandlerAdapter(处理器适配器)、Handler(处理器)、ViewResolver(视图解析器)和 View(视图)。下表对各个组件的功能说明如下:

组件提供者说明
DispatcherServlet(前端控制器)由框架提供它是 Spring MVC 的核心,其本质就是一个 Servlet。
它负责将所有的请求进行统一分发,相当于一个 Spring MVC 的流程控制中心,控制整个流程的执行,对各个组件进行统一调度,以降低组件之间的耦合性,有利于组件之间的拓展。
HandlerMapping(处理器映射器)由框架提供负责根据请求的 url、method 等信息查找响应的 Handler 处理器(即 Controller 控制器方法)。
Handler(处理器)由开发人员提供也就是我们常说的 Controller 控制器,负责在 DispatcherServlet 的控制下,对具体的用户请求进行处理。
HandlerAdapter(处理器适配器)由框架提供它负责根据 HandlerMapping 映射器找到的处理器(Handler)信息,按照特定规则执行相关的处理器(Handler)方法。
ViewResolver(视图解析器)由框架提供通过 ModelAndView 对象中的 View 信息对逻辑视图名进行解析,将其解析成真正的视图 View(例如 ThymeleafView、InternalResourceView、RedirectView 等),并返回给 DispatcherServlet。
View(视图)View 对象本身由框架提供,但视图所对应的前端页面(例如 JSP、HTML)则需要开发人员自行编写将 Model 模型数据通过页面展示给用户。

 三、Servlet配置类

        Spring MVC 本质就是对 Servlet 的进一步封装,其核心组件是一个 DispatcherServelt。DispatcherServelt 是 Spring MVC 中请求最先到达的地方,负责请求在其他各个组件间的传递和加工。在此之前,像 DispatcherServlet 这样的 Servlet,都是通过 web.xml 文件来进行配置的。

        Spring 提供了一个 DispatcherServelt 的快速配置类AbstractAnnotationConfigDispatcher-ServletInitializer,它就是 WebApplicationInitializer 的实现类之一 ,其常用方法如下表。

方法说明
protected abstract Class<?>[] getRootConfigClasses();该方法用于设置 Spring 的配置类。
protected abstract Class<?>[] getServletConfigClasses();该方法用于设置 Spring MVC 的配置类。
 protected abstract String[] getServletMappings();该方法用于指定 DispatcherServelt 的映射规则,即 web.xml 中的 url-pattern。
protected Filter[] getServletFilters() 该方法用于添加各种过滤器(filter)。

        如果我们自定义的初始化类继承了 AbstractAnnotationConfigDispatcherServletInitializer 并将其部署到 Servlet 容器中,Servelt 容器会自动加载这个初始化类,并使用它来完成对 DispatcherServlet 和 Spring MVC 的配置工作。

//继承加载 springMVC前端控制器 和 web容器加载监听器
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    //加载spring配置
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class []{SpringConfig.class};
    }
    //加载springMVC配置
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMVCConfig.class};
    }
    //为dispatcherServlet设置请求路径
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    //添加请求和响应过滤器
    @Override
    protected Filter[] getServletFilters() {
        return null;
    }
}

四、SpringMVC配置类 

        我们可以通过一个实现了 WebMvcConfigurer 接口的配置类(标注 @Configuration 的类)对 Spring MVC 的部分组件进行配置,例如拦截器、格式化程序、视图控制器等。

方法说明
default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {}将静态文件交给 Servlet 容器(Tomcat)内置的默认 Servlet 处理。
default void addInterceptors(InterceptorRegistry registry) {}添加 Spring MVC 拦截器,对请求进行拦截处理。
default void addResourceHandlers(ResourceHandlerRegistry registry) {}添加或修改静态资源(例如图片,js,css 等)映射;
Spring Boot 默认设置的静态资源文件夹就是通过重写该方法设置的。
default void addViewControllers(ViewControllerRegistry registry) {}主要用于实现无业务逻辑跳转,例如主页跳转,简单的请求重定向,错误页跳转等
default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}用于配置默认的消息转换器(转换 HTTP 请求和响应)。
default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}直接添加消息转换器,会关闭默认的消息转换器列表;
实现该方法即可在不关闭默认转换器的起提下,新增一个自定义转换器。
default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}配置异常解析器。
//核心配置类
@Configuration
//SpringMVC注解扫描
@ComponentScan("com.lulu.controller")
//开启注解驱动
// <mvc:annotation-driven> 会自动向 Spring MVC 中注册
// RequestMappingHandlerMapping RequestMappingHandlerAdapter 以及 ExceptionHandlerExceptionResolver 三个Bean
// 其中 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter 都是控制器方法对请求进行分发的必须组件,为读写 JSON 数据提供支持
// 而 ExceptionHandlerExceptionResolver 则是 Spring MVC 的异常处理组件
// 除此之外 <mvc:annotation-driven> 标签还默认注册了一个 FormattingConversionServiceFactoryBean类型的Bean
// ConversionService 通过它,可以满足我们大多数的类型转换需求
@EnableWebMvc
public class SpringMVCConfig implements WebMvcConfigurer {}

 五、Controller

        DispatcherServlet 会拦截用户发送来的所有请求进行统一处理,但不同的请求有着不同的处理过程,例如登陆请求和注册请求就分别对应着登陆过程和注册过程,因此我们需要 Controller 来对不同的请求进行不同的处理。

@Controller//声明为controller
@RequestMapping("")//在类和方法上设置请求映射

         获取请求参数:

@RequestParam("")//在方法参数上设置参数映射,参数名相同可省略
@PathVariable("")//将请求路径以{}包括可通过该注解传递到参数上
@RequestBody//该注解将json字符串参数转换为对象

        获取cookie和session:

@CookieValue("")
@SessionAttribute("")

         转发与重定向:

//转发
//1.直接返回以forward:开头的转发路径字符串
//2.通过ModelAndView.setViewName("")设置1中的转发路径

//重定向
//1.直接返回以redirect:开头的重定向路径字符串
//2.通过ModelAndView.setViewName("")设置1中的重定向路径

          响应数据:

//方法返回字符串时,会默认进行请求转发,配置视图解析器后会进行页面跳转
//方法返回对象时,需要声明以下注解,对象会被解析为json字符串返回
@ResponseBody

//注意!当控制器方法的返回类型为void时,会把RequestMapping中指定的映射路径作为逻辑视图名称然后解 //析为物理地址去访问。此时,可以通过在void方法上声明HttpServletResponse对象避免解析

        共享数据:

//使用ModelAndView向request域对象中共享数据,ModelAndView主要由 model(模型)和 view(视图)两 
//部分组成;其中,model负责数据共享,而view则主要用于设置视图,实现页面跳转,转发,重定向
public ModelAndView share(){
    ModelAndView mv=new ModelAndView();
    mv.addObject("",new Object());
    mv.setViewName("");
    return mv;
}

//使用Model向request域对象中共享数据
@GetMapping("/share")
public String share(Model model){
    model.addAttribute("book",new Book());
    return "";
}


//此外还可以在方法上声明HttpServletRequest向request域对象中共享数据,
//声明HttpSession向sesion域对象中共享数据,
//通过两者获取ServletContext对象可以向application域对象中共享数据,
//其他方法通过声明域对象参数即可获取共享数据

六、RESTful

        RESTful(REST 风格)是一种当前比较流行的互联网软件架构模式,它充分并正确地利用 HTTP 协议的特性,为我们规定了一套统一的资源获取方式,以实现不同终端之间(客户端与服务端)的数据访问与交互。

 

七、配置组件

        类型转换器:一般情况下,Spring MVC 内置的类型转换器就可以满足我们日常的开发需求,但对于一些较为复杂类型的转换,例如 String 转换 Date 类型,以及开发人员自定义格式的数据的转换等,需要我们根据自身的需求开发自定义类型转换器来转换。

public class MyConverter implements Converter<String,String> {
    @Override
    public String convert(String s) {
        return null;
    }
}

        拦截器:在 Spring MVC 中,拦截器的作用与 Servlet 中的过滤器类似,它主要用于拦截用户请求并做相应的处理,例如通过拦截器,我们可以执行权限验证、记录请求信息日志、判断用户是否已登录等操作。

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }

}

        视图解析器:Spring MVC 的控制器方法支持 ModelAndView、ModelMap、View、String 多种类型的返回值,但无论控制器方法的返回值是哪种类型,Spring MVC 内部最终都会将它们封装成一个 ModelAndView 对象。ModelAndView 对象由 model(模型数据)和 view(视图)两部分组成,但这里的 view 通常并不是一个真正的 View 视图对象,而仅仅是一个 String 类型的逻辑视图名(View Name)而已,例如“success”、“index”等。这种情况下,Spring MVC 就需要借助 ViewResolver(视图解析器)将 ModelAndView 对象中逻辑视图名解析为真正的 View 视图对象,然后才能响应给客户端展示。

        异常处理器:Spring MVC 提供了一个名为 HandlerExceptionResolver 的异常处理器接口,它可以对控制器方法执行过程中出现的各种异常进行处理。Srping MVC 为 HandlerException- Resolver 接口提供了多个不同的实现类,其中最常用的实现类如下。

  • DefaultHandlerExceptionResolver
  • ResponseStatusExceptionResolver
  • ExceptionHandlerExceptionResolver
  • SimpleMappingExceptionResolver

        其中,ExceptionHandlerExceptionResolver、ResponseStatusExceptionResolver 和 DefaultHandlerExceptionResolver 是 Spring MVC 的默认异常处理器。如果程序发生异常,Spring MVC 会按照 ExceptionHandlerExceptionResolver → ResponseStatusExceptionResolver → DefaultHandlerExceptionResolver 的顺序,依次使用这三个异常处理器对异常进行解析,直到完成对异常的解析工作为止。

        文件上传解析器:Spring MVC 提供了一个名为 MultipartResolver 的文件解析器,来实现文件上传功能。MultipartResolver 本身是一个接口,该接口共有两个实现类:StandardServlet- MultipartResolver 和 CommonsMultipartResolver 。注意:当我们在 Spring MVC 的配置文件中对 CommonsMultipartResolver 的 Bean 进行定义时,必须指定这个 Bean 的 id为 multipart- Resolver,否则就无法完成文件的解析和上传工作。

        Spring MVC 主要配置如下:

//核心配置类
@Configuration
//springMVC注解扫描
@ComponentScan({"web.controller"})
//开启注解驱动
// <mvc:annotation-driven> 会自动向 Spring MVC 中注册
// RequestMappingHandlerMapping RequestMappingHandlerAdapter 以及 ExceptionHandlerExceptionResolver 三个Bean
// 其中 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter 都是控制器方法对请求进行分发的必须组件,为读写 JSON 数据提供支持
// 而 ExceptionHandlerExceptionResolver 则是 Spring MVC 的异常处理组件
// 除此之外 <mvc:annotation-driven> 标签还默认注册了一个 FormattingConversionServiceFactoryBean类型的Bean
// ConversionService 通过它,可以满足我们大多数的类型转换需求
@EnableWebMvc
public class SpringMVCConfig implements WebMvcConfigurer {
    //视图解析器解析视图后需要在应用内部访问静态资源,
    //这时请求路径无需进行映射,DispatcherServlet找不到该映射,会交给Tomcat提供的默认的servlet处理
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
    //配置类型转换器和格式化器(输入数据转换为对象)
    @Override
    public void addFormatters(FormatterRegistry registry) {
        WebMvcConfigurer.super.addFormatters(registry);
    }
    //配置拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        WebMvcConfigurer.super.addInterceptors(registry);
    }
    //配置视图控制器(直接进行页面跳转)
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/index").setViewName("index");
        registry.addViewController("/error").setViewName("error");
    }
    //配置视图解析器(解析逻辑视图并返回)
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver viewResolver =new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/page/");
        viewResolver.setSuffix(".html");
        registry.viewResolver(viewResolver);
    }
    //配置默认异常处理器
    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        WebMvcConfigurer.super.configureHandlerExceptionResolvers(resolvers);
    }
    //配置文件上传解析器
    @Bean
    public MultipartResolver multipartResolver(){
        CommonsMultipartResolver resolver=new CommonsMultipartResolver();
        resolver.setDefaultEncoding("utf-8");
        resolver.setMaxUploadSize(1024);
        return resolver;
    }
    //配置静态资源访问映射
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        WebMvcConfigurer.super.addResourceHandlers(registry);
    }
    //配置默认响应信息转换器
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        WebMvcConfigurer.super.configureMessageConverters(converters);
    }
    //处理跨域
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        WebMvcConfigurer.super.addCorsMappings(registry);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HashMap的使用:put、remove和get方法原理

关联项目需求进行FeatureAB上报的时候&#xff0c;我们使用HashSet的add方法存key值&#xff0c;如果key已存在&#xff0c;则add失败&#xff0c;返回false&#xff0c;如果key不存在&#xff0c;add成功&#xff0c;返回true。看源码中HashSet的add(E e)方法实现&#xff1a;…

【Git】IDEA 集成 GitHub

8、IDEA 集成 GitHub 8.1、设置 GitHub 账号 如果出现 401 等情况连接不上的&#xff0c;是因为网络原因&#xff0c;可以使用以下方式连接&#xff1a; 然后去 GitHub 账户上设置 token。 点击生成 token。 复制红框中的字符串到 idea 中。 点击登录。 8.2、分享工程到 GitHu…

【甄选靶场】Vulnhub百个项目渗透——项目五十五:SP-LEOPOLD v1.2(beef联动msf,脏牛提权)

Vulnhub百个项目渗透 Vulnhub百个项目渗透——项目五十五&#xff1a;SP-LEOPOLD v1.2&#xff08;beef联动msf&#xff0c;脏牛提权&#xff09; &#x1f525;系列专栏&#xff1a;Vulnhub百个项目渗透 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&am…

ZooKeeper-集群搭建

5)ZooKeeper 集群搭建 5.1)Zookeeper集群介绍 Leader选举&#xff1a; •Serverid&#xff1a;服务器ID 比如有三台服务器&#xff0c;编号分别是1,2,3。 编号越大在选择算法中的权重越大。 •Zxid&#xff1a;数据ID 服务器中存放的最大数据ID.值越大说明数据 越新&…

剑指offer—day1.用两个栈实现队列、包含min函数的栈

1.用两个栈实现队列 本题来源&#xff1a;力扣 剑指 Offer 09. 用两个栈实现队列 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/题目描述 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两…

IP-guard如何映射到外网登录访问管理

终端安全管理(endpoint security management)是一种保护网络安全的策略式方法&#xff0c;它需要终端设备在得到访问网络资源的许可之前遵从特定的标准。随着企业信息化发展&#xff0c;终端安全管理系统需求不断扩大&#xff0c;相关系统软件被广泛应用。 IPguard即IP-guard&a…

线段树(重要!多加理解懒惰标记!)

基础概念&#xff1a; 线段&#xff08;区间&#xff09;[L,R] 所对应的线段树是由区间 [L,R] 及其子区间构成的二叉树&#xff08;如下图所示&#xff09; 线段树具有的特性&#xff1a; &#xff08;1&#xff09;线段树的叶结点为只有一个元素的区间&#xff0c;因此长度为…

最新版海豚调度dolphinscheduler-3.1.3安装部署详细教程

0 背景 本文基于Ambari集群搭建最新版本的海豚调度dolphinscheduler-3.1.3版本&#xff0c;后续会尝试整合到Ambari中。 1 安装准备 安装dolphinscheduler需要在环境中安装如下依赖 ① JDK8 下载JDK (1.8)&#xff0c;安装并配置 JAVA_HOME 环境变量&#xff0c;并将其下的 …

用 22 张照片打开 23 年

魔幻又带有现实主义色彩的三年似乎终将见底。这也为 2023 年赋予了一些新的意义&#xff0c;或许是充满生机、怀揣希望、满怀爱意&#xff0c;或许是重新启航、步履不停、勇敢探索……为此&#xff0c;我们收集了 22 位社区用户和公司小伙伴在过去一年的「特别 Moment」及新年愿…

你认为DAO是否可行?新年计划,卯足干劲,兔必No.1

文章目录&#x1f31f; 课前小差&#x1f31f; 聚沙成塔&#x1f31f; 社会价值&#x1f31f; DAO是什么&#x1f31f; 国产化&#x1f31f; 商业化回报&#x1f31f; 写在最后&#x1f31f; 课前小差 哈喽&#xff0c;大家好&#xff0c;我是几何心凉&#xff0c;这是一份全新…

Spring高级之BeanFactory功能

首先&#xff0c;我们想要知道一个接口有哪些功能&#xff0c;就必须要看这个接口的源代码&#xff0c;在idea中&#xff0c;选中这个接口CtrlF12&#xff0c;来查看这个接口里面有哪些方法&#xff1a; 表面上来看&#xff0c;功能其实很少&#xff0c;查看源码及其方法功能 …

来吧,Jenkins+git+mvn+shell一键部署实践起来

环境&#xff1a;centosJenkins-2.319系统自带gitmvn3.8.7jdk1.8一、安装jdk1、https://blog.csdn.net/codedz/article/details/124044974centos自带了openjdk&#xff0c;我是选择自己重新搞一个&#xff0c;用的上面链接地址的yum安装方式2、安装完成查看版本查看java安装路径…

优思学院|质量人对控制图中的规格线和控制线傻傻分不清?

质量人、六西格玛[1]人和很多不同类型的工程师都需要了解什么是控制图&#xff0c;而在控制图中的规格限制&#xff08;Specification Limit&#xff09;"和"控制限制&#xff08;Control Limit&#xff09;"原来对好多人来说都是傻傻分不清&#xff01; 规格限…

线段树入门

对于一个区间进行询问&#xff0c;进行修改&#xff0c;都是用线段树进行处理。线段树和普通的树不一样&#xff0c;普通的树的节点存的是一个编号&#xff0c;线段树存的是一个区间&#xff0c;而且线段树一定是一棵完全二叉树。例如&#xff1a;这就是一棵线段树。例如对于[1…

【Ajax】数据交换格式XML 和 JSON

一、什么是数据交换格式数据交换格式&#xff0c;就是服务器端与客户端之间进行数据传输与交换的格式。前端领域&#xff0c;经常提及的两种数据交换格式分别是 XML 和 JSON。其中 XML 用的非常少&#xff0c;所以&#xff0c;我们重点要学习的数据交换格式就是 JSON。二、XML1…

让交互更加生动!巧用CSS实现鼠标跟随 3D 旋转效果

简单分析一下&#xff0c;这个交互效果主要有两个核心&#xff1a; 借助了 CSS 3D 的能力 元素的旋转需要和鼠标的移动相结合 本人简单的说一下如何使用纯 CSS 实现类似的交互效果&#xff0c;以及&#xff0c;借助 JavaScript 绑定鼠标事件&#xff0c;快速还原上述效果。 …

数据结构---set篇

第一次超时是因为用memsetmemsetmemset不得不超时&#xff0c;第二次超时是我用vectorvectorvector数组的时候&#xff0c;然后以O(n)O(n)O(n)复杂度查找元素之后使用eraseeraseerase方法进行删除&#xff0c;第三次超时是我把查找元素改成了O(logn)O(logn)O(logn)之后用vector…

epoll的ET和LT模式

简介 epoll对fd的操作有两种模式&#xff1a;LT(Level Trigger&#xff0c;水平触发)模式&#xff0c;和ET&#xff08;Edge Trigger,边缘触发&#xff09;模式。 LT 模式是默认的工作模式&#xff0c;这种模式下&#xff0c;epoll相当于一个效率较高的poll&#xff1b; ET模…

89. 注意力机制以及代码实现Nadaraya-Waston 核回归

1. 心理学 动物需要在复杂环境下有效关注值得注意的点心理学框架&#xff1a;人类根据随意线索和不随意线索选择注意点 随意&#xff1a;随着自己的意识&#xff0c;有点强调主观能动性的意味。 2. 注意力机制 2. 非参注意力池化层 3. Nadaraya-Waston 核回归 4. 参数化的注意…

Downie4.6.4视频下载工具

前言 Downie是Mac下一个简单的下载管理器&#xff0c;可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 下载 Downie 解压后直接安装 主要特点 支持许多网站目前支持超过1,000个不同的网站&#xff08;包括YouTube&#…