jackson序列化和反序列化、国际化、thymeleaf模板、错误页面

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),然后返回给用户,如果没有使用引擎,则在静态资源里直接找。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值