一:基本介绍

  Spring MVC是一种常用的Java Web框架,它提供了一种基于MVC模式的开发方式,可以方便地实现Web应用程序。在Spring MVC中,WebMvcConfigurer是一种常用的配置方式,可以允许我们自定义Spring MVC的行为,比如添加拦截器、消息转换器等。在本文中,我们将介绍什么是WebMvcConfigurer,以及如何使用它来自定义Spring MVC的配置。可以看到WebMvcConfigurer是一个非常灵活和强大的工具,它可以让我们实现自己的业务需求并提高代码的可读性和可维护性。而且我们在Spring、SpringBoot都可以很简单的使用WebMvcConfigurer,下面主要在SpringBoot中说明配置

1:提示说明

  其实在Spring Boot 1.5版本都是靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等。但是到了SpringBoot 2.0之后,WebMvcConfigurerAdapter被标记为@Deprecated(弃用)。官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport,这两种区别如下:(具体参考官方API:6.0.9
WebMvcConfigurer和WebMvcConfigurationSupport都是Spring MVC中的组件,它们都可以用于配置Spring MVC的一些特性。
具体的区别如下:
①:实现方式不同:

WebMvcConfigurer:
是一个接口,它提供了多个回调方法,可以用于自定义Spring MVC的配置(如消息转换器、拦截器等)。我们在使用时只需要实现
该接口,重写其中的方法即可。
WebMvcConfigurationSupport:
是一个抽象类,它也提供了多个回调方法,用于自定义Spring MVC的配置,但是需要继承该类并重写其中的方法。
②:作用不同:
WebMvcConfigurer:
主要用于添加或修改Spring MVC的配置,如添加拦截器,自定义消息转换器等。
WebMvcConfigurationSupport:
主要用于完全自定义Spring MVC的配置,如果我们需要对Spring MVC的配置进行大量的自定义,可以选择继承该类并重写其中的
方法。但是需要注意的是,继承该类会覆盖Spring MVC的部分默认配置。
因此,当我们只需要对部分配置进行自定义时,应该使用WebMvcConfigurer。
③:继承关系不同

WebMvcConfigurer:
没有继承关系,我们只需要实现该接口即可使用。
WebMvcConfigurationSupport:
是一个抽象类,需要继承后才能使用。
总结:在日常开发中推荐优先使用WebMvcConfigurer的方式,因为简单方便,也没有特别复杂的定制需求;
若我们项目中使用的MVC存在着更加复杂的配置需求推荐WebMvcConfigurationSupport,通过继承此类,我们可以说对官方的MVC代码进行
重写操作,但是因为其配置量较大,实现比较复杂,因此在日常开发中使用WebMvcConfigurationSupport并不常见。

2:MVC配置简要

说MVC配置,其实就是说在WebMvcConfigurer接口提供了很多种自定义配置,需要我们自定义配置,其常用配置如下:
1:addInterceptors(拦截器配置)
这个方法可用于配置拦截器。
2:addCorsMappings(全局跨域处理)
这个方法用来配置跨域访问的规则。
3:addViewControllers(注册视图控制器)
这个方法可以注册一个或多个视图控制器,让我们写的地址可以对应一个资源文件,如html文件
4:addResourceHandlers(配置静态资源处理)
方法可用于配置静态资源处理器。可以在客户端直接访问静态资源信息

3:Spring和SpringBoot配置WebMvcConfigurer区别

Spring中配置WebMvcConfigurer方式:
①:创建一个 Java 类,并实现WebMvcConfigurer接口
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
// 自定义配置代码
}
②:注入到Bean容器里
@Configuration
public class AppConfig {
@Bean
public MyWebMvcConfig myWebMvcConfig() {
return new MyWebMvcConfig();
}
}
SpringBoot中配置WebMvcConfigurer方式:(这种方式简单)
①:创建一个 Java 类,并实现WebMvcConfigurer接口就可以了
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
// 自定义配置代码
}

