Springmvc的自动解管理

中央转发器(DispatcherServlet

控制器

视图解析器

静态资源访问

消息转换器

格式化

静态资源管理

 

一、中央转发器

Xml无需配置

<servlet>
    <servlet-name>chapter2</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>chapter2</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

中央转发器被springboot自动接管,不再需要我们在web.xml中配置,我们现在的项目也不是web项目,也不存在web.xml,

org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,

 控制器

控制器Controller在springboot的注解扫描范围内自动管理。

视图解析器自动管理

Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.

ContentNegotiatingViewResolver:组合所有的视图解析器的;

 曾经的配置文件无需再配

 

<bean id="de" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/"></property>
    <property name="suffix" value="*.jsp"></property>
</bean>

 源码:

public ContentNegotiatingViewResolver viewResolver(BeanFactory beanFactory) {
ContentNegotiatingViewResolver resolver =
new ContentNegotiatingViewResolver();
resolver.setContentNegotiationManager((ContentNegotiationManager)beanFactory.getBean(ContentNegotiationManager.
class));
resolver.setOrder(-
2147483648);
return resolver;
}

当我们做文件上传的时候我们也会发现multipartResolver是自动被配置好的页面

 

<form action="/upload" method="post" enctype="multipart/form-data">
    <input name="pic" type="file">
    <input type="submit">
</form>

 

Controller

@ResponseBody
@RequestMapping
("/upload")
public String upload(@RequestParam("pic")MultipartFile file, HttpServletRequest request){
String contentType = file.getContentType();
String fileName = file.getOriginalFilename();
/*System.out.println("fileName-->" + fileName);
System.out.println("getContentType-->" + contentType);*/
//String filePath = request.getSession().getServletContext().getRealPath("imgupload/");
String filePath = "D:/imgup/";
try {
this.uploadFile(file.getBytes(), filePath, fileName);
}
catch (Exception e) {
// TODO: handle exception
}

return "success";
}



public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception {
File targetFile =
new File(filePath);
if(!targetFile.exists()){
targetFile.mkdirs();
}
FileOutputStream out =
new FileOutputStream(filePath+fileName);
out.write(file);
out.flush();
out.close();
}

文件上传大小可以通过配置来修改
打开application.properties, 默认限制是10MB,我们可以任意修改

@ResponseBody
@RequestMapping
("/upload")
public String upload(@RequestParam("pic")MultipartFile file, HttpServletRequest request){
String contentType = file.getContentType();
String fileName = file.getOriginalFilename();
/*System.out.println("fileName-->" + fileName);
System.out.println("getContentType-->" + contentType);*/
//String filePath = request.getSession().getServletContext().getRealPath("imgupload/");
String filePath = "D:/imgup/";
try {
this.uploadFile(file.getBytes(), filePath, fileName);
}
catch (Exception e) {
// TODO: handle exception
}

return "success";
}



public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception {
File targetFile =
new File(filePath);
if(!targetFile.exists()){
targetFile.mkdirs();
}
FileOutputStream out =
new FileOutputStream(filePath+fileName);
out.write(file);
out.flush();
out.close();
}

文件上传大小可以通过配置来修改
打开application.properties, 默认限制是10MB,我们可以任意修改

二、消息转换和格式化

 Springboot自动配置了消息转换器

格式化转换器的自动注册 

时间类型我们可以在这里修改 

在配置文件中指定好时间的模式我们就可以输入了 

 三、springboot自动扩展SpringMVC

在实际开发中springboot并非完全自动化,很多跟业务相关我们需要自己扩展,springboot给我提供了接口。

我们可以来通过实现WebMvcConfigurer接口来扩展

public interface WebMvcConfigurer {
default void configurePathMatch(PathMatchConfigurer configurer) {
}

default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
}

default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
}

default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
}

default void addFormatters(FormatterRegistry registry) {
}

default void addInterceptors(InterceptorRegistry registry) {
}

default void addResourceHandlers(ResourceHandlerRegistry registry) {
}

default void addCorsMappings(CorsRegistry registry) {
}

default void addViewControllers(ViewControllerRegistry registry) {
}

default void configureViewResolvers(ViewResolverRegistry registry) {
}

default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
}

default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
}

default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
}

default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
}

default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
}

default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
}

@Nullable
default Validator getValidator() {
return null;
}

@Nullable
default MessageCodesResolver getMessageCodesResolver() {
return null;
}
}

3.1 在容器中注册视图控制器(请求转发) 

创建一个MyMVCCofnig实现WebMvcConfigurer接口,实现一下addViewControllers方法,我们完成通过/tx访问,转发到success.html的工作

@Configuration
public class MyMVCCofnig implements WebMvcConfigurer{
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController(
"/tx").setViewName("success");
}

}

3.2 注册格式化

 用来可以对请求过来的日期格式化的字符串来做定制化。当然通过application.properties配置也可以办到。

@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(
new Formatter<Date>() {
@Override
public String print(Date date, Locale locale) {
return null;
}
@Override
public Date parse(String s, Locale locale) throws ParseException {
return new SimpleDateFormat("yyyy-MM-dd").parse(s);
}
});
}

3.3 消息转换器扩展fastjson

 在pom.xml中引入fastjson

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.47</version>
</dependency>

配置消息转换器,添加fastjson 

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter fc =
new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig =
new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.
PrettyFormat);
fc.setFastJsonConfig(fastJsonConfig);
converters.add(fc);
}

