国际化
- 文件配置
spring.messages.basename=i18m.test
classpath
:默认指定文件路径为classpath
i18n
:指定文件夹test
:国际化配置文件组
- 文件名称
配置名
:test即为配置名国标名
:语言
+国家
,例如en_US
后缀名
:同一properties
同名配置文件,允许有省略国标的默认配置文件,这将作为默认配置采用。
当检测到需要转化时自动采用配置的特化配置。
因此,默认配置必须存在,特化配置可以不必。
当找不到该采取的特化文件时,同一采用默认配置
- 文件内容
# test.properties
test.language=中文
# test_en_US.properties
test.language=English
# test_zh_CN.properties
test.language=中文
properties
配置为key
–value
,同名配置文件中的key
需要同一- 特化文件可以不配某些
key
,会自动采取默认配置中的值 - 配置
key
应该全部能够在默认配置中找到,一般不要再特化文件中有独有配置 - 配置名最好按照
配置名
+属性
的方式进行配置,充当命名空间,调用方便且易于管理
- 内容引用
- #{}取国际化属性
<h1 th:text="#{test.language}"></h1>
<!-- 规范配置名(配置名+属性)后,在调用时,能够一眼知道含义,且多配置中同名属性也能够很好区分-->
- 手动触发
- 默认情况下,通过请求头中信息触发国际化显示切换*(浏览器设置语言属性)*
- 也可以手动编码触发国际化切换
public class Resolver implements LocaleResolver {
@Override
public Locale resolveLocale(HttpServletRequest request) {
Locale locale = Locale.getDefault();
String localeString = request.getParameter("locale");
if(!StringUtils.isEmpty(localeString)){
String[] localeData = localeString.split("_");
// 传入两个参数 语言 + 国家 zh_CN => zh CN
locale = new Locale(localeData[0], localeData[1]);
}
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, java.util.Locale locale) {
}
}
@Configuration
public class Config {
@Bean
LocaleResolver localeResolver(){
// 注册自动生效
return new Resolver();
}
}
通过链接传参就可以实现国际化页面切换,不带参数默认采用操作系统语言。
当然,数据不一定来自于请求,这个就自我发挥了。.
页面路由
- 入口
- 静态资源
配置了静态资源,可以直接对静态页面直接进行访问
@Controller
+@RequestMapping
@Controller
public class MyController {
@RequestMapping("/hello")
public String hello(Map<String, Object> map){
map.put("name","godme");
return "hello";
}
}
通过
@Controller
+@RequestMapping
进行接口访问进行映射是很常用的方式。但是其中经常包含了一些操作。
- 统一映射
如果外部访问非静态文件的,但是又不需要进行操作的话。每次都要
@RequestMapping
添加映射就很麻烦。而且在业务处理中混杂这种只比注释高级一丁点的东西,实在让人分心。
@Configuration
public class Config {
@Bean
WebMvcConfigurerAdapter webMvcConfigurerAdapter(){
return new WebMvcConfigurerAdapter(){
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index.html").setViewName("test");
}
};
}
}
WebMvcConfigurerAdapter
:mvc配置适配器,包含何种控制器的添加方法addViewControllers
:添加视图控制器addViewController
:设置浏览器地址栏访问地址,相当于RequestMapping
setViewName
:设置映射路径,相当于return
返回的值依旧交给
thymeleaf
进行管理,会自动添加上前后缀。记得放置在
templates
文件夹下,或者配置spring.thmeleaf.prefix
.
- 重定向
@Controller
public class MyController {
@RequestMapping("/index")
public String index(){
return "redirect:test";
}
}
redirect:
:直接return
前修饰,表示请求重定向
- 转发
request.getDispatcher("/index.html").forward(reqeust, resposne);
// return "forward:test"
访问
: 浏览器直接访问(接口或静态页面)
跳转
:逻辑处理后,返回新页面,由后台进行跳转操作
转发
:把request
请求交由新接口或页面进行处理,但是返回仍旧由该接口进行返回,地址栏地址不变
重定向
:相当于提供新地址,让浏览器直接发起请求,地址栏发生变化
- 拦截器
逻辑
public class LoginInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(!StringUtils.isEmpty(request.getParammeters("godme"))){
return true;
}
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, java.lang.Exception ex) throws Exception {
}
}
HandlerInterceptor
:拦截处理器
preHandle
:中间可添加判断操作,决定是否进行拦截。true
表示放行,false
则会进行拦截
postHandle
:preHandler
返回true
时启用,当preHandler
执行完毕后执行
afterCompletion
:preHandler
返回true
后启用,最后一步执行
注册
@Configuration
public class Config {
@Bean
WebMvcConfigurerAdapter webMvcConfigurerAdapter(){
return new WebMvcConfigurerAdapter(){
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor());
}
};
}
}
WebMvcConfigurerAdapter
:配置适配器,包含各种mvc配置方法addInterceptors
:添加拦截器
监听
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())//
.addPathPatterns("/**", "/")//
.excludePathPatterns("/index.html", "/");//
}
addPathPatterns
:添加监听路径,字符串变参可传入多个,表示浏览器访问路径
excludePathPatterns
:从监听中移除指定路径,变参,可传入多个
/** 表示监听全部路径
补充
- 标签判断
<span th:text="${msg}" th:if="not #string.isEmpty(msg)"></span>
not
:内置对象
string.isEmpty
:内置方法,**#{}**进行调用
th:if
:条件判断,优先级在th:text
之前,条件不成立则不生成此标签
- 缓存刷新
- 缓存设置
spring.thymeleaf.cache=false
# 不用缓存
- 重编译
Ctrl
+F9
,重编译项目。
如果每次进行稍微的修改就必须重启项目,简直太消耗时间了。
通过这种办法,可以在不重启的情况下把新修改直接运行起来而不需要重启。