百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

SpringMVC学习要点--十分钟帮你快速掌握框架核心

ccwgpt 2024-09-26 07:48 35 浏览 0 评论

《“爱读书”--给你讲技术》,我来看书,你来进步,让我们开始吧!

本书简介

书名为《Spring+MyBatis企业应用实战》,是本人在学习JavaEE框架时候的一本基础书籍,本书对于SpringMVC和MyBatis框架及相关基础知识讲述的比较清晰,适合需要详细学习Java框架的读者。

本文内容为本书第二章--第八章,记录和总结了所有SpringMVC的知识

DispatcherServlet

1.DispatcherServlet使用和配置

SpringMVC提供了一个名为org.springframework.web.servlet.DispatcherServlet的Servlet充当前端控制器,所有请求驱动都围绕这个DispatcherServlet来分配请求。DispatcherServlet是一个Servlet类,需要在web.xml中完成配置。

(1)配置了启动时立即加载Servlet

(2)需要配置springmvc-config.xml配置文件

(3)配置了用当前servlet处理所有请求URL

2.DispatcherServlet的分发原理

先看一下DispatcherServlet源码中的方法

源码如下:

initStrategies方法将在WebApplicationContext初始化后自动执行,自动扫描上下文的Bean,根据名称或类型匹配机制查找自定义的组件。如果没有找到则会装配一套默认组件,默认组件在DispatcherServlet.properties配置文件中。

配置文件如下:

如 果开发者希望使用自定义类型的组件,则只需要在Spring配置文件中配置自定义的Bean即可。MVC如果发现上下文中有用户自定义的组件,就不会使用默认组件。

SpringMVC开发步骤

1.在web.xml中定义前端控制器DispatcherServlet来拦截用户请求

2.定义处理用户请求的Handle类,可以实现Controller接口或使用@Controller注解

3.配置Handle,可采用xml文件或注解的方式

<!-- 配置Handle,映射/hello请求 -->
<bean name="/hello" class="org.fkit.controller.HelloController"/>
@Controller
public class HelloController{
    @RequestMapping(value="/hello")
    public ModelAndView hello(){
    }
}

4.编写视图资源,Handle处理用户请求结束后,通常会返回一个ModelAndView对象,该对象包含返回的试图名和模型。试图名代表需要显示的物理视图资源;模型用于传输数据给视图资源。

SpringMVC执行流程

说明如下:

(1)用户向服务器发送请求,请求被Spring的前端控制器DispatcherServlet截获

(2)DispatcherServlet对请求URL进行解析,得到URI。然后根据URI,调用HandlerMapping获得该Handler配置的所有相关对象,包括Handler对象以及Handler对象对应的拦截器,会被封装到一个HandlerExecutionChain对象中返回

(3)DispatcherServlet根据获得的Handler,选择一个HandlerAdapter。HandlerAdapter会被用于处理多种Handler,调用Handler实际处理请求的方法

(4)提取请求中的模型数据,开始执行Handler。在填充Handler的入参过程中,根据配置spring会帮你实现消息转换、数据转换、数据格式化、数据验证

(5)Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象。ModelAndView对象中包含试图名和模型

(6)根据返回的ModelAndView对象,选择一个ViewResolver返回给DispatcherServlet

(7)ViewResolver结合Model和View来渲染视图

(8)将试图渲染结果返回给客户端

SpringMVC常用注解

1.@Controller注解

@Controller用于标记一个类,使用它标记的类就是一个Controller对象,及一个控制器。Spring使用扫描机制查找应用中所有基于注解的控制器类。

@Controller
public class HelloController{
    @RequestMapping(value="/hello")
    public ModelAndView hello(){
    }
}

使用注解前需要如下步骤

  • 在SpringMVC配置文件的头中引入spring-context
  • 使用<context:component-scan/>元素,功能是:启动包扫描功能,以便注册带有@Controller、@Service、@Repository、@Component等注解的类成为Bean。base-package指定了需要扫描的类包,类包及其递归子包中的所有类都会被扫描。配置如下:
<context:component-scan base-package="org.fkit.controller"/>

springmvc-config.xml常用配置

说明如下:

(1)使用<context:component-scan>指定需要扫描的包

(2)<mvc:annotation-driven>会自动注册RequestMappingHandlerMapping和Request MappingHandlerAdapter两个Bean,提供注解的必要支持

(3)<mvc:default-servlet-handler>是静态资源处理器,SpringMVC会默认捕获所有请求,包括静态资源请求。配置了当前元素后静态资源不会被DispatcherServlet处理

(4)视图解析器InternalResourceViewResolver来解析视图,将View呈现给用户。配置的prefix属性表示视图的前缀,suffix表示视图的后缀。

2.@RequestMapping注解

