目录
(1)Interceptor接口 HandlerInterceptor
(1)、创建SpringConfig配置类,代替spring的配置文件
(2)、创建WebConfig配置类,代替SpringMVC的配置文件
一、Spring MVC概述
Spring MVC是Spring框架中的一个重要模块,主要用于实现Web应用的MVC(Model、View、Controller)架构。它将应用的逻辑、数据和界面显示分离,使得代码更易于理解和维护。MVC是一种软件架构的思想,不是框架。
二、核心组件
- DispatcherServlet:这是Spring MVC的核心,负责接收请求并分派给相应的控制器。
- Controller:控制器负责处理请求,并返回模型数据给视图。
- View Resolver :视图解析器负责解析视图,将模型数据渲染到视图中。
- Model:模型包含业务数据和业务逻辑,通过JavaBean实现。
Spring MVC将应用程序分为Controller,Model,View三层,Controller接收用户请求,调用Model生成业务数据,传递给View。
三、基本工作流程
- 用户发送请求至前端控制器DispatcherServlet。
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter处理器适配器。
- HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
- Controller进行业务处理,返回ModelAndView。
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
- ViewReslover解析后返回具体View。
- 根据View进行渲染视图(即将模型数据填充至视图中)。DispatcherServlet响应用户。
四、Spring MVC 知识点
1、SpirngMVC–拦截器
(1)Interceptor接口 HandlerInterceptor
public interface HandlerInterceptor {
//请求预处理,如登入校验
//返回值:true表示继续流程,false直接respnse
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;
//后处理,方法调用之后处理方法
void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception;
//请求完成时处理,如释放资源
void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception;
}
2、注解配置SpringMVC
使用配置类和注解代替SpringMVC配置文件的功能
(1)、创建SpringConfig配置类,代替spring的配置文件
//代替spring的配置文件
@Configuration
public class SpringConfig {
}
(2)、创建WebConfig配置类,代替SpringMVC的配置文件
/*代替SpringMVC的配置文件
扫描组件、视图解析器、默认的servlet. mvc的注解驱动
视图控制器、文件上传解析器、拦截器、异常解析器
*///将类标识为配置类
@Configuration
//扫描组件
@ComponentScan("com.mvc.controller")
public class WebConfig implements WebMvcConfigurer {//使用默认的servlet处理静态资源
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer
configurer) {
configurer.enable();
}@Override
//配置视图解析器
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
}@Bean
//@Bean注解可以将标识的方法的返回值作为bean进行管理,bean的id为方法的方法名
public CommonsMultipartResolver multipartResolver(){
return new CommonsMultipartResolver();
}//配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
FirstInterceptor firstInterceptor = new FirstInterceptor();
registry.addInterceptor(firstInterceptor).addPathPatterns("/**");
}@Override
//配置异常映射
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
SimpleMappingExceptionResolver exceptionResolver = new
SimpleMappingExceptionResolver();
Properties prop = new Properties();
prop.setProperty("java.lang.ArithmeticException", "error");
//设置异常映射
exceptionResolver.setExceptionMappings(prop);
//设置共享异常信息的键
exceptionResolver.setExceptionAttribute("ex");
resolvers.add(exceptionResolver);
}//配置生成模板解析器
@Bean
public ITemplateResolver templateResolver() {
WebApplicationContext webApplicationContext =
ContextLoader.getCurrentWebApplicationContext();
// ServletContextTemplateResolver需要一个ServletContext作为构造参数,可通过
//WebApplicationContext 的方法获得
ServletContextTemplateResolver templateResolver = new
ServletContextTemplateResolver(
webApplicationContext.getServletContext());
templateResolver.setPrefix("/WEB-INF/templates/");
templateResolver.setSuffix(".html");
templateResolver.setCharacterEncoding("UTF-8");
templateResolver.setTemplateMode(TemplateMode.HTML);
return templateResolver;
}//生成模板引擎并为模板引擎注入模板解析器
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver
templateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
return templateEngine;
}//生成视图解析器并未解析器注入模板引擎
@Bean
public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setCharacterEncoding("UTF-8");
viewResolver.setTemplateEngine(templateEngine);
return viewResolver;
}
}
3、Spring MVC常用的注解
- @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。
- @RequestBody:注解实现接收http请求的json数据,将json转换为java对象。
- @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。
- @Conntroller:控制器的注解,表示是表现层,不能用用别的注解代替
4、文件上传和下载
(1)文件上传
文件上传要求form表单的请求方式必须为post,并且添加属性enctype="multipart/form-data" SpringMVC中将上传的文件封装到MultipartFile对象中,通过此对象可以获取文件相关信息
上传步骤:①添加依赖:
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --
>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
②在SpringMVC的配置文件中添加配置:
<!--必须通过文件解析器的解析才能将文件转换为MultipartFile对象-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>
③表单上传
<form th:action="@{/up}" method="post" enctype="multipart/form-data">
头像:<input type="file" name="photo"><br>
<input type="submit" value="上传">
</form>
④控制器方法:
@RequestMapping("/up")
public String testUp(MultipartFile photo, HttpSession session) throws IOException {
//获取上传的文件的文件名
String fileName = photo.getOriginalFilename();
//获取上传的文件的后缀名
String hzName = fileName.substring(fileName.lastIndexOf("."));
//获取uuid
// String uuid = UUID.randomUUID().toString();
//拼接一个新的文件名
// fileName = uuid + hzName;
//获取ServletContext对象
ServletContext servletContext = session.getServletContext();
//获取当前工程下photo目录的真实路径
String photoPath = servletContext.getRealPath("photo");
//创建photoPath所对应的File对象
File file = new File(photoPath);
//判断file所对应目录是否存在
if(!file.exists()){
file.mkdir();
}
String finalPath = photoPath + File.separator + fileName;
//上传文件
photo.transferTo(new File(finalPath));
return "success";
}
(2)文件下载
ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文。使用ResponseEntity实现下载文件的功能
@RequestMapping("/down")
public ResponseEntity<byte[]> testDown(HttpSession session) throws IOException {
//获取ServletContext对象
ServletContext servletContext = session.getServletContext();
//获取服务器中文件的真实路径
String realPath = servletContext.getRealPath("img");
realPath = realPath + File.separator + "吕岩芳.xlsx";
//创建输入流
InputStream is = new FileInputStream(realPath);
//创建字节数组,is.available()获取输入流所对应文件的字节数
byte[] bytes = new byte[is.available()];
//将流读到字节数组中
is.read(bytes);
//创建HttpHeaders对象设置响应头信息
MultiValueMap<String, String> headers = new HttpHeaders();
//设置要下载方式以及下载文件的名字
headers.add("Content-Disposition", "attachment;filename=吕岩芳.xlsx");
//设置响应状态码
HttpStatus statusCode = HttpStatus.OK;
//创建ResponseEntity对象
ResponseEntity<byte[]> responseEntity = new ResponseEntity<>(bytes, headers, statusCode);
//关闭输入流
is.close();
return responseEntity;
}
五、总结
SpringMVC是一款基于Spring框架、servlet、jsp的集成框架,可以应用于快速创建web项目。在学习SpringMVC的过程中,我理解了这个框架的核心思想,即“约定优于配置”。这个思想强调的是,通过合理的约定和默认配置,可以减少开发人员的工作量,提高开发效率。这也体现了SpringMVC的设计理念,即以开发者为中心,提供便捷、高效的开发工具。