二:拦截器配置(addInterceptors)

  在SpringBoot中,我们可以使用拦截器来对请求进行统一的预处理或后处理。拦截器可以用于日志记录、权限检查、性能监控、事务控制等方面,是一个非常重要的组件。要在SpringBoot中实现拦截器,则首先要创建一个实现HandlerInterceptor接口的拦截器类。该接口定义了三个方法,分别是preHandle、postHandle和afterCompletion,用于在请求处理前、请求处理后和请求完成后进行处理。

HandlerInterceptor接口方法详解:
①:preHandler
在请求处理之前被调用。该方法在Interceptor类中最先执行,用来进行一些前置初始化操作或是对当前请求做预处理,
也可以进行一些判断来决定请求是否要继续进行下去。该方法的返回值是Boolean类型,当它返回false时,表示请求结束,
后续的Interceptor和Controller都不会再执行;当它返回为true时会继续调用下一个Interceptor的preHandle方法,
如果已经是最后一个Interceptor的时候就会调用当前请求的Controller方法。
②:postHandler
在请求处理完成之后调用。也就是Controller方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用,
所以我们可以在这个方法中对Controller处理之后的ModelAndView对象进行操作。
③:afterCompletion
在整个请求结束后调用。就是对应的Interceptor类的postHandler方法返回true时才执行。就是说该方法将在整个请求结束之后,
也就是在DispatcherServlet渲染了对应的视图之后执行。此方法主要用来进行资源清理。
注:官方其实不建议我们非要把3个方法都重写,我们只要对需要的方法重写接口,就比如大部分项目只需要重写preHandler方法

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* 这里我自定义了一个拦截器的拦截规范,后面需要配置到WebMvcConfigurer
* 我们可以配置多个拦截器,到时候全部配置到WebMvcConfigurer里
* 注:这里我定义的拦截器就当权限权限路径拦截(具体项目里我们可以起一个见名知意的拦截器 如:PermissionInterceptor)
*
* @author Anhui OuYang
* @version 1.0
**/
@Component // 加载Bean容器里
public class MyInterceptor implements HandlerInterceptor { private final Logger log = LoggerFactory.getLogger(this.getClass()); /***
* 在请求处理前进行调用(Controller方法调用之前)
* 可以在这一阶段进行全局权限校验等操作
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
log.info("【preHandle】在请求处理前进行调用,自定义拦截器被执行。。。。");
// 这下面我们可以进行权限校验,校验token操作.....
// .....
//上面的代码执行完,若可以放行本次请求则一定要返回true,这样才会到达Controller
return true;
} /***
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
* 可以在这个阶段来操作 ModelAndView
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
log.info("【postHandle】请求处理之后进行调用,自定义拦截器被执行。。。。");
} /***
* 在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行,主要用于资源清理工作。
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
log.info("【afterCompletion】在整个请求结束之后被调用,自定义拦截器被执行。。。。");
}
}

示例代码 实现拦截器接口(用于配置拦截器)

我们配置完拦截器之后,这时拦截器只是一个未被注册的普通类,这时需要把一个或者多个拦截器注册到WebMvcConfigurer

InterceptorRegistry类方法介绍:
①:addInterceptor

该方法用于向拦截器链中添加一个拦截器。interceptor参数为待添加的拦截器对象,可以是自定义的拦截器类或Spring提供的预置
拦截器。返回值为InterceptorRegistration对象,用于进一步配置该拦截器的属性。
②:addWebRequestInterceptor
该方法用于向WebRequest拦截器链中添加一个拦截器。interceptor参数为待添加的拦截器对象,
可以是自定义的WebRequestInterceptor类或者Spring提供的预置拦截器。
也是返回值为InterceptorRegistration对象,用于进一步配置该拦截器的属性。
③:getInterceptors
用于获取当前已经添加到拦截器链中的所有拦截器,返回值为List<HandlerInterceptor>对象,表示拦截器列表。
InterceptorRegistration类方法介绍:
①:order

该方法用于设置拦截器的执行顺序,即在拦截器链中的位置。order参数为一个整数,值越小表示越先执行。
②:addPathPatterns
该方法用于设置需要拦截的请求路径模式,即满足哪些请求路径时才会触发该拦截器。若"/**"则拦截全部;
传入的参数是一个字符串数组,包含多个Ant风格的路径模式,例如 "/api/**"、"/user/*"等。
③:excludePathPatterns
该方法用于设置不需要拦截的请求路径模式,即满足哪些请求路径时不会触发该拦截器。一般不拦截,如登录或者Swagger等
传入的参数是一个字符串数组,包含多个Ant风格的路径模式,例如 "/api/login"、"/user/login"等。
④:pathMatcher
该方法用于设置该拦截器所使用的PathMatcher实例,从而可以自定义路径匹配逻辑。

@Configuration  // 一定要配置为配置类
@RequiredArgsConstructor
public class WebMvcConfig implements WebMvcConfigurer { // 属性注入(使用构造器注入,通过@RequiredArgsConstructor注解生成必要的构造器)
private final MyInterceptor myInterceptor; /***
* 配置拦截器信息
* @param registry 拦截器注册表
*/
@Override
public void addInterceptors(InterceptorRegistry registry) { // 配置myInterceptor的拦截规范(如拦截的路径等等)
InterceptorRegistration interceptorA = registry.addInterceptor(myInterceptor); // 设置拦截器的配置规则
interceptorA
// 指定拦截器的执行顺序。值越小,越先执行拦截器(但是得整型)。
.order(1)
// 设置需要拦截的路径(这里拦截所有的路径)
.addPathPatterns("/api/**", "/user/*", "/**")
// 设置拦截器的放行资源(代表不拦截)
// 设置登录放行
.excludePathPatterns("/login")
// 设置Swagger访问放行
.excludePathPatterns("/swagger-ui.html/**", "/swagger-ui.html", "/swagger-ui.html#/**")
// 如资源文件放行
.excludePathPatterns("/doc.html", "classpath:/META-INF/resources/");
// 谨慎使用放行"/**",这代表全部放行了,那么拦截器就相当于无效配置
//.excludePathPatterns("/**"); // 若有多个拦截器则在下面需要配置多个(如下面interceptorB,我们需要对这个进行路径拦截的配置)
// InterceptorRegistration interceptorB = registry.addInterceptor(自定义的拦截器对象);
}
}