@RequestMapping注解可以用来注释一个控制器类,所有方法都将映射为相对于类级别的请求,表示该控制器处理的所有请求都被映射到value属性所指示的路径下。

上图代表映射到如下路径:

http://localhost:8080/user/register
http://localhost:8080/user/login

常用属性如下:

3.请求处理方法可出现的参数类型

所有参数Spring会自动将值传给方法

(1)HttpServletRequest参数

(2)HttpSession参数

(3)HttpServletResponse

(4)InputStream

(5)OutputStream

(6)Map

(7)Model

(8)ModelMap

(9)BindingResult

(10)WebRequest

4.请求处理方法可返回的类型

  • ModelAndView
  • Model
  • Map
  • View
  • String

下面做一些详细说明。

(1)Model和ModelMap

SpringMVC在调用处理方法之前会创建一个隐含的模型对象,作为模型数据的存储容器。如果处理方法的参数为Model或ModelMap类型,则SpringMVC会将隐含模型的引用传递给这些参数。在处理方法内部,开发者可以通过这个参数对象访问模型中的所有数据,也可以向模型中添加新的数据。

(2)ModelAndView

控制器处理方法的返回值如果是ModelAndView,则既包含模型数据,也包含视图信息。

常用方法如下:

//添加模型数据
addObject(String key, Object value);
//设置视图
setViewName(String name);

5.页面转发

(1)转发到JSP

//默认forward跳转
return "main";
modelAndView.setViewName("main");
//重定向页面
return "redirect:/main.jsp";
modelAndView.setViewName("redirect:/main.jsp");

(2)转发到其他处理方法

//forward跳转
return "forward:/main";
modelAndView.setViewName("forward:/main");
//重定向
return "redirect:/main";
modelAndView.setViewName("redirect:/main");

6.@RequestParam注解

@RequestParam用于将指定的请求参数赋值给方法中的形参。属性如下:

name:指定请求参数绑定的名称
value:name属性的别名
required:指定参数是否必须绑定
defaultValue:指定默认值

7.@PathVariable注解

@PathVariable可以方便的获得请求URL中的动态参数。属性如下:

举例如下:

@RequestMapping(value="/pathVariableTest/{userId}")
public void pathVariableTest(@PathVariable Integer userId)

假如请求的URL为http://localhost:8080/pathVariableTest/1,则自动将URL中模板变量{userId}绑定到通过@PathVariable注解的同名参数上,即userId变量将被赋值为1。

8.@RequestHeader注解

@RequestHeader注解用于将请求头信息数据映射到功能处理方法的参数上。属性如下:

举例如下:

9.@CookieValue注解

@CookieValue注解用于将请求的Cookie数据映射到功能处理方法的参数上。属性如下:

举例如下:

10.@RequestAttribute注解

@RequestAttribute注解用于访问由请求处理方法、过滤器或拦截器创建的、预先存在于request作用域中的属性,将该属性转换到目标方法的参数。属性如下:

举例如下:

11.@SessionAttribute注解

@SessionAttribute注解用于访问由请求处理方法、过滤器或拦截器创建的、预先存在于session作用域中的属性,将该属性转换到目标方法的参数。属性如下:

举例如下:

12.@ModelAttribute注解

@ModelAttribute注解用于将请求参数绑定到对象。

举例如下:

Form请求的参数值会自动入参到@ModelAttribute注解的对象的同名属性中

13.@RequestBody注解

@RequestBody注解用来处理content-type类型为:application/json或application/xml的情况,将请求数据绑定到方法参数上。

举例如下:

其中前台向处理方法传递了Json格式的数据,Json数据的key和Book属性相对应

14.@ResponseBody注解

@ResponseBody注解用于将请求处理方法返回的对象,转换为指定格式后,写入到Response对象的body中。返回的数据不是HTML页面,而是其他格式数据,如JSON、XML时使用注解。

举例如下:

上图将List转换为Json格式输出

15.@RestController注解

@RestController注解相当于同时使用了@Controller和@ResponseBody。用于RESTFUL风格的请求处理方式。

SpringMVC异常处理

SpringMVC提供的两种异常处理方式:

  • 使用异常处理器SimpleMappingExceptionResolver,类有如下方法:
//该方法处理程序执行期间被抛出的异常,返回一个模型和视图,视图返回错误处理页面
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response)

通过springmvc-config.xml配置实现

<!-- p:defaultErrorView="error"表示所有没有指定的异常都跳转到异常处理页面error
     p:exceptionAttribute="ex"表示异常处理页面中访问的异常对象变量名为ex -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"
      p:defaultErrorView="error" p:exceptionAttribute="ex">
      <!-- exceptionMappings表示映射的异常,接受参数是一个Properties,key是异常类名,value是处理异常的页面 -->
      <property name="exceptionMappings">
          <props>
              <prop key="IOException">ioerror</prop>
              <prop key="SQLException">sqlerror</prop>
         </props>
     </property>
