主要使用基于 JavaConfig 方式配置

配置 DispatcherServlet

通过继承抽象类AbstractAnnotationConfigDispatcherServletInitializer来自动配置 DispatcherServlet 和 Spring 应用上下文(不需在 xml 中配置)

public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
​
// 指定 Spring 应用上下文配置类(主要配置 web 组件的 Bean)
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
} // 相对应的另一个应用上下文配置类(应用中的其他 Bean)
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
​
// 将 DispatcherServlet 映射到 "/"
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}

其中 WebConfig 主要配置 web 组件相关的 Bean,如控制器、视图解析器以及处理映射器等,内容大致如下

@Configuration // 标志这个类为配置类
@EnableWebMvc // 启用注解驱动的 Spring MVC,同xml配置方式的<mvc:annotation-driven>
@ComponentScan("spitter.web") // 扫描这个包中的 Bean 组件
public class WebConfig extends WebMvcConfigurerAdapter{
​
/**
* 配置视图解析器
*/
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
​
/**
* 配置静态资源的处理
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
} // 其他 web 相关 Bean 等...
}

RootConfig 配置除 web 组件外的其他 Bean,内容大致如下

@Configuration
// 配置扫描的包,以及过滤条件
@ComponentScan(basePackages = {"spitter"}, excludeFilters = {
@Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
public class RootConfig {
// Bean 等
}

WebConfig 与 RootConfig 配置内容的区别具体可参考如下的 Spring 文档中的图片

不过这个不是强制要分开的,我们也可以把它们配置在一个文件中

添加 Controller 等

可以在相应位置添加对应 Controller 、jsp 文件等

列一个简单的 Controller

@Controller
@RequestMapping("/")
public class HomeController {
@RequestMapping(method = RequestMethod.GET)
public String home() {
return "home";
}
}

文件结构

文件整体结构如下:

上面的内容就是一个简单的基于 SpringMVC 的应用,下面来说一下 SpringMVC 的其他功能

数据校验

  1. 添加实现 Java Validation API 的 jar 包,如 Hibernate Validator

  2. 在实体类中对应字段使用相应的注解,如 @NotNull、@Size、@Max、@Min 等

在控制器中的使用

@RequestMapping(value="/", method=RequestMethod.GET)
public String processRegistration(@Valid Spitter spitter, Errors errors) {
if (errors.hasErrors()) {
return "errorpage"; // 校验错误,进入错误页面
}
// 执行业务操作
return "successpage";
}

文件上传

如要进行文件上传,需配置 multipart 解析器,可以选择如下其中的一种配置

  • CommonsMultipartResolver : 使用 Jakarta Commons FileUpload 解析 multipart 请求

  • StandardServletMultipartResolver : 依赖于 Servlet 3.0 对 multipart 请求的支持

@Bean
public MultipartResolver multipartResolver() throws IOException {
// 使用 CommonsMultipartResolver 解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setUploadTempDir(new FileSystemResource("aa/bb")); // 文件临时保存目录
multipartResolver.setMaxUploadSize(2048000); // 上传文件的大小上限
multipartResolver.setMaxInMemorySize(0); // 当文件达到这个设置大小时,将写入到临时文件路径中
return multipartResolver; // 使用 StandardServletMultipartResolver 解析器
return new StandardServletMultipartResolver();
}

如果选择使用 StandardServletMultipartResolver 解析器,则其中的配置需要在 Servlet 中进行,在这个记录中,就是在之前配置的 SpittrWebAppInitializer 类中添加如下内容(重写 customizeRegistration 方法):

public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
​
// 省略内容见上面的对应文件 @Override
protected void customizeRegistration(Dynamic registration) {
registration.setMultipartConfig(new MultipartConfigElement("/tmp/spittr/uploadss", 2048000, 4096000, 0));
}
}

其中 MultipartConfigElement 有四个参数,分别为:

  1. 临时路径的位置

  2. 上传文件的最大容量,以字节为单位(默认无限制)

  3. 整个 multipart 请求的最大容量

  4. ​在上传的过程中,如果文件达到指定大小,将会写入到临时文件路径中(默认值为0)

对应的控制器中,可以使用 MultipartFile 获取文件,进行后续操作

处理异常

将异常映射为状态码: 在异常上面添加注解 @ResponseStatus(value = HttpStatus.NOT_FOUND, reason ="")

编写异常处理方法:

@ExceptionHandler(DuplicateException.class)
public String handleDuplidateException() {
return "error";
}

这个方法将会拦截所在类中的所有异常,进行处理

如果我们想要一个能处理所有控制器方法中异常的功能,则需要使用控制器通知(@ControllerAdvice)

@ControllerAdvice
public class AppWideExceptionHandler {
@ExceptionHandler(DuplicateException.class)
public String handleDuplidateException() {
return "error";
} // ...
}

Spring MVC 笔记--配置基于JavaConfig的更多相关文章

  1. Spring MVC的配置和使用

    Spring MVC的配置和使用 笔记仓库:https://github.com/nnngu/LearningNotes Spring MVC需要的jar包 文章中 Spring MVC 使用的版本是 ...

  2. Spring MVC 事务配置

    Spring MVC事务配置 要了解事务配置的所有方法,请看一下<Spring事务配置的5种方法> 本文介绍两种配置方法: 一.      XML,使用tx标签配置拦截器实现事务 一.   ...

  3. spring mvc+myBatis配置详解

    一.spring mvc Spring框架(框架即:编程注解+xml配置的方式)MVC是Spring框架的一大特征,Spring框架有三大特征(IOC(依赖注入),AOP(面向切面),MVC(建模M- ...

  4. [转]Spring MVC 事务配置

    Spring MVC事务配置 要了解事务配置的所有方法,请看一下<Spring事务配置的5种方法> 本文介绍两种配置方法:  <tx:advice/>就是告诉事务管理器:怎么做 ...

  5. 【Java Web开发学习】Spring MVC 开始配置

    Spring MVC 开始配置 转载:http://www.cnblogs.com/yangchongxing/p/8871370.htm 学习搭建最简单的Spring MVC框架. ======== ...

  6. Spring MVC国际化配置

    Spring MVC国际化配置 前言 项目开发中要考虑支持国际化,框架选用的是Spring MVC框架,那么问题来了Spring MVC如何配置并实现国际化. 实现过程(Maven项目) 对于Spri ...

  7. Spring MVC(配置、入门)

      Spring MVC 框架的模块    什么是Spring的MVC框架? Spring 配备构建Web 应用的全功能MVC框架.Spring可以很便捷地和其他MVC框架集成,如Struts,Spr ...

  8. Maven 工程下 Spring MVC 站点配置 (三) C3P0连接池与@Autowired的应用

    Maven 工程下 Spring MVC 站点配置 (一) Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作 前两篇文章主要是对站点和数据库操作配置进行了演示,如果单 ...

  9. Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作

    详细的Spring MVC框架搭配在这个连接中: Maven 工程下 Spring MVC 站点配置 (一) Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作 这篇主 ...

随机推荐

  1. socket TCP 从0实现音频传输 ALSA 播放

    RTP标准是采用 UDP 发送,有不少现成的开源库,但不在本文讨论的范围内.UDP 用户数据报,不提供流程,安全传输的功能,但速度快,能提供多播,广播,没有序列号 SEQ ,有 MTU 限制,1500 ...

  2. linux中的源码安装

    前两天自己在笔记本上装了CentOs版本的虚拟机,接着要装Python3,是源码安装的挺费劲,个人总结了一些源码安装的经验,今天在这里给大家分享一下. 1. 首先准备环境,安装必要的编译工具gcc g ...

  3. [android]p7-1 fragment学习笔记

    本文源自<android权威编程指南第3版>第7章UI fragment与fragment 第7章主要内容是实现一个记录不良行为的APP(部分实现),有列表,有具体的行为内容显示.第7章主 ...

  4. asyncio在爬虫中的使用

    # -*- coding: utf-8 -*- # 协程基础.py import asyncio import time async def request(url): print("正在请 ...

  5. 从火箭发场景来学习Java多线程并发闭锁对象

    从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; 执行后,size—这种方式来实现.但是在多线程并发的情 ...

  6. 爬虫前奏——初谈Requests库

    什么是Requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库如果你看过上篇文章关于urllib库的使用,你会发现,其 ...

  7. Linux中MySQL二进制安装步骤

    MySQL二进制安装步骤 安装依赖环境 [root@node3 ~]# yum -y install libaio 将mysql-5.7.26-linux-glibc2.12-x86_64.tar.g ...

  8. 分享macOS平台好用的视频分割、合并视频、提取音频、分离音频、音频转码的工具CCVideo

    CCVideo 是一款运行在macOS上可分割视频(可多段分割).合并视频.提取音频.分离音频.音频转码的工具,操作方便,只需简单几步,便可轻松完成. 下载地址

  9. Element没更新了?Element没更新,基于El的扩展库更新

    think-vuele 基于Vue和ElementUI框架进行整合二次开发的一个框架.提供一些elementUI没有的或当时没有的控件.优化了或简化了便于2B软件开发的一些控件 demo:http:/ ...

  10. String类,string类的特点

    1,String类是final修饰的,不能被继承 2,String类的底层使用数组存储 JDK1.9之前:char[]value JDK1.9之后:byte[]value 3,String类的对象不可 ...