示例代码 在WebMvcConfigurer类上注册创建的拦截器

  注:拦截的路径或者放行的路径是以Controller开始的,如我们在application.yml配置的地址前缀则不包含

三:跨域配置(addCorsMappings)

  如何是跨域,大家应该都了解,这里我将在WebMvcConfigurer中解决跨域问题,其实跨域的解决方式很多,这里我就简单说明,具体参考:SpringBoot如何解决跨域的三种方式

CorsRegistry类方法介绍:
①:addMapping
该方法用于添加允许跨域访问的路径,String类型,若存在多个路径则需要在CorsRegistry里配置多个
CorsRegistration类方法介绍:
CorsRegistration是CorsRegistry的辅助类,使用它可以对单个跨域请求进行更细粒度的配置。
①:allowedOrigins(低版本使用,但是现在高版本也支持)
设置允许跨域请求的来源URL。该方法接受多个参数,每个参数为一个允许的来源URL。或者设置"*"
②:allowedOriginPatterns(一般使用这种方式)
设置允许跨域请求的来源URL的模式。该方法接受多个参数,每个参数为一个允许的来源URL模式。或者设置"*"
③:allowCredentials
设置是否允许跨域请求携带凭证信息。默认情况下,浏览器不会向跨域请求发送Cookie等凭证信息。
如果希望携带凭证信息,则需要将allowCredentials方法设置为true。
④:allowedMethods
设置允许跨域请求的HTTP方法。该方法接受多个参数,每个参数为一种允许的HTTP请求方式。
⑤:allowedHeaders
设置允许请求携带的HTTP头信息。该方法接受多个参数,每个参数为一种允许的HTTP头信息。(放行哪些请求头部信息)
⑥:exposedHeaders
设置响应头信息,这些信息允许客户端访问。该方法接受多个参数,每个参数为一种允许的响应头信息。(暴露哪些响应头信息)
⑦:combine
将当前CorsRegistration对象与另一个CorsConfiguration对象合并,返回合并后的CorsConfiguration对象。
可以使用该方法将多个CorsRegistration对象的配置合并到同一个CorsConfiguration对象中。
⑧:maxAge
设置响应的缓存时间,单位为秒,默认30分钟。
例如,当设置maxAge为3600时,如果浏览器在一小时内再次向同一个目标URL发送跨域请求,
就可以直接使用以前的预检请求结果,而不需要再次进行预检请求。maxAge属性只影响预检请求的缓存时间,
而不会影响正常的跨域请求,因此不会对实际的业务逻辑产生影响。此外,maxAge属性的具体值需要根据实际情况进行调整,
过小的缓存时间可能会导致频繁的预检请求,过大的缓存时间可能会使跨域请求的控制权得不到及时更新,从而增加安全风险。

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0,
maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>简单跨域测试</title>
</head>
<body>
<button id="bt">简单跨域测试</button>
<script>
function ajaxRequest() {
return new Promise((resolve, reject) => {
let xmlHttp = new XMLHttpRequest();
xmlHttp.open('get', 'http://127.0.0.1:8881/test/demo/getTestA', true);
xmlHttp.send();
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState === 4) {
xmlHttp.status === 200 ? resolve(xmlHttp.responseText) : reject("error")
}
}
}).then(resolve => {
console.log(resolve)
}, reject => {
console.log(reject)
})
}
document.getElementById("bt").onclick = function () {
console.log("点击按钮,发送请求");
ajaxRequest();
}
</script>
</body>
</html>

