spring的自定义MVC

Spring MVC 自定义参数解析器 Spring MVC 自定义参数处理器SpringMVCDispatcherServletRequestMappingHandlerAdapterRequestResponseBodyMethodProcessor自定义解析器RequestParamMethodPropertiesBodyArgumentConvertObjectResolver配置测试Maven信息 SpringMVC spri... 阅读详情

1. 什么是springMVC?
   Spring Web MVC是一种基于Java的实现了MVC设计模式的、请求驱动类型的、轻量级Web框架。


2. SpringMVC处理请求的流程图


  
  2.1 工作原理:

 

  1. 首先用户发送请求-->DispatherServlet
  2. DispatcherServlet-->HandlerMapping
  3. DispatcherServlet-->HandlerAdapter
  4. HandlerAdapter-->处理器功能处理方法的调用
  5. ModelAndView的逻辑视图名-->ViewRecolver
  6. View-->渲染
  7. 返回控制权给DispatcherServlet,由DispatcherServlet返回呼应给用户,流程结束

  2.2 请求流程(详解《SpringMVC工作原理图》)

  1. 用户发送请求至前端控制器DispatcherServlet(中央控制器)
  2. DispatcherServlet收到请求调用HandlerMapping(处理映射器)
  3. 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
  4. DispatcherServlet调用HandlerAdapter处理器适配器 
  5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
  6. 由Controller执行完成返回ModelAndView
  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传递给ViewReslover视图解析器,请求视图解析
  9. ViewReslover解析后返回具体View
  10.DispatcherServlet根据View进行视图渲染(即将模型数据填充至视图中)
  11.DispatcherServlet响应用户

3. SpringMVC核心开发步骤
  3.1 DispatcherServlet在web.xml中的部署描述,从而拦截请求到springMVC
  3.2 HandlerMapping的配置,从而将请求映射到处理器
  3.3 HandlerAdapter的配置,从而支持多种类型的处理器
  3.4 处理器(页面控制器)的配置,从而刊行功能处理
  3.5 ViewResolver的配置,从而将逻辑视图名解析为具体的视图技术


4. SpringMVC的组件
  4.1 前端控制器(DispatcherServlet):接收请求,响应结果,相当于转发器,中央处理器
  4.2 请求到处理器映射(HandlerMapping):根据配置或者注解找到最终要执行的Handler
  4.3 处理器适配器(HandlerAdapter):按照特定规则(HandlerAdapter要求的规则)去执行Handler
  4.4 视图解析器(ViewResolver):进行视图解析,根据逻辑视图名解析成真正的视图(view)
  4.5 处理器或页面控制器(Controller):执行具体的用户请求
  4.6 验证器(Validator)
  4.6 命令对象(Command 请求参数绑定到的对象就叫命令对象)
  4.7 表单对象(Form Object提供给表单展示和提交到的对象就叫表单对象)


5. 如何在项目中添加springmvc
  5.1 添加相关依赖
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
      </dependency>

      <!-- ********************** JSTL依赖 ********************** -->
      <!-- 缺少下面的这两个jar包会报java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config-->
      <!-- 原因:org.springframework.web.servlet.view.JstlView在视图解析时需要这二个jar包-->
      <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
      </dependency>
      <dependency>
          <groupId>taglibs</groupId>
          <artifactId>standard</artifactId>
          <version>1.1.2</version>
      </dependency>
    
  5.2 SSM集成

    5.2.1 在WEB-INF下添加springmvc-servlet.xml(spring-mvc.xml)
 
    注1:修改application-mybatis的扫描配置
    context:component-scan base-package="com.zking.ssm" use-default-filters="true">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
    </context:component-scan>
  
    注2:修改spring-mvc.xml的扫描配置
    <context:component-scan base-package="com.zking.ssm" use-default-filters="false">
       <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    作用:放置重复扫描装配。
    

    5.2.2 修改web.xml配置SpringMVC的核心控制器DispatcherServlet

    1) Spring与Web集成配置
    2) 中文乱码过滤器
    3) 配置SpringMVC核心控制器DispatcherServlet

  5.3 第一个springMVC程序:HelloWorld

