1. 序列化和反序列化
1. @ResponseBody 和 @RequestBody
虽然总提序列化,但是我们很少深刻体会到,那是因为在web项目中,方便的注解替我们解决了。
@RestController 的效果 = @Controller + @ResponseBody
@ResponseBody注解在Controller层的某个方法,表示返回给前端的对象要进行序列化。
@RequestBody注解在Controller层的某个方法的参数上,表示这个从前端传来的json字符串要反序列化为对象。
2. ObjectMapper类
用readValue方法反序列化, 举个例子如下。
public class Student{
private String name;
private int age;
// 省略getter 和 setter
}
@Autowired
ObjectMapper objectMapper;
String str = "{"name":"Bob", "age": 24}";
Student student = objectMapper.readValue(str, Student.class);
用writeValueAsString方法序列化,举个例子如下:
@Autowired
ObjectMapper objectMapper;
Student student = new Student();
student.setName("Bob");
student.setAge(24);
String str = objectMapper.writeValueAsString(student);
3. Jackson 的一些功能注解
@JsonIgnore 注解在属性上,表示序列化的时候,会将此属性忽略。
@JsonProperty ("另一个名字")注解在属性上,表示将该属性名在序列化的时候,用另一个名字,而不是属性本名。
@JsonIgnoreProperties({"属性名1","属性名2",,,,}) 注解在类上,表示序列化时,忽略掉多个属性。
@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss", timezone="GMT+8") 注解在时间属性上,表示时间的序列化格式,和时区,一般我们是北京时间,所以要加个8,才正常。
4. springboot 日期格式、时区的解决
方法1. 在所有类的日期属性都添加上注解:@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss", timezone="GMT+8")
方法2. 在springboot的配置文件yml中配置即可:
spring:
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
2. 国际化
1. 首先要建立如下文件和目录,可以看到命名上有关联,命名分为基础名,和扩展名,基础名可以自定义,但是扩展名就需要从固定的那些里面选择,比如本例的基础名是login,扩展名有en_US,zh_CN等等,分别表示英文、中文。
先创建i18n目录。
在i18n目录下面,添加。然后出现如下窗口,填写基础名,“+”号代表添加扩展名,这样重复三次,创建三个properties文件:
properties文件的内容就是翻译:
login 和 login_zh_CN
title=用户登陆
user.welcome=欢迎
user.username=登陆用户
user.password=登陆密码
user.login=登陆
login_en_US
title=User Login
user.welcome=Welcome
user.username=Username
user.password=Password
user.login=Sign In
然后在application.yml文件里配置国际化:
spring:
messages:
basename: classpath:/i18n/login #表示路径下面文件名以login开头的文件,同时login.properties为默认文件,可以配置多个,用逗号隔开
fallback-to-system-locale: true #就会找服务器的语言环境对应的配置文件。如果spring.messages.fallback-to-system-locale=false,就找login.properties这个默认的配置文件。
然后再配置一个默认解析器(默认按照哪种语言),默认拦截器(按照url中的参数来决定使用什么语言):
@Configuration
public class InternationalizationConfiguration extends WebMvcConfigurerAdapter {
/**
* 默认解析器 其中locale表示默认语言
*/
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver localeResolver = new SessionLocaleResolver();
localeResolver.setDefaultLocale(Locale.CHINA);
return localeResolver;
}
/**
* 默认拦截器 其中lang表示切换语言的参数名 ?lang=en_CN,其实感觉就是配置文件里的basename + lang 构成语言properties文件名,然后读取文件里的语言
*/
@Bean
public WebMvcConfigurer localeInterceptor() {
return new WebMvcConfigurer() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();
localeInterceptor.setParamName("lang");
registry.addInterceptor(localeInterceptor);
}
};
}
}
再写一个工具类,用于获取语言的翻译:
@Component
public class InternationalizationUtils {
@Autowired
private static MessageSource messageSource;
/**
* 获取单个国际化翻译值
*/
public static String get(String msgKey) {
try {
return messageSource.getMessage(msgKey, null, LocaleContextHolder.getLocale());
} catch (Exception e) {
return msgKey;
}
}
}
最后测试: String str = InternationalizationUtils.get("title");
3. Thymeleaf 模板
1.首先添加maven依赖:
<!--thymeleaf 模板引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
顺便说明一下,我在测试的时候,高版本的thymeleaf无法下载,只能用2.1.0版本的。
2. 在application.yml配置(总之在你的配置文件里配置):
spring:
#-------------------------------------------------------------
thymeleaf:
prefix: classpath:/templates/ #Controller层返回给用户的时候,去哪个目录下找页面呢,就是这个目录(默认)
suffix: .html #后缀的意思(默认),Controller层不用return xx.html,而是 return xx,就会自动到templates目录下去找xx.html文件去了
mode: HTML5 #模式是H5(默认)
encoding: UTF-8 #编码格式( 默认)
cache: false #关闭缓存,默认是false
mvc:
static-path-pattern: /static/** #这个是给mvc设置静态路径,以便mvc在查找静态资源时,就去这个路径找。
3.测试一下,可以直接仅返回视图页面,也可以返回模型与视图,体验一下:
@RestController
public class UserController {
@RequestMapping("login")
public String getLoginPage(){
return "index";
}
@RequestMapping("error404")
public ModelAndView get404(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("username", "Alice");
modelAndView.setViewName("error/404");
// return "error/404";
return modelAndView;
}
}
4. 错误页面
其实使用springboot最大的好处就是默认自带了很多配置,不至于让开发者去配置,那么要使用这些默认的配置,就需要遵守springboot的一些规则,比如项目的目录结构,如下:
当我们web客户端发起一个无法mapping的url请求时,自然就会抛出404的异常,那么返回给客户端什么响应呢,如果使用了模板引擎,就会自动到静态资源下的templates目录下的error目录下查找是否有404.html(若没有,则找4xx.html),然后返回给用户,如果没有使用引擎,则在静态资源里直接找。