在实体类上可以继续控制 

public class User{private  String username;private  String password;private int age;private int score;private int gender;@JSONField(format = "yyyy-MM-dd")private Date date;

 3.4 拦截器注册

1.创建拦截器

public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.
out.println("前置拦截");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.
out.println("后置拦截");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.
out.println("最终拦截");
}
}

2. 拦截器注册

 

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(
new MyInterceptor())
.addPathPatterns(
"/**")
.excludePathPatterns(
"/hello2");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/2647.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript中this的5大核心规则详解

在 JavaScript 中&#xff0c;this 是一个特殊关键字&#xff0c;其值取决于函数的 调用方式 而非定义位置。它的行为遵循一套明确的规则&#xff0c;以下是核心规则和示例&#xff1a;1. 默认绑定&#xff08;独立函数调用&#xff09; 当函数独立调用时&#xff08;不作为方法…

深度分析Java内存回收机制

内存回收机制是Java区别于C/C等语言的核心特性之一&#xff0c;也是Java开发者理解程序性能、解决内存相关问题&#xff08;如内存泄漏、OOM&#xff09;的关键。 核心目标&#xff1a; 自动回收程序中不再使用的对象所占用的内存&#xff0c;防止内存耗尽&#xff0c;同时尽量…

字节 AI 编辑器 Trae 2.0 SOLO 出道! 国际版不充分指南及与国内版的对比

最近 Trae 2.0 上线&#xff0c;带来了强势的 SOLO&#xff0c;一个能自主执行开发任务的超级个体&#xff0c;集成编辑器、终端、浏览器等多工具视图于一体&#xff0c;打通从构思到落地的完整链路。 不过国内版需要预约&#xff08;饥饿营销&#xff1f;&#xff09;&#x…

二分查找----3.在排序数组中查找元素的第一个和最后一个位置

题目链接 /** 在一个近似递增的数组中查找指定元素,该元素可能有多个找出其出现的区间 单次普通二分只能查到一个元素且无法确定边界;对二分改进即可 左边界:当查到目标元素时,记录下标并将right迭代为mid-1,继续向左二分直到搜寻结束,得到左边界 右边界:当查到目标元素时,记录…

修改 Lucide-React 图标样式的方法

修改 Lucide-React 图标样式的方法 使用 lucide-react 时&#xff0c;你可以通过多种方式修改图标的样式。以下是几种常用的方法&#xff1a; 1. 通过 className 属性 import { Home } from lucide-react;function MyComponent() {return <Home className"text-blue-50…

新手向:Idea的使用技巧

为什么选择IntelliJ IDEA作为Java开发工具&#xff1f; IntelliJ IDEA被誉为Java开发者的"智能助手"&#xff0c;它就像手机里的Siri或小爱同学一样&#xff0c;能够智能地辅助开发者完成各种编程任务。 具体来说&#xff0c;IDEA具有以下突出优势&#xff1a; 智…

自动化运维:从脚本到DevOps的演进

自动化通常从编写脚本开始&#xff0c;这些脚本可以自动执行常规任务&#xff0c;如备份数据、更新软件或监控系统性能。例如&#xff0c;一个简单的Bash脚本可以定期检查磁盘空间并清理临时文件&#xff1a;#!/bin/bash # Disk Cleanup Script threshold80 # Set threshold…

Python机器学习:从零基础到项目实战

目录第一部分&#xff1a;思想与基石——万法归宗&#xff0c;筑基问道第1章&#xff1a;初探智慧之境——机器学习世界观1.1 何为学习&#xff1f;从人类学习到机器智能1.2 机器学习的“前世今生”&#xff1a;一部思想与技术的演进史1.3 为何是Python&#xff1f;——数据科学…

【kubernetes】-2 K8S的资源管理

文章目录K8S的资源管理1、资源管理方式简介1.1 陈述式管理资源的方法1.2 kubernetes 集群资源管理入口2、kubectl 常用命令2.1 集群操作2.2 资源操作2.3 项目生命周期管理2.3.1 创建2.3.2 发布2.3.3 更新2.3.4 回滚2.3.5删除3、图解服务发布阶段 1&#xff1a;外部客户端 → 节…

AWS PrivateLink方式访问Redis

问题 现在有两个不同的aws云账号&#xff0c;而且&#xff0c;这两个不同云账号&#xff0c;其中一个拥有Redis服务&#xff08;elasticache&#xff09;。现在需要通过另外一个账号的vpc内网访问另外一个账号的内网的redis服务。 解决 AWS PrivateLink方式。这样就可以通过…

数据库—修改某字段默认值

前言有时候&#xff0c;数据库的字段默认值没有正确设置&#xff0c;这时候需要改默认值。以下是我做的改默认值的记录&#xff0c;希望对网友有所帮助。1.SQL SERVER下面的示例假设你要修改名为 YourColumnName 的字段&#xff0c;并为其设置一个新的默认值 NewDefaultValue。…

Go语言切片(Slice)与数组(Array)深度解析:避坑指南与最佳实践

在Go语言中&#xff0c;切片(slice)和数组(array)是两种基础但常被混淆的数据结构。本文将深入剖析它们的核心区别&#xff0c;揭示常见陷阱&#xff0c;并提供实战解决方案。一、本质区别&#xff1a;固定大小 vs 动态容器 数组(Array)&#xff1a;固定长度的连续内存块 // 声…