6. 常用注解
  6.1 @Controller:用于标识处理器类

  6.2 @RequestMapping:请求到处理器功能方法的映射规则,可定义到类和方法
      常用参数:value、method
      可将@RequestMapping标签定义到类名处窄化路径

  6.3 @RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定
      常用参数:value、required、defaultValue
      注:required设置成false的参数类型必须是引用类型,因为基本数据类型是不能为null的

  6.4 @ModelAttribute:请求参数到命令对象的绑定
      常用参数:value
    6.4.1 可用@ModelAttribute标注方法参数,方法参数会被添加到Model对象中(作用:向视图层传数据)
    6.4.2 可用@ModelAttribute标注一个非请求处理方法,此方法会在每次调用请求处理方法前被调用(作用:数据初始化)
    6.4.3 可用@ModelAttribute标注方法,方法返回值会被添加到Model对象中(作用:向视图层传数据)
          但此方法视图的逻辑图就会根据请求路径解析,例如:a/test42 --> /WEB-INF/a/test42.jsp
          太麻烦几乎不用,不用直接保存到Model或ModelAndView中

  6.5 @SessionAttributes:指定ModelMap中的哪些属性需要转存到session
      常用参数:value、types
      注1:必须放到class类名处

  6.6 @InitBinder(本章暂不介绍):用于将请求参数转换到命令对象属性的对应类型

  6.7 @RequestBody(重要~~~~~):用于目前比较流行的ajax开发的数据绑定(即提交数据的类型为json格式)
      注1:使用@RequestBody注解的时候,前台的Content-Type必须要改为application/json,
           如果没有更改,前台会报错415(Unsupported Media Type)。
           后台日志就会报错Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported。
           这些错误Eclipse下Tomcat是不会显示错误信息的,只有使用了日志才会显示
      $.ajax({
                url : "jsontest",
                type : "POST",
                async : true,
                contentType : "application/json",
                data : JSON.stringify(json),
                dataType : 'json',
                success : function(data) {
                    if (data.userstatus === "success") {
                        $("#errorMsg").remove();
                    } else {
                        if ($("#errorMsg").length <= 0) {
                            $("form[name=loginForm]").append(errorMsg);
                        }
                    }
                }
            });
      

  其它
  @CookieValue cookie数据到处理器功能处理方法的方法参数上的绑定
  @RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定
  @RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换);
  @ResponseBody:处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);
  @ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因;
  @ExceptionHandler:注解式声明异常处理器;
  @PathVariable:请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定,
  作业:写出上述几个非常用注解作用及使用案例

7. 请求处理方法的参数及返回值
  7.1请求处理方法的参数
      ServletRequest/HttpServletRequest
      HttpServletResponse/HttpServletResponse
      HttpSession
      RedirectAttributes
      Model/ModelAndView

      WebRequest/NativeWebRequest
      Locale
      InputStream/Reader
      OutputStream/Writer
      Principal
      HttpEntiry<?>
      Errors
      BindingResult
      SessionStatus
      UriComponentsBuilder
      带@PathVariable,@MatrixVariable注释的对象
      @RequestParam,@RequestHeader,@RequestBody,@RequestPart

      特别重要的是:org.springframework.ui.Model类型,每次调用请求处理方法时,SpringMVC都创建Model对象并将
      其注入到各种对象

  7.2返回值的类型
      ModelAndView
      Model
      String(代表一个逻辑视图名)

      void
      Map
      View
      Callable
      DeferredResult
      其它任意类型,spring将其视作输出给View的对象模型


8. 页面跳转
  8.1 转发:"forward:path"
  8.2 重定向:"redirect:path"
  注1:这两种跳转方式将会绕开视图解析器的前缀和后缀
  注2:还有就是如果是在同一controller中则不用使用"/"从根目录开始,而如果是在不同的controller则一定要从根目录开始。

9. 访问其它的静态资源(被springmvc拦截了)
   <mvc:resources location="/css/" mapping="/css/**"/>
   <mvc:resources location="/images/" mapping="/images/**"/>
   <mvc:resources location="/js/" mapping="/js/**"/>
   
   <mvc:resources location="/static/" mapping="/static/**" cache-period="86400" />
   SpringMVC会自动给静态资源Response添加缓存头Cache-Control和Expires值


作业:
1) springmvc配置一个首页

 @RequestMapping:请求到处理器功能方法的映射规则