</bean>
  • 使用@ExceptionHandler注解实现局部异常处理

@ExceptionHandler注解只在当前类生效

  • 使用@ControllerAdvice注解实现全局异常处理

使用<context:component-scan>扫描到@ControllerAdvice注解后,会将注解修饰的类内部使用@ExceptionHandler、@InitBinder、@ModelAttribute注解的方法应用到所有请求的异常处理上。

SpringMVC国际化

1.messageSource接口

SpringMVC不直接使用java.util.ResourceBundle,而是使用messageSource的Bean来配置国际化属性文件。

上图basenames指定了资源文件的名称

2.localeResolver接口

SpringMVC使用语言区域解析器来实现用户选择语言区域。提供了一个语言区域解析器接口LocaleResolver,实现类包括:

  • AcceptHeaderLocaleResolver
  • SessionLocaleResolver
  • CookieLocaleResolver

AcceptHeaderLocaleResolver是默认解析器,会读取浏览器accept-language标题,来确定使用哪个语言区域

3.message标签

SpringMVC显示本地化消息使用message标签,使用前需先导入taglib标签库。

<%@taglib prefix="spring" uri="http://www.springframework.org/tags"%>

message标签属性如下:

4.AcceptHeaderLocaleResolver

实现步骤:

(1)创建资源文件

message_en_US.properties

message_zh_CN.properties

(2)在JSP中使用message标签输出国际化消息

(3)在SpringMVC配置文件中加载国际化资源文件并配置

(4)可在controller中使用国际化

RequestContext requestContext = new RequestContext(request);
String username = requestContext.getMessage("username");

SpringMVC数据转换、格式化、校验原理

Spring MVC框架将ServletRequest对象及处理方法的参数对象传递给DataBinder,DataBinder调用ConversionService组件进行数据类型转换、数据格式化工作,并将ServletRequest中的消息填充到参数对象中。然后再调用Validator组件对已经绑定了请求消息数据的参数对象进行数据合法性校验,并最终生成 数据绑定结果BindingResult 对象。

SpringMVC文件上传

实现步骤:

(1)创建表单并设置为multipart/form-data

(2)创建controller

SpringMVC会将上传文件绑定到MultipartFile对象。MultipartFile提供了获取上传文件内容、文件名等方法。

MultipartFile常用方法如下:

byte[] getBytes():获取文件数据
String getContentType():获取文件MIME类型,如image/jpeg
InputStream getInputStream():获取文件流
String getName(): 获取表单中文件组件的名称
String getOriginalFilename():获取上传文件的原名
long getSize(): 获取文件的字节大小,单位为byte
boolean isEmpty(): 是否有上传的文件
void transferTo(File file):将上传文件保存到一个目标文件中

(3)在SpringMVC配置文件中增加文件上传功能(配置MultipartResolver)

CommonsMultipartResolver必须依赖于Apach FileUpload组件,需要引入JAR包

SpringMVC文件下载

实现步骤:

(1)在页面中加入下载超链接,链接地址指向controller方法

(2)编写controller处理方法,用于文件下载

使用Apache FileUpload组件FileUtils读取要下载的文件,并将其构建成ResponseEntity对象返回。ResponseEntity对象可以方便的定义返回的BodyBuilder、HttpHeaders、HttpStatus。

BodyBuilder对象用来构建返回的Body

HttpHeaders代表Http协议头信息

HttpStatus代表Http协议的状态

SpringMVC拦截器

Interceptor拦截器的主要作用是拦截用户的请求并进行相应的处理(比如通过拦截器来进行用户权限验证,或者用来判断用户是否已经登录等)

1.HandlerInterceptor接口

定义拦截器类需要实现HandlerInterceptor接口或继承抽象类HandlerInterceptorAdapter

接口中的方法如下:

//该方法在请求处理之前被调用,可以做前置的初始化操作或者是对当前请求的一个预处理,也可以判断来请求是否要继续进行下去。当返回值为false,表示请求结束,后续的Interceptor和Controller不会再执行;当返回值为true泽会继续执行
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
//该方法在controller方法被执行,在视图返回渲染前被调用。可以在这个方法中对处理后的ModelAndView进行操作
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv)
//该方法将在整个请求结束后执行,作用是进行资源清理
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception)

实现步骤:

(1)定义拦截器类,实现接口和接口中的方法

(2)在配置文件中配置拦截器(springmvc-config.xml)

<!-- 拦截器定义 -->
<mvc:interceptors>
    <mvc:interceptor>
        <!-- 拦截所有请求 -->
        <mvc:mapping path="/*"/>
        <!-- 使用Bean定义一个Interceptor -->
        <bean class="org.fkit.interceptor.AuthorizationInterceptor"/>
    </mvc:interceptor>    
