1. 添加index.html访问
用了模板引擎thymeleaf
@RequestMapping({"/", "/index.html"})
public String index() {
return "index";
}
@Configuration
public class MyWebMvc extend WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
}
@Bean
public WebMvcConfigurer webMvcConfigurer {
return new WebMvcConfigurer() {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
}
}
}
}
2. 引入资源
引入webjars的jquery、bootstrap等前端组件
引入自定义的资源
<link rel="" th:href="@{/webjars/jquery/3.4.1/jquery.js}" />
<link rel="" th:href="@{/assert/css/mycss.css}" />
3. 国际化
编写国际化配置文件
使用ResourceMessageBundleMessageSource管理国际化资源文件
在页面使用fmt:message取出国际化内容
在springboot中:
-
编写国际化配置文件,抽取国际化内容
-
springboot自动配置好了管理国际化资源的组件:
@Configuration @ConditionalOnMissingBean(value = MessageSource.class, search = SearchStrategy.CURRENT) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) @Conditional(ResourceBundleCondition.class) @EnableConfigurationProperties public class MessageSourceAutoConfiguration { private static final Resource[] NO_RESOURCES = {}; @Bean @ConfigurationProperties(prefix = "spring.messages") public MessageSourceProperties messageSourceProperties() { return new MessageSourceProperties(); } @Bean public MessageSource messageSource(MessageSourceProperties properties) { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); if (StringUtils.hasText(properties.getBasename())) { //设置国际化资源文件的基础名,(去掉语言国家代码_zh_CN) //properties.getBasename() => "messages" //可以用spring.messages.basename 设置配置文件基础名 messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray( StringUtils.trimAllWhitespace(properties.getBasename()))); } if (properties.getEncoding() != null) { messageSource.setDefaultEncoding(properties.getEncoding().name()); } messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale()); Duration cacheDuration = properties.getCacheDuration(); if (cacheDuration != null) { messageSource.setCacheMillis(cacheDuration.toMillis()); } messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat()); messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage()); return messageSource; } ... }
spring.messages.basename=work
测试:修改浏览器语言
原理:
国际化Locale(区域信息对象);LocaleResolver(获取区域信息对象)@Bean @ConditionalOnMissingBean @ConditionalOnProperty(prefix = "spring.mvc", name = "locale") public LocaleResolver localeResolver() { if (this.mvcProperties .getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) { return new FixedLocaleResolver(this.mvcProperties.getLocale()); } //从请求头拿到区域信息Locale进行国际化 AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver(); localeResolver.setDefaultLocale(this.mvcProperties.getLocale()); return localeResolver; }
自定义国际化解析:
点击链接切换public class MyLocalResolver implements LocaleResolver { @Override public Locale resolveLocale(HttpServletRequest request) { //从request拿到标记区域参数,新建Locale对象,返回 String l = request.getParameter("l"); Locale locale = null; if(! StringUtils.isEmpty(l)) { String[] split = l.split("_"); locale = new Locale(split[0], split[1]); } return locale; } @Override public void setLocale(HttpServletRequest httpServletRequest, @Nullable HttpServletResponse httpServletResponse, @Nullable Locale locale) { } }
@Bean public LocaleResolver localeResolver() { return new MyLocalResolver(); }