* 1)作用范围:类上和方法上
* 2)含义
* 如果作用在类上,起到窄化路径的作用
* 如果作用在方法上,表示该方法为请求处理方法;
* 3)属性:
*
* value:如果作用在类上,叫窄化路径;
*      如果作用在方法上,叫请求路径;
* 注意:如果单独使用value属性,那么可以省略属性名,但是有多个属性就不可以省略
*
* method:请求方式,get或者post(明文或者隐藏)
*
* 2.参数传递
* 1)直接传递String和八大基础类型
* 2)传递对象类型的参数
* 3)@RequestParam
*4)传递Request/Response/Session
* 5)传递集合类型
* 5.1)请使用@RequestParam方式接受Map类型的参数
*5.2)使用@RequestParam方式传递List或者Map类型的参数,但是参数的格式必须是JSON
* 注意必须导入Jackson的jar包!!!
*
* JSON格式:
* 1)数组:【1,2,3】
* 2) 对象:{'name':'zs','age':21}
* 3) 混合:{'total':44,'rows':[{'bookName':'深思熟虑','price':13},{....}]}
*
*3.返回值
* 以下三种方式都属于需要跳转到视图解析器中进行视图解析操作
* 3.1)String
* 3.2)ModelAndView
* 3.3)String+Model
* 第四种此外
* 3.4)JSON(重要)
*  *
*  4.跳转方式
*  1)forward:转发  "forward:path"
*  2)redirect:重定向  "redirect:path"
*注意:
* 注1:这两种跳转方式将会绕开视图解析器的前缀和后缀
*   注2:还有就是如果是在同一controller中则不用使用"/"从根目录开始,而如果是在不同的controller则一定要从根目录开始。
*注3:转发和重定向的路径,不是逻辑视图名,而是请求方法名
* 3.1)如果在本Controller里面跳转,不需要使用"/"开头
* 3.2)如果在不同的Controller里面跳转,则需要使用"/"开头,并且是窄化路径+请求路径
* 例如:redirect:/order/addOrder
*
Spring MVC 自定义方法参数注入 在Spring MVC中我们会发现一个特别便利的一个小功能,那就是在Controller层映射的方法上 Spring会自动帮我们注入参数,帮我们初始化对象。 比如常用的:   @RequestParam  :取querystring 当中的参数   @PathVariable  :取 在@RequestMapping 中定义的占位符中的参数(/test/{id})   阅读详情

相关推荐

Eclipse 数据空间组件(EDC)项目介绍

在当今数字经济的背景下,数据成为了新的“石油”。但与石油不同的是,数据可以无限共享且再生。然而,如何在保持数据主权的前提下实现高效、安全的数据共享,成为了企业和组织面临的主要挑战。这时,**Eclipse 数据空间组件(Eclipse Dataspace Components, EDC)**应运而生,它为企业在多方参与的数据交换中提供了一个标准化、可扩展的解决方案。数据空间不仅是一个多组织间的数据共享协议,还是一套支撑这些协议运行的技术基础设施。

m0_74331272的博客 4597

Spring配置之<context:include-filter/>和<context:exclude-filter/>详解

我们在Spring MVC中的配置中一般会遇到这两个标签,作为<context:component-scan />的子标签出现。我们在使用这两个标签时候要注意以下几点: 1、我们经常Spring-applicationContext.xml和Spring-MVC.xml分开配置,在Spring-MVC.xml中只对@Controller扫描即可,作为一个控制器,其他事情不需要做,在Spring-applicationContext.xml只对一些事务逻辑的注解扫描。context:exclude

wzhy2016的博客 2831

SAP BSP网页开发入门:从SE80创建到MVC实战(附成品展示)

本文详细介绍了SAP BSP网页开发的入门与实战,从SE80环境搭建到MVC架构实现的全流程。通过具体案例和代码示例,帮助开发者掌握业务服务器页面(BSP)技术,提升SAP Web化转型中的开发效率,适用于需要扩展SAP功能的企业场景。

x1y2z的博客 1万+

“context:include-filter”与“context:exclude-filter”标签作用解释

转:注意到spring中&lt;context:component-scan&gt;标签中会出现include和exclude的子标签,具体是做什么用的?spring的配置文件与springmvc的配置文件分开加载,在spring容器初始化的时候,会先加载(web.xml)&lt;context-param&gt;中的配置,之后再加载&lt;servlet&gt;中的&lt;init-param&...

