前言 一、SpringMVC简介 1.1、SpringMVC引言 为了使Spring有可插入的MVC架构,SpringFrameWork在Spring基础上开发SpringMVC框架,从而在使用Spring进行WEB开发时可以选择使用Spring的SpringMVC框架作为web开发的控制器框架。
spring知识图谱分享:
1.2、SpringMVC的优势 SpringMVC是一个典型的轻量级MVC框架,在整个MVC架构中充当控制器框架,相对于之前的struts2框架,SpringMVC运行更快,其注解式开发更高效灵活。
可以和Spring框架无缝整合。运行效率远远高于struts2框架。注解式开发更高效。
二、SpringMVC入门 2.1、环境搭建 2.1.1、引入依赖 依赖就忽略了,我放在了评论区!
2.1.2、编写配置文件 2.1.4、编写控制器 2.2、注解详解 2.2.1、@Controller 该注解用来类上标识这是一个控制器组件类并创建这个类实例,告诉spring我是一个控制器。
2.2.2、@RequestMapping 这个注解可以作用在 *** 上或者是类上,用来指定请求路径。
2.3、SpringMVC的跳转方式 传统的Servlet开发跳转方式有两种:
forward:forward跳转,是在服务器内部跳转,所以是一次请求,地址栏不变。跳转时可以携带数据进行传递(使用request作用域进行传递)。redirect:redirect跳转是客户端跳转,所以是多次请求,地址栏会改变,跳转时不可以携带数据传递。
2.3.1、Controller ——>前台页面 2.3.1.1、forward 通过测试我们可以发现,SpringMVC默认的就是使用请求转发的方式来进行跳转到前台页面的;
2.3.1.2、redirect 如果我们想使用重定向的方式来进行跳转的话,需要使用SpringMVC提供给我们的关键字——redirect:来完成。
语法:return "redirect:/视图全路径名";
**注意:**在redirect:后接页面的不是逻辑名,而是全路径名。因为redirect跳转不会经过视图解析器。
2.3.1Controller ——>Controller 2.3.1.1、forward 如果我们想使用请求转发的方式跳转到相同(不同)Controller的不同 *** 的时候,我们也需要使用SpringMVC提供的关键字:forward:。
语法:return:"forward: /需要跳转的类上的@RequestMapping的值/需要跳转的 *** 上的@RequestMapping的值;"
2.3.1.2、redirect 如果我们想使用重定向的方式跳转到相同(不同)Controller的不同 *** 的时候,我们也需要使用SpringMVC提供的关键字:redirect:。
语法:return:"redirect: /需要跳转的类上的@RequestMapping的值/需要跳转的 *** 上的@RequestMapping的值;"
2.4、SpringMVC的参数接收 2.4.1、Servlet接收参数的方式 在传统的Servlet开发,我们一般都是用这种方式来进行接收请求参数的。
他有几个需要注意的点:
参数要求是表单域的name属性。getParameter *** 用于获取单个值, 返回类型是String。getParameterValues *** 用于获取一组数据, 返回结果是String[]。冗余代码较多, 使用麻烦, 类型需要自己转换。
2.4.2、SpringMVC的参数接收 SpringMVC使用的是控制器中 *** 形参列表来接收客户端的请求参数,他可以进行自动类型转换,要求传递参数的key要与对应 *** 的形参变量名一致才可以完成自动赋值。他的优势很明显:
简化参数接收形式(不需要调用任何 *** , 需要什么参数, 就在控制器 *** 中提供什么参数)。参数类型不需要自己转换了。日期时间(默认为yyyy/MM/dd)得注意,需要使用@DateTimeFormat注解声明日期转换时遵循的格式, 否则抛出400异常。
2.4.2.1、基本数据类型 要求传递参数的key要与对应 *** 的形参变量名一致才可以完成自动赋值。
2.4.2.2、对象类型 如果我们需要接收对象类型的话,直接将需要接收的对象作为控制器的 *** 参数声明即可。SpringMVC会自动封装对象,若传递参数key与对象中属性名一致,就会自动封装成对象。
2.4.2.3、数组类型 如果我们需要接收数组类型的时候,只需将要接收的数组类型直接声明为 *** 的形式参数即可。
2.4.2.4、 *** 类型 SpringMVC不能直接通过形式参数列表的方式接收 *** 类型的参数,如果需要接收 *** 类型的参数必须将 *** 放入一个对象中,并且提供get/set *** ,才可以。推荐放入VO对象中进行封装,进而使用对象类型来进行接收。
2.5、SpringMVC接收参数中文乱码问题 2.5.1、GET请求 GET请求方式出现乱码需要分Tomcat版本进行讨论:
Tomcat8.x版本之前:默认使用server.xml中的URIEncoding="ISO-8859-1"编码,而不是"UTF-8"编码,进而会出现中文乱码。Tomcat8.x版本之后:默认使用server.xml中的URIEncoding="UTF-8",所以不会出现中文乱码问题。
2.5.2、POST请求 SpringMVC中默认没有对POST请求进行任何编码处理,所以无论什么版本直接接收POST请求都会出现中文乱码。
2.5.2.1、自定义过滤器解决POST乱码请求 在Servlet阶段,我们学过过滤器,我们可以自定义过滤器来进行过滤编码。
2.5.2.2、使用CharacterEncodingFilter解决POST乱码请求 2.6、SpringMVC中数据传递机制 2.6.1、什么事数据传递机制 数据传递机制主要包含三个问题:
数据如何存储?如何在页面中获取数据?在页面中获取的数据该如何展示?
2.6.2、Servlet的数据传递机制 在以前的Servlet开发中,我们一般是将数据放入作用域(request、session、application),如果数据是单个的直接用EL表达式在前端进行展示,如果是 *** 或者数组,可以用EL表达式? *** TL标签进行遍历后在前端进行展示。
三、前端控制器 3.1、什么是前端控制器 在 MVC 框架中都存在一个前端控制器,在 WEB 应用的前端(Front)设置一个入口控制器(Controller),是用来提供一个集中的请求处理机制,所有的请求都被发往该控制器统一处理,然后把请求分发给各自相应的处理程序。一般用来做一个共同的处理,如权限检查,授权,日志记录等。因为前端控制的集中处理请求的能力,因此提高了可重用性和可拓展性。
在没有前端控制器的时候,我们是这样传递和处理请求的。
有了前端控制器之后,我们变成了这样。
3.2、代码实现 Spring MVC 已经提供了一个 DispatcherServlet 类作为前端控制器,所以要使用 Spring MVC 必须在web.xml 中配置前端控制器。
3.3、注意 load-on-startup 元素是可选的:若值为 0 或者大于 0 时,表示容器在应用启动时就构建 Servlet 并调用其 init *** 做初始化操作(非负数的值越小,启动该 Servlet 的优先级越高);若值为一个负数时或者没有指定时,则在一次请求该 Servlet 才加载。配置的话,就可以让 SpringMVC 初始化的工作在容器启动的时候完成,而不是丢给用户请求去完成,提高用户访问的体验性。
3.4、映射路径 配置前端控制器的映射路径一般有以下的三种形式:
配置如 .do、.htm 是传统方式,可以访问静态文件(图片、 *** 、 CSS 等),但不支持 RESTful风格。配置成 /,可以支持流行的 RESTful 风格,但会导致静态文件(图片、 *** 、 CSS 等)被拦截后不能访问。配置成 /*,是错误的方式,可以请求到 Controller 中,但跳转到调转到 *** P 时被拦截,不能渲染 *** P 视图,也会导致静资源访问不了。
3.4.1、访问静态资源和 *** P 被拦截的原因 3.4.2、如何解决 3.4.2.1、方式一 在 web.xml 中修改,修改前端控制器的映射路径修改为*.do,但注意,访问控制器里的处理 *** 时,请求路径须携带 .do。
3.4.2.2、方式二 在 mvc.xml中加入一段配置,这个配置会在 Spring MVC 上下文中创建存入一个DefaultServletHttpRequestHandler 的 bean,它会 对进入DispatcherServlet的请求进行筛查,若不是映射的请求,就将该请求交由容器默认的 Servlet处理。
3.5、@ModelAttribute注解 在形参中的对象(必须是自定义类型),SpringMVC会默认将他存入Model中,名称是参数的类名首字母小写,有些时候,这个类会显得格外长,但是我们又有这种需求,比方说:查询条件的回显。我们只需在自定义类的前面加@ModelAttribute,里面写我们需要修改的key的名称即可。
四、处理响应 SpringMVC的作用是请求和处理响应,响应处理是指怎么编写控制器里面的处理 *** 接受请求做响应,找视图文件和往作用域中存入数据。要处理 *** 要做响应,一般处理 *** 返回的类型为 ModelAndView 和 String。
4.1、返回 ModelAndView *** 中返回 ModelAndView 对象,此对象中设置模型数据并指定视图。前端依旧是使用 *** TL+CgLib来进行取值。他有两个常用 *** :
addObject(String key, Object value):设置共享数据的 key 和 value。addObject(Object value):设置共享数据的 value,key 为该 value 类型首字母小写。
4.2、返回String 返回 String 类型(使用广泛),此时如果我们需要共享数据,那么就需要用到HttpServlet对象,Spring帮我们封装好了一个对象:Model 。组合使用,用其往作用域或模型中存入数据。
4.3、改进 我们会发现,如果我们需要写返回界面的话需要不断地写前缀和后缀,这个时候需要进行消除消除视图前缀和后缀,我们只需在Spring中进行配置视图解析器即可。
五、请求转发和重定向 5.1、请求转发和重定向的区别 5.2、请求转发 加上forward 关键字,表示请求转发,相当于request.getRequestDispatcher().forward(request,response),转发后浏览器地址栏不变,共享之前请求中的数据。加了关键字后,配置的视图解析器就不起作用了。如果返回视图必须写全路径
5.3、重定向 加上 redirect 关键字,表示重定向,相当于 response.sendRedirect(),重定向后浏览器地址栏变为重定向后的地址,不共享之前请求的数据。
5.4、请求路径 在请求转发和重定向的时候,我们一般有两种方式来写请求路径:
加/:使用是路径(推荐使用),从项目根路径找。(/response/test6 —> "redirect:/hello.html" —> localhost:/hello.html)不加/:使用是相对路径,相对于上一次访问上下文路径的上一级找。(/response/test6 —> "redirect:hello.html" —> localhost:/response/hello.html)
六、参数处理 6.1、处理简单类型的请求参数 我们在控制器的如何获取请求中的简单数据类型的参数参数?简单数据类型包含基本数据类型及其包装类、String 和BigDecimal 等形参接收。
6.1.1、请求参数名和控制器 *** 参数列表形参同名 如果前台传递过来的参数名和控制器 *** 中参数列表的形参参数名相同就无需做任何操作,SpringMVC会自动帮我们进赋值。
6.1.2、请求参数名和控制器 *** 参数列表形参不同名 如果前台传递过来的参数名和控制器 *** 中参数列表的形参参数名不相同的话,我们需要使用一个注解@RequestParam("前台携带的参数名")来告诉SpringMVC我们任何对数据来进行赋值。
6.2、处理复杂类型的请求参数 6.2.1、数组类型 对于数组类型参数,我们只需在 *** 参数的形参列表中定义一个同名的数组类型进行接收即可。
6.2.2、自定义类型 我们在很多的时候,需要接收的是一个自定义类型的对象。比如说我们进行保存用户,需要将前台传递的数据进行封装成一个自定义的用户类型,那么这个时候,只需要保证自定义的类型里面的字段和前端传过来的字段相同(注意传递参数名与封装对象的属性名一致),SpringMVC即可自动进行封装。
底层 Spring MVC 根据请求地址对应调用处理 *** ,调用 *** 时发现要传递 User 类型的实参,SpringMVC 会反射创建 User 对象,之后通过请求参数名找对应的属性,给对象的属性设置对应的参数值。
6.3、处理日期类型的请求参数 6.3.1、日期在请求参数上 如果日期在请求参数上,那么我们需要在处理 *** 的 Date 类型的形参贴上 @DateTimeFormat注解。
6.3.2、在封装的对象上 如果日期在封装对象的字段,那么我们需要在字段的上贴@DateTimeFormat注解。
七、文件上传与下载 7.1、文件上传 回顾之前使用 Servlet3.0 来解决文件上传的问题,编写上传表单(POST、multipart/form-data),还在处理 *** doPost 中编写解析上传文件的代码。但是在SpringMVC是可以帮我们简化文件上传的步骤和代码。
7.1.1、编写表单 注意请求数据类型必须是:multipart/form-data,且请求方式是POST。
7.1.2、修改web.xml 我们可以在web.xml中指定上传文件的大小。
7.1.3、配置上传解析器 在mvc.xml中配置上传解析器,使用springmvc中multipartfile接收客户端上传的文件必须配置文件上传解析器且解析的id必须为multipartResolver
7.1.4、配置上传控制器 7.2、文件下载 文件下载:将服务器上的文件下载到当前用户访问的计算机的过程称之为文件下载
7.2.1、开发控制器 下载时必须设置响应的头信息,指定文件以何种方式保存,另外下载文件的控制器不能存在返回值,代表响应只用来下载文件信息`
控件源码下载:
asp.net源码下载,jsp-springboot源码下载,jsp-eclipse源码下载,jsp-myeclipse源码下载,php源码下载,csharp-winform源码下载,vue-cli源码下载,c++源码下载
效果展示:
![点击并拖拽以移动](/i/l/?n=23&i=blog/2441432/202302/2441432-20230214115736302-90894418.gif)
标签:控制器,请求,SpringMVC,解决方案,上传下载,JS,参数,跳转,类型 From: https://www.cnblogs.com/zyzzz/p/17119139.html