58. Spring Boot国际化(i18n)【从零开始学Spring Boot】
国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式。它要求从产品中抽离所有地域语言,国家/地区和文化相关的元素。换言之,应用程序的功能和代码设计考虑在不同地区运行的需要,其代码简化了不同本地版本的生产。开发这样的程序的过程,就称为国际化。
那么当我们使用Spring Boot如何进行国际化呢?那么当你读完这篇文章你会学到如下知识:
(1) spring boot 加入thymeleaf;
(2) 页面元素国际化;
(3) spring boot默认国际化原理说明;
(4) firefox浏览器修改区域语言;
(5)chrome浏览器修改区域语言;
(6)修改默认messages配置前缀;
(7) 代码中如何获取国际化信息;
(8) 优化代码获取国际化信息;
(9) 区域解析器之AcceptHeaderLocaleResolver;
(10) 会话区域解析器之SessionLocaleResolver;
(11) Cookie区域解析器之CookieLocaleResolver;
(12)固定的区域解析器之FixedLocaleResolver ;
(13)使用参数修改用户的区域;
接下里我们看看这些具体应该怎么操作。
(1) spring boot 加入thymeleaf;
Spring boot集成thymeleaf在
()使用模板(thymeleaf-freemarker)【从零开始学Spring Boot】
这篇文章有介绍过,所以这里就不过多进行介绍了。在这里我们为之后的讲解做点基本准备。
模板文件resources/templates/hello.html :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>hello spring boot</title>
</head>
<body>
<p>欢迎你登录到阿里巴巴网站</p>
</body>
</html>
这里没有特殊的代码,访问就是显示一些文字,这里还没加入国际化的相关东西,之后添加。
编写访问地址:com.kfit.controller.HelloController:
package com.kfit.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "/hello";
}
}
这里就是访问http://127.0.0.1:8080/hello就跳转到hell.html进行访问。
到这里准备工作就好了。
(2) 页面元素国际化;
我们观察hello.html里面的信息直接就是中文显示,所以我们现在的需求是当访问语言是zh的时候显示为中文,当语言为en的时候显示为英文,那么怎么操作呢?
首先我们先定义国际化资源文件,spring boot默认就支持国际化的,而且不需要你过多的做什么配置,只需要在resources/下定义国际化配置文件即可,注意名称必须以messages开发。
我们定义如下几个文件:
messages.properties (默认,当找不到语言的配置的时候,使用该文件进行展示)。
messages_zh_CN.properties(中文)
messages_en_US.properties(英文)
具体的代码如下:
messages.properties:
welcome = 欢迎你登录到 阿里巴巴 网站(default)
messages_zh_CN.properties:
welcome = \u6b22\u8fce\u4f60\u767b\u5f55\u5230 \u963f\u91cc\u5df4\u5df4 \u7f51\u7ad9\uff08\u4e2d\u6587\uff09
对应的信息是:
welcome = 欢迎你登录到 阿里巴巴 网站(中文)
messages_en_US.properties:
welcome = welcome to login to alibaba website(English)
配置信息就这么简单,那么在前端展示怎么修改呢,修改hello.html文件,使用#{key}的方式进行使用messages中的字段信息:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>hello spring boot</title>
</head>
<body>
<p><label th:text="#{welcome}"></label></p>
</body>
</html>
重新访问:http://127.0.0.1:8080/hello 应该显示:
欢迎你登录到 阿里巴巴 网站(中文)
(3) spring boot默认国际化原理说明
在这里我们先打住下,简单说下原理:
第一个问题,为什么命名必须是messages开头,需要看一个源码文件:
org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration:
这里提取部分代码:
/**
* {@link EnableAutoConfiguration Auto-configuration} for {@link MessageSource}.
*
* @author Dave Syer
* @author Phillip Webb
* @author Eddú Meléndez
*/
@Configuration
@ConditionalOnMissingBean(value = MessageSource.class, search = SearchStrategy.CURRENT)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@Conditional(ResourceBundleCondition.class)
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "spring.messages")
public class MessageSourceAutoConfiguration {
private static final Resource[] NO_RESOURCES = {};
/**
* Comma-separated list of basenames, each following the ResourceBundle convention.
* Essentially a fully-qualified classpath location. If it doesn't contain a package
* qualifier (such as "org.mypackage"), it will be resolved from the classpath root.
*/
private String basename = "messages";
/**
* Message bundles encoding.
*/
private Charset encoding = Charset.forName("UTF-8");
/**
* Loaded resource bundle files cache expiration, in seconds. When set to -1, bundles
* are cached forever.
*/
private int cacheSeconds = -1;
/**
* Set whether to fall back to the system Locale if no files for a specific Locale
* have been found. if this is turned off, the only fallback will be the default file
* (e.g. "messages.properties" for basename "messages").
*/
private boolean fallbackToSystemLocale = true;
看到没有,如果我们没有在application.properties中配置spring.messages属性,那么使用默认的messages,好了这个问题就这么简单解决了。
第二问题:为什么我看到的是中文(或者英文)呢?
为了让web应用程序支持国际化,必须识别每个用户的首选区域,并根据这个区域显示内容。在Spring MVC应用程序中,用户的区域是通过区域解析器来识别的,它必须是实现LocaleResolver接口。Spring MVC提供了几个LocaleResolver实现,让你可以按照不同的条件来解析区域。除此之外,你还可以实现这个接口创建自己的区域解析器。如果没有做特殊的处理的话,Spring 采用的默认区域解析器是AcceptHeaderLocaleResolver。它通过检验HTTP请求的头部信息accept-language来解析区域。这个头部是由用户的wb浏览器底层根据底层操作系统的区域设置进行设定的。请注意,这个区域解析器无法改变用户的区域,因为它无法修改用户操作系统的区域设置。
既然无法修改,那么我们的代码怎么测试呢?请看如下内容?
(4) firefox浏览器修改区域语言;
打开firefox浏览器访问http://127.0.0.1:8080/hello (计算机系统语言是中文的),应该是看到如下信息:
欢迎你登录到 阿里巴巴 网站(中文)
那么我们修改我们的语言呢,在浏览器地址栏输入如下信息:
about:config
回车进入一个警告页面,然后点击按钮【我保证会小心】(注:由于版本不一样,可能会有些不一样,但是操作是一样的)。
<!--[endif]-->
在搜索框输入accept,然后找到intl.accept_languages修改对应的值,我这里原本是:
zh-cn, zh, en-us, en
为了看到效果,修改为:
en-us, en
修改完之后,刷新http://127.0.0.1:8080/hello ,可以看到信息:
welcome to login to alibaba website(English)
好了,没有什么特殊的需求的,记得把intl.accept_languages修改为原来的值。
(5)chrome浏览器修改区域语言;
我觉得firefox修改起来真是简单,chrome浏览器就稍微麻烦点了。
第一种方案就是下载插件:Quick Language Switcher,下载完插件之后,默认选项的比较少,你可以在扩展程序中,打开别的语言选项或者添加自定义的语言。这个只要插件下来来操作就很简单了,切换语言就会自动刷新页面,就能看到效果了,特别方便。注意的是:默认有一个English,这个使用的配置文件是:messages_en.properties,所以需要添加一个配置文件才能看到效果。
第二种方案是修改本地的一个配置文件,参考如下地址
但是我这里不管怎么修改,重启浏览器之后,就被重置回来了,也就是这种方案我这里没有配置成功。第一种方案肯定是可以的。
别的浏览器就自行尝试了,因为这不是我们这不是我们实际使用的重点,那么接下来才是重点哦。
(6)修改默认messages配置前缀;
我们在上面说了,默认的文件名称前缀是messages_xx.properties,那么如何修改这个名称和路径呢?
这个也很简单,只需要修改application.properties文件即可加入如下配置:
########################################################
### i18n setting.
########################################################
#指定message的basename,多个以逗号分隔,如果不加包名的话,默认从classpath路径开始,默认: messages
spring.messages.basename=i18n/messages
#设定加载的资源文件缓存失效时间,-1的话为永不过期,默认为-1
spring.messages.cache-seconds= 3600
#设定Message bundles的编码,默认: UTF-8
#spring.messages.encoding=UTF-8
上面各个参数都注释很清楚了,这里不多说了,那么我们这里是把文件放到了i18n下,那么我们在resources下新建目录i18n,然后复制我们创建的messages_xxx.properties文件到此目录下。为了区分这是读取了新的文件,我们可以在每个文件中—i18n以进行区分。
重新访问http://127.0.0.1:8080/hello 可以看到最新的效果了。
英文:
welcome to login to alibaba website(English-en)--i18n
中文:
欢迎你登录到阿里巴巴网站(中文)--i18n
(7) 代码中如何获取国际化信息;
以上讲的是在模板文件进行国际化,那么在代码中如何获取到welcome呢,这个比较简单,只要在需要的地方注入类:
@Autowired
private MessageSource messageSource;
需要注意的是messageSource是
org.springframework.context.MessageSource
下的类。
那么怎么使用了,在使用前我们需要先知道一个知识点,如何得到当前请求的Locale
那么怎么获取呢,有两种获取方式:
第一种方式是:
Locale locale = LocaleContextHolder.getLocale();
第二种方式是:
Locale locale1= RequestContextUtils.getLocale(request);
个人喜好第一种方式,因为不需要什么参数就可以获取到,第二种方式依赖于当前的request请求对象。
有了当前请求的Locale剩下的就简单了:
String msg = messageSource.getMessage("welcome", null,locale);
String msg2= messageSource.getMessage("welcome", null,locale1);
通过以上代码的其中一种方式就可以获取到messages_xxx.properties文件配置的welcome属性值了。切换区域获取的信息也是不一样的,打印信息如下:
msg=欢迎你登录到阿里巴巴网站(中文)--i18n
msg2欢迎你登录到阿里巴巴网站(中文)--i18n
msg=welcome to login to alibaba website(English-en)--i18n
msg2welcome to login to alibaba website(English-en)--i18n
(8) 优化代码获取国际化信息;
学习是永无止境的,活到老学到老。查看上面的代码你会发现这个是实际中使用起来的时候还是不是很方面,ok,没有关系,这个小节我们就对上面的代码优化下,
自定义我们自己的MessageSource,具体代码如下:
package com.kfit.common;
import java.util.Locale;
import javax.annotation.Resource;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Component;
@Component
public class LocaleMessageSourceService {
@Resource
private MessageSource messageSource;
/**
* @param code :对应messages配置的key.
* @return
*/
public String getMessage(String code){
return getMessage(code,null);
}
/**
*
* @param code :对应messages配置的key.
* @param args : 数组参数.
* @return
*/
public String getMessage(String code,Object[] args){
return getMessage(code, args,"");
}
/**
*
* @param code :对应messages配置的key.
* @param args : 数组参数.
* @param defaultMessage : 没有设置key的时候的默认值.
* @return
*/
public String getMessage(String code,Object[] args,String defaultMessage){
//这里使用比较方便的方法,不依赖request.
Locale locale = LocaleContextHolder.getLocale();
return messageSource.getMessage(code, args, defaultMessage, locale);
}
}
在这个代码中我封装了3个常用的方法,那么应该怎么调用呢?也很简单,在需要的地方使用如下代码进行注入:
@Resource
private LocaleMessageSourceService localeMessageSourceService;
在需要的地方使用如下代码进行调用:
String msg3 = localeMessageSourceService.getMessage("welcome");
这个代码比之前的代码使用起来爽多了,还有很多神妙之处,大家自己发现吧。
(9) 区域解析器之AcceptHeaderLocaleResolver;
看到上面,大家会认为国际化也就到此了,但是我告诉大家这之后才是spring的强大之处呢,考虑的多么周到呢。
我们在之前说过,我们只所以可以看到国际化的效果是因为有一个区域解析器在进行处理。默认的区域解析器就是AcceptHeaderLocaleResolver。我们简单说明这个解析器:
Spring采用的默认区域解析器是AcceptHeaderLocaleResolver。它通过检验HTTP请求的accept-language头部来解析区域。这个头部是由用户的web浏览器根据底层操作系统的区域设置进行设定。请注意,这个区域解析器无法改变用户的区域,因为它无法修改用户操作系统的区域设置。
好了,这个默认的介绍到这里,因为这个我们无法改变,所以这种默认的设置在实际中使用的比较少。所以你如果看到当前还无法满足的需求的话,那么接着往下看,博主已经帮你都想到了。
(10) 会话区域解析器之SessionLocaleResolver;
会话区域解析器也就是说,你设置完只针对当前的会话有效,session失效,还原为默认状态。那么这个具体怎么操作呢?具体操作起来也是很简单的,我们需要在我们的启动类App.java(按你的实际情况进行修改)配置区域解析器为SessionLocaleResolver,具体代码如下:
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
//设置默认区域,
slr.setDefaultLocale(Locale.CHINA);
return slr;
}
其实到这里我们就完事了,你可以通过setDefaultLocale()设置默认的语言,启动就访问http://127.0.0.1:8080/hello 进行查看,是不是已经实现国际化了。
到这里当然还不是很完美,还需要在进一步的优化了,那么怎么在页面中进行切换呢?那么假设页面上有两个按钮【切换为中文】、【切换为英文】就可以进行切换了。接下来一起来实现下:在hello.html添加如下代码:
<form action="/changeSessionLanauage" method="get">
<input name="lang" type="hidden" value="zh" />
<button>切换为中文</button>
</form>
<form action="/changeSessionLanauage" method="get">
<input name="lang" type="hidden" value="en" />
<button>切换为英文</button>
</form>
这里就是两个表单,切换语言,那么/changeSessionLanauage怎么编写呢,看如下代码:
@RequestMapping("/changeSessionLanauage")
public String changeSessionLanauage(HttpServletRequest request,String lang){
System.out.println(lang);
if("zh".equals(lang)){
//代码中即可通过以下方法进行语言设置
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("zh", "CN"));
}elseif("en".equals(lang)){
//代码中即可通过以下方法进行语言设置
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("en", "US"));
}
return "redirect:/hello";
}
这部分代码最核心的部分就是如何设置会话的区域,也就是如下代码:
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, new Locale("en", "US"));
这个代码就可以把当前会话的区域进行切换了,是不是很简单。以上代码你会发现只针对会话的设置,我们在这里在优化下,针对下面讲的Cookie也会作用到,这样这个代码就很智能了,代码修改为如下:
@RequestMapping("/changeSessionLanauage")
public String changeSessionLanauage(HttpServletRequest request,HttpServletResponse response,String lang){
System.out.println(lang);
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
if("zh".equals(lang)){
localeResolver.setLocale(request, response, new Locale("zh", "CN"));
}elseif("en".equals(lang)){
localeResolver.setLocale(request, response, new Locale("en", "US"));
}
return "redirect:/hello";
}
在这里使用:
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
获取当前使用的区域解析器LocaleResolver 调用里面的方法
setLocale 设置即可,这样的代码就是不管是会话还是cookie区域解析器都是一样的代码了。
(11) Cookie区域解析器之CookieLocaleResolver;
Cookie区域解析器也就是说,你设置完针对cookie生效,session失效。那么这个具体怎么操作呢?我们需要在我们的启动类App.java(按你的实际情况进行修改)配置区域解析器为CookieLocaleResolver(SessionLocaleResolver部分请注释掉),具体代码如下:
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver slr = new CookieLocaleResolver();
//设置默认区域,
slr.setDefaultLocale(Locale.CHINA);
slr.setCookieMaxAge(3600);//设置cookie有效期.
returnslr;
}
其实到这里我们就完事了,你可以通过setDefaultLocale()设置默认的语言,启动就访问http://127.0.0.1:8080/hello 进行查看,是不是已经实现国际化了。
到这里当然还不是很完美,还需要在进一步的优化了,那么怎么在页面中进行切换呢?
这里主要是用到了,这个部分我们在(10)中已经进行配置了,所以到这里已近是可以进行使用了,点击页面中的按钮进行体验。
(12)固定的区域解析器之FixedLocaleResolver ;
一直使用固定的Local, 改变Local 是不支持的 。既然无法改变,那么不…好了,还是简单介绍下如何使用吧,还是在App.java进行编码:
/**
* cookie区域解析器;
* @return
*/
@Bean
public LocaleResolver localeResolver() {
FixedLocaleResolver slr = new FixedLocaleResolver ();
//设置默认区域,
slr.setDefaultLocale(Locale.US);
returnslr;
}
好了,这个就这么简单,没有别的知识了。
(13)使用参数修改用户的区域;
除了显式调用LocaleResolver.setLocale()来修改用户的区域之外,还可以将LocaleChangeInterceptor拦截器应用到处理程序映射中,它会发现当前HTTP请求中出现的特殊参数。其中的参数名称可以通过拦截器的paramName属性进行自定义。如果这种参数出现在当前请求中,拦截器就会根据参数值来改变用户的区域。
只需要在App.java中加入:
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
// 设置请求地址的参数,默认为:locale
// lci.setParamName(LocaleChangeInterceptor.DEFAULT_PARAM_NAME);
returnlci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
注意这个是可以和会话区域解析器以及Cookie区域解析器一起使用的,但是不能和FixedLocaleResolver一起使用,否则会抛出异常信息。
好了,国际化就到此为主了,博主也是累了,这部分知识在国内还真没有,博主也是各种收集资料才总结出了这么一篇文章,绝对原创,大家都都点赞评论。
【Spring Boot 系列博客】
54. spring boot日志升级篇—logback【从零开始学Spring Boot】
52. spring boot日志升级篇—log4j多环境不同日志级别的控制【从零开始学Spring Boot】
51. spring boot属性文件之多环境配置【从零开始学Spring Boot】
50. Spring Boot日志升级篇—log4j【从零开始学Spring Boot】
49. spring boot日志升级篇—理论【从零开始学Spring Boot】
48. spring boot单元测试restfull API【从零开始学Spring Boot】
47. Spring Boot发送邮件【从零开始学Spring Boot】
46. Spring Boot中使用AOP统一处理Web请求日志
45. Spring Boot MyBatis连接Mysql数据库【从零开始学Spring Boot】
44. Spring Boot日志记录SLF4J【从零开始学Spring Boot】
43. Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】
42. Spring Boot多数据源【从零开始学Spring Boot】
41. Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】
40. springboot + devtools(热部署)【从零开始学Spring Boot】
39.4 Spring Boot Shiro权限管理【从零开始学Spring Boot】
39.3 Spring Boot Shiro权限管理【从零开始学Spring Boot】
39.2. Spring Boot Shiro权限管理【从零开始学Spring Boot】
39.1 Spring Boot Shiro权限管理【从零开始学Spring Boot】
38 Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】
37 Spring Boot集成EHCache实现缓存机制【从零开始学Spring Boot】
36 Spring Boot Cache理论篇【从零开始学Spring Boot】
35 Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
34Spring Boot的启动器Starter详解【从零开始学Spring Boot】
33 Spring Boot 监控和管理生产环境【从零开始学Spring Boot】
58. Spring Boot国际化(i18n)【从零开始学Spring Boot】的更多相关文章
- 63.JPA/Hibernate/Spring Data概念【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 事情的起源,无意当中在一个群里看到这么一句描述:"有人么?默默的问一句,现在开发用mybatis还是hibernate还是jpa&quo ...
- 47. Spring Boot发送邮件【从零开始学Spring Boot】
(提供源代码) Spring提供了非常好用的JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置.下面通过实例看看如何在Spring Bo ...
- 20. Spring Boot Servlet【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/52069482 Web开发使用 Controller 基本上可以完成大部分需求,但是我们还可 ...
- (20)Spring Boot Servlet【从零开始学Spring Boot】
Web开发使用 Controller 基本上可以完成大部分需求,但是我们还可能会用到 Servlet.Filter.Listener.Interceptor 等等. 当使用Spring-Boot时,嵌 ...
- 17、Spring Boot普通类调用bean【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/52013017 我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个 ...
- 21. Spring Boot过滤器、监听器【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/52069490 上一篇文章已经对定义Servlet 的方法进行了说明,过滤器(Filter) ...
- 81. Spring Boot集成JSP疑问【从零开始学Spring Boot】
[原创文章,转载请注明出处] 针对文章: ()Spring Boot 添加JSP支持[从零开始学Spring Boot] 有网友提了这么一些疑问: 1.Spring Boot使用jsp时,仍旧可以打成 ...
- 78. Spring Boot完美使用FastJson解析JSON数据【从零开始学Spring Boot】
[原创文章,转载请注明出处] 个人使用比较习惯的json框架是fastjson,所以spring boot默认的json使用起来就很陌生了,所以很自然我就想我能不能使用fastjson进行json解析 ...
- 77. Spring Boot Use Thymeleaf 3【从零开始学Spring Boot】
[原创文章,转载请注明出处] Spring Boot默认选择的Thymeleaf是2.0版本的,那么如果我们就想要使用3.0版本或者说指定版本呢,那么怎么操作呢?在这里要说明下 3.0的配置在spri ...
随机推荐
- 解题报告:hdu 1556 Color the ball(区间修改,单点查询)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N ...
- 题解报告:hdu 1257 最少拦截系统(贪心)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是 ...
- time模块,datetime模块
time模块 time模块是包含各方面对时间操作的函数. 尽管这些常常有效但不是所有方法在任意平台中有效. 时间相关的操作,时间有三种表示方式: 时间戳 1970年1月1日 ...
- JAVA高级特性反射和注解
反射: 枚举反射泛型注解.html34.3 KB 反射, 主要是指通过类加载, 动态的访问, 检测和修改类本身状态或行为的一种能力, 并能根据自身行为的状态和结果, 调整或修改应用所描述行为的状态和相 ...
- java.lang.String 字符串操作
1.获取文件名 //获取文件名,即就是去掉文件的后缀 /** * mypic.jpg * 获取文件名 * 1. 先找到"."的位置 * 2. 从第一个字符开始截取到".& ...
- vue1.0生命周期
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 数据分析师入门|Python安装MAC版
最近在学数据分析师入门课,看了大纲,感觉终于不再慌乱踩坑了,开始存档最粗暴版学习笔记,遇到停止的地方按照下文红字直接输入就OK,方便和我一样的小伙伴参考呀,老师讲的很适合我这种初学者,PUSH了很多资 ...
- win7电脑桌面壁纸曝光过高影响图标怎么办?亲测实用解决方法
现在用win7系统的人应该还是挺多的吧,虽然说windows家族已经升级到现在的win11了,相信大多数人家用的电脑系统还是win7吧,今天要讲的是一个壁纸曝光度过高的解决办法,虽然还不清楚为什么,但 ...
- MySQL(MMM架构使用)
本案例要求基于普通版的MySQL服务器改造MMM架构,完成以下任务操作:启动MMM集群架构设置集群中服务器为online状态MySQL-MMM架构部署完成后需要启动,数据库端启动mmm-agent进程 ...
- jquery 微信端 点击物理返回按钮,弹出提示框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...