hydy的博客 1万+

最简解决 Unity Error Registry configuration is invalid Unable to connect https packages.unity.cn

前言 在学习其他大佬项目的时候,大佬说项目能直接运行,然后我拉下来就报如下错误 Unity报错:[Package Manager]Error Registry configuration is invalid:Unable to connect “https://packages.unity.cn” 翻了很多博发现是 unity3d 中国增强版的原因,中国增强版屏蔽了国外自定义的插件仓库。 安装 非中国增强版后可以成功打开。 然后大家给出的解决方案都比较激进,大抵就是更换Unity版本就OK了。 当然我是觉

Gipsyz的博客 6842

华为[ENSP]—— 实验二、三层交换和ARP的工作原理

华为[ENSP]三层交换和ARP的工作原理

weixin_62594100的博客 6411

Spring实战——context:include-filter注解

一配置文件 <?xml version="1.0" encoding="GBK"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://...

实践求真知 889

2025.05.29【Network】多组学分析:网络互作图绘制

本文介绍了使用R语言进行网络图绘制的方法与技巧。重点讲解了三个核心R包的使用:igraph用于网络图数据准备与基础绘制,ggraph基于图形语法实现高级可视化,networkD3则为网络图添加交互功能。文章涵盖了从基本概念、包安装、创建网络图对象,到自定义样式布局、添加交互性等完整流程,并提供了度分布、聚类系数等网络分析指标的计算方法。通过清晰的代码示例,帮助读者掌握生物信息学数据可视化的关键技能,为复杂数据的直观展示和分析提供实用工具。

227

spring应用手册-IOC(XML配置实现)-(37)-context:include-filter标签

戴着假发的程序员出品 context:include-filter标签 spring应用手册(第一部分) 我们已经知道context:component-scan的配置可以通知spring扫描拥有spring标准注解的类。这些标注大致是:@Component、@Controller、@Service、@Repository。但是我们也可以通过context:include-filter配

593

【PINN物理信息网络】基于PINN物理信息网络求解泊松方程(python)

【PINN物理信息网络】基于PINN物理信息网络求解泊松方程(python)

k8291121的博客 2811

任务混部最少服务器数量计算问题

这里的并行度指的是该任务运行时会占用的服务器数量。要注意的是,一个服务器在每个时刻可以被任意任务使用,但同一时刻最多只能被一个任务占用,并且任务运行结束后会立即释放服务器(结束时刻不占用)。最后,我们从字典中找出服务器数量的最大值,这个最大值就是完成这批任务混部最少需要的服务器数量。对于每个任务,我们会遍历其对应的时间区间,将该任务的并行度累加到对应时刻的服务器数量上。任务混部的目标是让这批任务由同一批服务器承载运行,你需要计算完成这批任务混部最少需要多少服务器,以此来最大化控制资源成本。

m0_62153576的博客 106

Spring MVC 自定义 PropertyEditor

PropertyEditor 隶属于java.beans包,允许用户编辑给定类型的属性值。 PropertyEditorRegistry 隶属于org.springframework.beans包,是PropertyEditor的注册表,提供了注册及寻找接口。 DataBinder 是PropertyEditorRegistry的具体实现。 接下来看看是findCustomerEdi...

weixin_30475039的博客 332

【QGIS】软件下载安装及GIS4WRF插件使用

【QGIS】软件下载安装及GIS4WRF插件使用

WW、forever的博客 1799

如何自定义 Spring MVC 的配置?

并覆盖这些方法,可以灵活的定制Spring MVC的行为,同时还能充分利用Spring Boot的自动配置带来的便利。接口来自定义 Spring MVC (尤其是在 Spring Boot 环境中) 的配置。

专注于技术分享 770

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring MVC自定义异常

在一些Web管理系统项目中,自定义异常最为常见,为什么要自定义异常呢?主要还是为了统一所有异常,例如:如何用户在用该系统时,突然发生异常或者错误,用户是看不明白的,所以要友好地提示用户。要解决这个问题可以用Spring MVC框架提供的接口来实现自定义异常。 首先,创建一个自定义异常类,该类继承异常类 public class CustomException extends Exception...

