Spring 全家桶之 Spring Boot 2.6.4(六)- Web Develop(Part A)

简介: Spring 全家桶之 Spring Boot 2.6.4(六)- Web Develop(Part A)

一、工程搭建

使用IDEA新建Spring Boot 工程 spring-boot-emps,选择基本Web依赖

88fcf65746fa4d44aa56e0c55f6d8026_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

在entity包中增加Employee和Department实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
   private Integer id;
    private String lastName;
    private String email;
    private Integer gender;
    private Department department;
}
复制代码
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Department {
   private Integer id;
   private String departmentName;
}
复制代码

在mapper包中增加对应的EmployeeMapper和DepartmentMapper类

@Repository
public class EmployeeMapper {
   private static Map<Integer, Employee> employees = null;
   @Autowired
   private DepartmentMapper departmentDao;
   static{
      employees = new HashMap<Integer, Employee>();
      employees.put(1001, new Employee(1001, "Tony Stark", "stark@starkindustrymail.com", 1, new Department(101, "STARK INDUSTRIES")));
      employees.put(1002, new Employee(1002, "Steve Rogers", "steve@gmail.com", 1, new Department(102, "S.H.I.E.L.D. ")));
      employees.put(1003, new Employee(1003, "Natasha Romanoff", "natash@gmail.com", 0, new Department(102, "S.H.I.E.L.D. ")));
      employees.put(1004, new Employee(1004, "Robert Bruce Banner", "banner@gmail.com", 1, new Department(103, "The Avengers")));
      employees.put(1005, new Employee(1005, "Clint Barton", "clint@gmail.com", 1, new Department(102, "S.H.I.E.L.D. ")));
   }
   private static Integer initId = 1006;
   public void save(Employee employee){
      if(employee.getId() == null){
         employee.setId(initId++);
      }
      employee.setDepartment(departmentDao.getDepartment(employee.getDepartment().getId()));
      employees.put(employee.getId(), employee);
   }
   public Collection<Employee> getAll(){
      return employees.values();
   }
   public Employee get(Integer id){
      return employees.get(id);
   }
   public void delete(Integer id){
      employees.remove(id);
   }
}
复制代码
@Repository
public class DepartmentMapper {
   private static Map<Integer, Department> departments = null;
   static{
      departments = new HashMap<Integer, Department>();
      departments.put(101, new Department(101, "STARK INDUSTRIES"));
      departments.put(102, new Department(102, "S.H.I.E.L.D. "));
      departments.put(103, new Department(103, "The Avengers"));
   }
   public Collection<Department> getDepartments(){
      return departments.values();
   }
   public Department getDepartment(Integer id){
      return departments.get(id);
   }
}
复制代码

将Bootstrps模板和静态资源分别拷贝到templates文件夹和static文件夹中 要将 "/" 映射到templates下的index.html页面,可以新建一个HelloController,并新增一个方法将“/”映射到index.html页面,Thymeleaf已经做好了视图解析的配置

@Controller
public class HelloController {
    @RequestMapping("/")
    public String hello(){
        return "index";
    }
}
复制代码

重新启动应用,浏览器输入 localhost:8080

91bfefd05f5347c2886185c00c5a3f2b_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

这样为每一个页面跳转都增加一个方法未免太过麻烦,最好是能像SSM中Spring MVC配置文件中配置映射;这时候就可以使用到配置类。

新建config包并增加自定义的Web MVC配置类LilithMvcConfig实现 WebMvcConfigurer,添加@Configuration注解,并在自定义的配置中添加视图映射

@Configuration
public class LilithMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
    }
}
复制代码

将HelloController中的方法注释掉,重新启动应用,再次在浏览器中输入localhost:8080

91bfefd05f5347c2886185c00c5a3f2b_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

静态资源引用改造

公共静态资源使用webjars代替

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId>
    <version>3.3.1</version>
</dependency>
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>bootstrap</artifactId>
    <version>4.0.0</version>
</dependency>
复制代码

私有静态资源使用Thymeleaf,在HTML页面头部添加Thymeleaf命名空间

xmlns:th="http://www.thymeleaf.org
复制代码

494ef77b64044d5381de39ba294eaa42_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

将所有的静态资源CSS、JS、PNG等资源全部改为使用Thymeleaf命名空间引用。

二、Spring Boot 国际化配置

Spring MVC 如何进行国际化配置的步骤

  1. 编写国际化配置文件
  2. 使用ResourceBundleMessageSource管理国际化资源文件
  3. JSP页面导入fmt命名空间,使用fmt:message取出国际化内容

Spring Boot进行国际化配置同样也需要编写国际化资源文件,并使用Thymeleaf模板引擎取出国际化内容

在resources目录下新建i18n文件夹,建立login.properties、login_zh_CN.properties、login_en_US.properties分别为默认显示的内容和中文内容以及英文内容