测试跨域请求发送(直接启动这个html,配置可能跨域的地址即可)

@Configuration  // 一定要配置为配置类
public class WebMvcConfig implements WebMvcConfigurer { /***
* 配置全局跨域处理
* @param registry CORS跨域注册表
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
// 配置全局跨域信息
registry
// 添加映射路径(凡是在addMapping配置的路径则代表可以跨域访问)
.addMapping("/demo/**")
// 设置放行哪些域 SpringBoot2.4.4下低版本使用.allowedOrigins("*")
//.allowedOrigins("*")
.allowedOriginPatterns("*")
// 是否允许跨域请求携带凭证Cookie发送
.allowCredentials(true)
// 放行哪些请求方式,也可以使用.allowedMethods("*")放行全部
.allowedMethods("GET", "POST")
// 放行哪些请求头部信息
.allowedHeaders("*")
// 暴露哪些响应头部信息
.exposedHeaders("*")
// 设置响应的缓存时间
.maxAge(1800);
// 若存在多个跨域则可以设置多个registry;"/**"代表所以都不跨域,相当设置这个,其它都没必要设置了
// registry.addMapping("/**").allowedOriginPatterns("*");
}
}

示例代码 跨域放行代码配置

四:注册页面跳转(addViewControllers)

  addViewControllers方法是SpringMVC中WebMvcConfigurer接口定义的一个方法,用于注册一个简单的视图控制器,以便将请求路径映射到一个具体的视图页面。在一些简单的场景下,我们可能只需要将某个请求路径直接映射到一个固定的视图页面,而不需要进行额外的逻辑处理。此时,可以使用addViewControllers方法来快速注册一个视图控制器,并指定对应的请求路径和视图名称即可。但是我们需要额外注意的是,我们在SpringBoot中处理视图跳转时最好集成Thymeleaf,因为它是SpringBoot指定认可的并且,Thymeleaf与SpringMVC协同工作,可以方便地实现快速开发Web应用程序。

在SpringBoot配置Thymeleaf的一些信息:
导入Thymeleaf坐标:
<!--导入SpringBoot集成Thymeleaf启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
在application.yml配置Thymeleaf配置信息:

spring:
# 配置Thymeleaf模板(默认启动会请求/templates/index.html)
thymeleaf:
cache: false # 是否有模板缓存
prefix: classpath:/templates/ # 模板放置的位置
suffix: .html # 模板后缀
mode: HTML # 模板类型
encoding: UTF-8 # 模板编码

  配置完基本的信息后我们就可以进行资源视图的跳转了,如下一些基本介绍:

ViewControllerRegistry类说明:
①:addViewController(String urlPath)

通过urlPath参数指定的请求URL路径(例如"/home")注册一个简单的视图控制器,
该方法返回一个ViewControllerRegistration对象,通过该对象可以设置相关属性,如视图名称、请求方式等。
如:registry.addViewController("/login");
②:setOrder(int order)
设置当前视图控制器的执行顺序,当有多个视图控制器针对同一请求路径时,可以使用该方法进行优先级排序。
默认情况下,不同的视图控制器按照它们被注册的顺序执行。
③:addRedirectViewController(String urlPath, String redirectUrl)
注册一个重定向视图控制器,将urlPath请求路径重定向到指定的重定向地址redirectUrl。
如:registry.addRedirectViewController("/toBaidu","https://www.baidu.com");
ViewControllerRegistration类说明:
  ①:setViewName(String viewName)
资源路径的前缀
  ②:setStatusCode(HttpStatus statusCode)
配置访问不存在资源的响应码,如下常见的:
HttpStatus.BAD_REQUEST:请求参数错误或格式不正确,例如缺少必需参数、参数类型错误等。
HttpStatus.UNAUTHORIZED:未经授权访问,需要用户登录或提供凭证。
HttpStatus.FORBIDDEN:已经授权但访问被禁止,通常意味着权限不足或需要进行进一步身份验证。
HttpStatus.NOT_FOUND:请求的资源不存在,通常使用自定义的404错误页面进行提示。
HttpStatus.METHOD_NOT_ALLOWED:请求方式不支持,例如GET请求访问只支持POST的接口时会返回405错误。
HttpStatus.INTERNAL_SERVER_ERROR:服务器内部错误,需要在后台进行排查和修复。
示例:registry.addViewController("/**").setStatusCode(HttpStatus.NOT_FOUND);
说明:访问不存在的页面我一律按照404处理,但是我们templates/error/404.html页面需要存在
说明:按照我们之前配置的thymeleaf配置来说,默认根路径为resources/templates,跳转的资源文件都是.html文件

@Configuration  // 一定要配置为配置类
@RequiredArgsConstructor
public class WebMvcConfig implements WebMvcConfigurer { /***
* 注册请求路径转换到资源路径
* @param registry 控制器注册表
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 配置资源路径跳转(登录或退出都跳转到resources/templates/login.html)
registry.addViewController("/toLogin").setViewName("login");
registry.addViewController("/toExit").setViewName("login");
// 配置路径重定向(若访问)
registry.addRedirectViewController("/toSearch","https://www.baidu.com");
// 配置响应码信息
registry.addViewController("/**").setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR);
}
}

示例代码 注册页面跳转配置

五:配置静态资源处理(addResourceHandlers)

  addResourceHandlers方法是SpringMVC框架提供的一种配置静态资源的方式,它可以将指定的资源路径映射到一个或多个URL路径上,并指定资源的缓存策略、版本号以及是否允许目录列表等选项。具体来说,addResourceHandlers方法需要传入一个ResourceHandlerRegistry对象作为参数,然后在这个对象上调用addResourceHandler方法,来添加一个或多个处理器。

ResourceHandlerRegistry类方法介绍:
①:addResourceHandler

该方法用于指定静态资源的URL路径,支持Ant风格的通配符,如“/resources/**”表示匹配所有以“/resources/”开头的请求。
ResourceHandlerRegistration类方法介绍:
①:addResourceLocations

该方法为静态资源所在的物理路径或URL。可以使用多个addResourceLocations方法指定多个路径,如下例:
registry.addResourceHandler("/resources/**")
.addResourceLocations("classpath:/static/", "file:/opt/files/")
说明:
classpath:/static/表示在项目的Classpath下(即src/main/resources文件夹下)查找static文件夹,
file:/opt/files/表示在系统中的/opt/files/目录下查找文件。
②:setCacheControl
此方法用于设置缓存控制头(cache-control header),CacheControl是一个封装了缓存策略的类。例如:
CacheControl cc = CacheControl.maxAge(30, TimeUnit.DAYS).cachePublic();
registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/static/")
.setCacheControl(cc);
说明:这将指示浏览器缓存静态资源30天,并且它们是public缓存,意味着中间代理服务器也可以缓存资源。
③:setCachePeriod
该方法用于设置静态资源缓存时间,参数类型为Duration类型。如:
registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/static/")
.setCachePeriod(Duration.ofMinutes(5));
说明:静态资源缓存的过期时间为5分钟
④:setOptimizeLocations
此方法用于启用或禁用位置优化。如果启用位置优化,则将优化静态资源的位置,以便并发访问静态资源时可以获得更好的性能。
默认情况下,位置优化是禁用的。
⑤:setUseLastModified
此方法用于启用或禁用上次修改时间检查(last-modified check)。如果启用上次修改时间检查,则在每个请求中发送一
个if-modified-since头,以检查是否需要返回新内容。默认情况下,上次修改时间检查是启用的。
⑥:resourceChain
用于开启或关闭ResourceChain模式。当开启ResourceChain模式时,每个资源文件都会自动添加版本号,避免浏览器缓存问题。
例如:registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/static/")
.resourceChain(true);
请注意,要使ResourceChain生效,还需要设置addResolver
如:.resourceChain(false)
// 添加VersionResourceResolver,且指定版本号
.addResolver(new VersionResourceResolver()
.addFixedVersionStrategy("1.0.0", "/**"));
下次访问地址:http://localhost:8881/resources/1.0.0/xxx.css

@Configuration  // 一定要配置为配置类
@RequiredArgsConstructor
public class WebMvcConfig implements WebMvcConfigurer { /***
* 配置静态访问资源(需要注意不要和addViewControllers冲突)
* @param registry 资源处理程序注册表
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
// 指定静态资源的URL路径,当访问myStatic/**和yourStatic/**都会在static目录里找静态资源
.addResourceHandler("/myStatic/**", "/yourStatic/**")
.addResourceLocations("classpath:/static/")
// 于设置缓存控制头(cache-control header)30天过期(30天内请求相同资源则不在发送请求)
.setCacheControl(CacheControl.maxAge(30, TimeUnit.DAYS).cachePublic())
.resourceChain(false)
// 添加 VersionResourceResolver ,且指定版本号
.addResolver(new VersionResourceResolver()
.addFixedVersionStrategy("1.0.0", "/**"));
}
}

示例代码 配置静态资源处理

其实还有许许多多的配置信息,后面会慢慢补充。

SpringBoot之MVC配置(WebMvcConfigurer详解)的更多相关文章

  1. Spring MVC 配置Controller详解

    在SpringMVC中,对于Controller的配置方式有很多种,如下做简单总结 第一种 URL对应Bean如果要使用此类配置方式,需要在XML中做如下样式配置: <!-- 表示将请求的URL ...

  2. SpringBoot中使用UEditor基本配置(图文详解)

    SpringBoot中使用UEditor基本配置(图文详解) 2018年03月12日 10:52:32 BigPotR 阅读数:4497   最近因工作需要,在自己研究百度的富文本编辑器UEditor ...

  3. iOS中MVC等设计模式详解

    iOS中MVC等设计模式详解 在iOS编程,利用设计模式可以大大提高你的开发效率,虽然在编写代码之初你需要花费较大时间把各种业务逻辑封装起来.(事实证明这是值得的!) 模型-视图-控制器(MVC)设计 ...

  4. Java编程配置思路详解

    Java编程配置思路详解 SpringBoot虽然提供了很多优秀的starter帮助我们快速开发,可实际生产环境的特殊性,我们依然需要对默认整合配置做自定义操作,提高程序的可控性,虽然你配的不一定比官 ...

  5. ext.js的mvc开发模式详解

    ext.js的mvc开发模式详解和环境配置 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开 ...

  6. idea spring+springmvc+mybatis环境配置整合详解

    idea spring+springmvc+mybatis环境配置整合详解 1.配置整合前所需准备的环境: 1.1:jdk1.8 1.2:idea2017.1.5 1.3:Maven 3.5.2 2. ...

  7. ASP.NET Core的配置(2):配置模型详解

    在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数据的ConfigurationProvi ...

  8. mha配置参数详解

    mha配置参数详解: 参数名字 是否必须 参数作用域 默认值 示例 hostname Yes Local Only - hostname=mysql_server1, hostname=192.168 ...

  9. Cocos2d-x win7 + vs2010 配置图文详解

    Cocos2d-x win7 + vs2010 配置图文详解 下载最新版的cocos2d-x.打开浏览器,输入cocos2d-x.org,然后选择Download,本教程写作时最新版本为cocos2d ...

  10. Extjs MVC开发模式详解

    Extjs MVC开发模式详解   在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式, ...

随机推荐

  1. 基于Label studio实现UIE信息抽取智能标注方案,提升标注效率!

    基于Label studio实现UIE信息抽取智能标注方案,提升标注效率! 项目链接见文末 人工标注的缺点主要有以下几点: 产能低:人工标注需要大量的人力物力投入,且标注速度慢,产能低,无法满足大规模 ...

  2. [数据库/ORALCE]导入/导出数据

    ORACLE数据导入/导出 工具介绍:EXP/IMP | EXPDP/IMPDP EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序 ...

  3. postgresSQL Extended Query执行过程和sharding-proxy的处理

    pg Extended Query PostgreSQL: Documentation: 15: 55.2. Message Flow 多个阶段,可复用 Parse → DESCRIBE statem ...

  4. 结合ChatGPT和MINDSHOW自动生成PPT

    结合chatGPT和MINDSHOW自动生成PPT应用场景 总结/朱季谦 一.首先,通过chatGPT说明你的需求,学会提问是Ai时代最关键的一步.你需要提供一些关键信息,如果没有关键信息,就按照大纲 ...

  5. python从shp文件中读取经纬度数据

    python从shp文件中读取经纬度数据 没有接触过GIS的人来说shp文件很陌生而且很难打开查看,好在python可以从中提取出自己想要的数据 pyshp库的安装 python的pyshp库可以实现 ...

  6. Rainbond 结合 Jpom 实现云原生 & 本地一体化项目管理

    Jpom 是一个简而轻的低侵入式在线构建.自动部署.日常运维.项目运维监控软件.提供了: 节点管理:集群节点,统一管理多节点的项目,实现快速一键分发项目文件 项目管理:创建.启动.停止.实时查看项目控 ...

  7. 开心档之MySQL 连接

    MySQL 连接 使用mysql二进制方式连接 您可以使用MySQL二进制方式进入到mysql命令提示符下来连接MySQL数据库. 实例 以下是从命令行中连接mysql服务器的简单实例: [root@ ...

  8. SpringCloud Gateway 3.x 响应头添加 Skywalking TraceId

    在微服务架构中,一次请求可能会被多个服务处理,而每个服务又会产生相应的日志,且每个服务也会有多个实例.在这种情况下,如果系统发生异常,没有 Trace ID,那么在进行日志分析和追踪时就会非常困难,因 ...

  9. springCloud项目搭建版本选择

    1.查看spring cloud的版本 https://spring.io/projects/spring-cloud#learn 选择spring boot版本 https://mvnreposit ...

  10. Linux grep命令详细教程

    [本文出自天外归云的博客园] 简介 Linux grep命令是一种非常常用的文本搜索工具,它可以在给定的文件中搜索匹配的字符串,并输出匹配的行.grep是全称"global search r ...