锦鲤(⑉°з°)--♡的博客 202

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

自定义Spring-MVC HandlerMapping Demo

自定义Spring-MVC HandlerMapping Demo 这里就不介绍Spring-MVC 的流程了,不懂的可以百度; 你都知道什么是HandlerMapping了,应该是知道什么Spring-MVC的工作流程 接下来就是就是demo示例了。 我们先分析一下Spring-MVC的自带RequestMappingHandlerMapping映射器 这是RequestMappingHandlerMapping 的继承树 顾名思义这个就是解析我们@RequestMapping()的映射器,我后面就

张凯强的博客 712

Spring Boot 自定义异常及Spring MVC处理异常流程

Overridethrow new ForbiddenOperationException("信息不存在");//业务代码未受检异常:RuntimeException及其子类属于未受检异常,这意味着它们在编译时不需要被显式捕获或声明抛出。这减少了代码的冗余,使得开发者可以更加专注于业务逻辑的实现。事务管理:在Spring框架等事务管理环境中,默认情况下只有未捕获的RuntimeException会触发事务回滚。

qq_75166530的博客 1496

使用Spring Boot和Spring MVC自定义HttpMessageConverters

为Spring Boot应用程序或直接的Spring MVC应用程序公开基于REST的终结点很简单,以下是一个控制器,该终结点公开了一个终结点,用于基于其发布的内容创建实体: @RestController @RequestMapping("/rest/hotels") public class RestHotelController { .... @RequestMapp...

cunfen8879的博客 269

spring自定义MVC与自定义处理异常

一、spring自定义MVC MVC,我们都知道是model、view、controller的首字母缩写,今天来讲讲自定义的MVC,可能会对MVC有更好的理解。 1、view view就是我们所说的视图层,用来渲染数据的。在spring中,可以实现接口View来自定义一个view,参考代码如下: package my.app; import java.util...

AndyWei147的博客 311

Spring MVC自定义验证注释

在上一教程中,我展示了如何使用注释来验证表单 。 这对于简单的验证非常有用,但是最终,您需要验证一些现成的注释中没有的自定义规则。 例如,如果您需要根据输入的出生日期来验证用户已超过21岁,或者可能需要验证用户的电话区号在美国内布拉斯加州,该怎么办。 本教程包含完整的源代码,将显示如何创建自定义验证注释,您可以在上一教程中探讨的JSR-303和Hibernate Validator注释中使用...

最佳 Java 编程 250

Spring MVC –自定义RequestMappingHandlerMapping

在xml bean定义文件中使用<mvc:annotation-driven />配置Spring MVC时,在内部将一个名为RequestMappingHandlerMapping的组件注册到Spring MVC。 该组件或通常是HandlerMapping组件负责将请求URI路由到处理程序,这些处理程序是使用@RequestMapping注释进行注释的控制器方法。 Requ...

最佳 Java 编程 1337

Spring MVC如何实现自定义注解,如@RequestParam

@TOC微额 Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value ‘?D1ú±ê×?ê±??’ is unrecognized or represents more than one time zone. at sun.reflect.NativeCon...

baidu_27636661的博客 1064

Spring MVC 自定义视图解析器执行流程

本篇以自定义Excel视图为例 一、自定义视图 除了配置SSM环境以外,还需要支持生成Excel文件的jar包 本例jar包: spring xml文件配置: <context:component-scan base-package="com.jd"></context:component-scan> <bean class="org.springframework...

qiangzhogshou的博客 519

spring mvc 自定义类型转换器

一、编写自定义转换类(实现接口:org.springframework.core.convert.converter.Converter) public class CustomConverter implements Converter<String, Student>{ @Override public Student convert(String ...

zyfzhangyafei的专栏 281

spring mvc 自定义处理静态资源

1. 使用此配置不能灵活的控制资源访问,可以自定义静态资源访问类 public class ServletHttpRequestHandler extends DefaultServletHttpRequestHandler{ @Override public void handleRequest(HttpServletRequest request, HttpServletRespon

Rudy的专栏 1442
上一篇: mybatis的关联关系
下一篇: spring的自定义MVC的CRUD和文件的上传、下载
暗夜小白白
博客等级 码龄5年 15粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值