使用idea进行配置国际化,进入中文国际化配置文件

f17e9711057b4c9c9b4f4c818f8e04a2_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

点击ok之后bb5e06a85f234faf9683c6e623385b14_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

就可以填写默认显示的内容和中文英文状态显示的内容

接着将这五项全部配置国际化既添加国际化内容

16a4556bb30541efb6b1bd44b5e2d50a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

Spring Boot中包含了自动配置类MessageSourceAutoConfiguration,该类在 org.springframework.boot.autoconfigure.context包下。

ee9a597f66f64e0290653b1714a4007c_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

MessageSource就是管理国际化资源文件的组件

0750f288133e4c728c695c48c600d8fa_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

setBasenames就是设置国际化资源文件的基础名,也就是去掉国家语言代码之后的名字

f89b5a3b5b0241b4a963878848465310_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

默认的国际化资源文件名的前缀是message

在application.properties配置文件中修改国际化文件名的前缀

spring.messages.basename=i18n.login
复制代码

Thymeleaf 官方文档中 4.1 Messages 提到使用#{}来获取消息内容

image.png

修改index.html页面,修改需要国际化的标签,修改时页面会出现国际化的提示

image.png

需要注意的是remember的国际配置要使用行内写法

<input type="checkbox" value="remember-me"> [[#{login.remember}]]
复制代码

重启应用,浏览器输入http://localhost:8080/

image.png

设置浏览器语言为英文

image.png

发送请求切换语言

国际化能显示不同的语言是因为Locale区域信息对象设置了不同的国家或地区,而LocaleResolver就是获取区域信息的对象

WebMvcAutoConfiguration自动配置类中配置了LocaleResolver区域解析器既如果配置类区域信息就是用配置的区域信息来实现国际化,否则就是用请求头的Accept Language中的区域信息来实现国际化,并且这个方法上标注了@ConditionalOnMissingBean,只要容器中有了自定义的区域解析器,Spring Boot自动配置的去解析器就不会导入容器中,自然也就不会生效了。

image.png

实际setDefaultLocale的区域就是从浏览器请求头中的“Accept-Language”中获取到的区域信息

image.png

想要点击页面的中英文连接实现语言切换那就不能使用自动配置类中实现的区域解析器,要自定义区域解析器

浏览器发送的请求头中会包含浏览器的语言

image.png

自定义一个区域信息解析器,根据链接上携带的区域信息切换语言

修改html页面中 中文 English连接,带上区域信息

<a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
<a class="btn btn-sm" th:href="@{/index.html(l='en_CN')}">English</a>
复制代码

实现自定义的区域解析器

public class LilithLocaleResovler implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        // 获取连接中携带的区域信息
        String localeInfo = request.getParameter("l");
        // 使用系统默认的
        Locale locale = Locale.getDefault();
        if (StringUtils.hasLength(localeInfo)){
            String[] split = localeInfo.split("_");
            // 使用携带的语言参数
            locale = new Locale(split[0],split[1]);
        }
        return locale;
    }
    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
    }
}
复制代码

在LilithMvcConfig中增加代码,将自定义的区域信息解析器注册到容器中

@Bean
public LocaleResolver localeResolver(){
    LilithLocaleResovler localeResovler = new LilithLocaleResovler();
    return localeResovler;
}
复制代码

重新启动程序,浏览器进入首页

image.png

点击中文和English可以成功实现语言切换


相关文章
|
2月前
|
缓存 安全 Java
《深入理解Spring》过滤器(Filter)——Web请求的第一道防线
Servlet过滤器是Java Web核心组件,可在请求进入容器时进行预处理与响应后处理,适用于日志、认证、安全、跨域等全局性功能,具有比Spring拦截器更早的执行时机和更广的覆盖范围。
|
2月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
2月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
371 2
|
3月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
2021 1
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
498 0
|
3月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
|
3月前
|
存储 安全 Java
如何在 Spring Web 应用程序中使用 @SessionScope 和 @RequestScope
Spring框架中的`@SessionScope`和`@RequestScope`注解用于管理Web应用中的状态。`@SessionScope`绑定HTTP会话生命周期,适用于用户特定数据,如购物车;`@RequestScope`限定于单个请求,适合无状态、线程安全的操作,如日志记录。合理选择作用域能提升应用性能与可维护性。
151 1
|
4月前
|
存储 NoSQL Java
探索Spring Boot的函数式Web应用开发
通过这种方式,开发者能以声明式和函数式的编程习惯,构建高效、易测试、并发友好的Web应用,同时也能以较小的学习曲线迅速上手,因为这些概念与Spring Framework其他部分保持一致性。在设计和编码过程中,保持代码的简洁性和高内聚性,有助于维持项目的可管理性,也便于其他开发者阅读和理解。
141 0

热门文章

最新文章