</mvc:interceptors>

相关推荐

如何基于Spring Security框架实现权限管理

SpringSecurity是一个功能强大且高度可定制的身份验证和访问控制框架,用于保护基于Spring的应用程序。SpringSecurity主要是从两个方面解决安全性问题:web请求级别:使...

一个轻量级 Java 权限认证框架,Sa-Token 让鉴权变得简单、优雅!

一、框架介绍Sa-Token是一个轻量级Java权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权等一系列权限相关问题。官网文档:...

16.3K Star!简洁高效的Java权限认证与会话管理框架——Sa-Token

简介今天给大家推荐一个轻量级的Java权限认证框架——Sa-Token。它可以为JavaWeb应用同完整的权限认证解决方案,它的目标是简化权限管理和登录认证的流程,具备高度灵活性和简单易用的特点。S...

从Shiro迁移到Sa-Token:老版JeecgBoot项目权限框架平滑升级方案

背景介绍对于许多维护老版JeecgBoot项目的开发者来说,权限框架的升级一直是个棘手问题。这篇文章分享一种实用的方案,用于将老版JeecgBoot中的ApacheShiro替换为更现代的Sa-To...

刑法框架体系,对照着框架体系学习可以事半功倍哦

有了它,妈妈再也不用担心我司考过不啦!有了它,妈妈再也不用担心我司考过不了啦!其他部门法正在陆续整理制作中哦看不清的话请戳http://mp.weixin.qq.com/s?__biz=MzA3NDE...

全新体验版Windows QQ上线,实现三端统一

7月3日,全新体验版WindowsQQ正式上线官网,面向用户开放官方下载渠道。记者从腾讯获悉,继QQ对macOS、Linux版本进行升级后,本次Windows版本的更新,标志QQ基于NT技术架构...

农村自建房造价多少?包工头教你怎么算

通常我们在找专业人士设计农村自建房设计图时,不管你是打算建独栋一层别墅还是独栋二层别墅或是独栋三层别墅,你是否也找他们打听过相应的房屋工程造价呢?下面简单介绍一下农村自建房的傻瓜式造价估算:1、砖混结...

QQ大会员品牌运营策划与设计(qq大会员有哪些个性装扮)

编辑导语:在互联网产品越来越同质化的今天,做出有差异性和符合品牌调性的设计是品牌运营过程中需要重视的问题。本文作者从QQ大会员品牌项目实践出发,分享了品牌运营设计过程中遇到的一些问题以及具体操作方案,...

支持鸿蒙平台,腾讯视频ovCompose跨平台框架发布

IT之家6月3日消息,腾讯开源今日官宣发布腾讯视频ovCompose跨平台框架,其是腾讯大前端领域Oteam中,腾讯视频团队基于ComposeMultiplatform生态推出的...

腾讯 QQ Mac 版推倒重做,全新 1.0 版本开启内测

IT之家9月1日消息,据多位IT之家小伙伴投稿,腾讯QQMac版近日迎来了全新通用版内测,版本号重新由1.0开始,目前放出的体验版为1.0.4-305。从下图可以看到,该版本在U...

全新体验版Windows QQ正式上线官网,实现三端统一

7月3日,全新体验版WindowsQQ正式上线官网,面向用户开放官方下载渠道。记者从腾讯获悉,继QQ对macOS、Linux版本进行升级后,本次Windows版本的更新,标志QQ基于NT技术架构...

QQ,到了不能不变的境地(怎么发qq邮件到别人邮箱)

相比微信一个小更新,乃至一个小动作,都能上热搜的顶级热度。隔壁的老大哥QQ,显得有些冷清。即使更新再快,功能再激情,都很难引起用户们的集体讨论。机友们细想一番,咱们的老朋友QQ,有多久没上过热搜啦?真...

基于Electron框架全面重做:全新Linux版QQ开启公测

来源:快科技不久前,腾讯QQ项目组曾发布预告,宣布QQforLinux新版本即将开启公测。现在,新的Linux版QQ已经开启公测,不过目前仅支持x86架构,arm64架构还仍在适配中。与此前极为简...

QQ全面升级?基于Electron技术的Windows内测版本预计将于明年推出

在2022年,作为经典的聊天软件的QQ在经历多次的功能调整后,正式选择基于新技术开发新版本的QQ。今日,据相关媒体报道,腾讯QQ项目组发布预告:QQforLinux将在本周迎来公测,全新的QQf...

跨平台三端重构正式统一,QQ Windows全新体验版上架官网

7月3日,全新体验版WindowsQQ正式上线官网,面向用户开放官方下载渠道。继QQ对macOS、Linux版本进行升级后,本次Windows版本的更新,标志QQ基于NT技术架构,实现了桌面端Q...

取消回复欢迎 发表评论: