我是靠谱客的博主 眼睛大皮卡丘,最近开发中收集的这篇文章主要介绍Spring Boot Thymeleaf模板引擎 MVC功能的定制和扩展,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Thymeleaf基本使用

在这里插入图片描述
使用Thymeleaf完成数据的页面展示
创建Spring Boot项目,引入Thymeleaf依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>

编写全局配置文件

#thymeleaf页面缓存设置(默认true),开发方便调试应设为false,上线稳定后应保持默认true
spring.thymeleaf.cache = false
#编码格式
spring.thymeleaf.encoding = UTF-8
#模板样式
spring.thymeleaf.mode = HTML
#指定模板页面路经
#spring.thymeleaf.prefix = classpath:/resources/templates/
#spring.thymeleaf.check-template=false
#spring.thymeleaf.check-template-location=false
#指定模板页面的后瑞名
spring.thymeleaf.suffix = .html

创建Web控制类
创建controller包,并在该包下创建一个用与前端模板页面动态数据替换效果测试的访问实体类LoginController

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.Calendar;

@Controller
public class LoginController {

//    @GetMapping("/toLoginPage")
    public String toLoginPage(Model model){
        model.addAttribute("currentYear", Calendar.getInstance().get(Calendar.YEAR));
        return "login";
    }
}

toLoginPage()方法向登录页面login.html跳转时,携带了表示当前年份信息的currenYear.
创建模板页面并引入静态资源文件
在resources的templates目录下创建一个用户登录的模板页面login.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>用户登录界面</title>
    <link th:href="@{/login/css/bootstrap.min.css}" rel="stylesheet">
    <link th:href="@{/login/css/signin.css}" rel="stylesheet">
</head>
<body class="text-center">
    <form class="form-signin">
        <img class="mb-4" th:src="@{/login/img/login.jpg}" width="72" height="72">
        <h1 class="h3 mb-3 font-weight-noemal">请登录</h1>
        <input type="text" class="form-control"
               placeholder="用户名" required="" autofocus="">
        <input type="password" class="form-control"
               placeholder="密码" required="">
        <div class="checkbox mb-3">
            <label>
                <input type="checkbox" value="remember-me"> [[#{login.rememberme}]]
            </label>
        </div>
        <button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.button}">登录</button>
        <p class="mt-5 mb-3 text-muted">© <span th:text="${currentYear}">2018</span>-<span th:text="${currentYear}+1">2019</span></p>
    </form>
</body>
</html>

效果测试,启动项目成功后,在浏览器上访问http://localhost:8080/toLoginPage

使用Thymeleaf配置国际化页面
编写多语言国际化文件即配置文件
在项目的类路径resources下创建名为i18n的文件夹,并在该文件夹中根据需要编写对应多语言国际化文件login.properties、login.properties、login.properties
login.properties 为自定义默认语言配置文件

login.tip=请登录
login.username=用户名
login.password=密码
login.rememberme=记住我
login.button=登录

login_zh_CN.properties 为自定义中文国际化文件

login.tip=请登录
login.username=用户名
login.password=密码
login.rememberme=记住我
login.button=登录

login_en_US.properties 为自定义英文国际化文件

login.tip=Please sign in
login.username=Username
login.password=Password
login.rememberme=Remember me
login.button=Login

编写全局配置文件,在文件中添加国家化文件的基础名

#配置国际文件基础名
spring.messages.basename=i18n.login

定制区域信息解析器,提供手动语言切换的功能
新建config包,并在该包下创建一个用于定制国家化功能区域信息解析器的自定义配置类MyLocalResovel

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.thymeleaf.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;

@Configuration
public class MyLocalResovel implements LocaleResolver {
    //自定义区域解析方式
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        // 获取页面手动切换传递的语言参数l
        String l = httpServletRequest.getParameter("l");
        // 获取请求头自动传递的语言参数Accept-Language
        String header = httpServletRequest.getHeader("Accept-Language");
        Locale locale=null;
        // 如果手动切换参数不为空,就根据手动参数进行语言切换,否则默认根据请求头信息切换
        if(!StringUtils.isEmpty(l)){
            String[] split = l.split("_");
            locale=new Locale(split[0],split[1]);
        }else {
            // Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
            String[] splits = header.split(",");
            String[] split = splits[0].split("-");
            locale=new Locale(split[0],split[1]);
        }
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {

    }

    //将自定义的MyLocalResovel类重新注册为一个类型LocalResolver的Bean组件
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocalResovel();
    }
}

在这里插入图片描述

页面使用国际化,login,html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>用户登录界面</title>
    <link th:href="@{/login/css/bootstrap.min.css}" rel="stylesheet">
    <link th:href="@{/login/css/signin.css}" rel="stylesheet">
</head>
<body class="text-center">
    <form class="form-signin">
        <img class="mb-4" th:src="@{/login/img/login.jpg}" width="72" height="72">
        <h1 class="h3 mb-3 font-weight-noemal" th:text="#{login.tip}">请登录</h1>
        <input type="text" class="form-control"
               placeholder="用户名" required="" autofocus="">
        <input type="password" class="form-control"
              placeholder="密码" required="">
        <div class="checkbox mb-3">
            <label>
                <input type="checkbox" value="remember-me"> [[#{login.rememberme}]]
            </label>
        </div>
        <button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.button}">登录</button>
        <p class="mt-5 mb-3 text-muted">© <span th:text="${currentYear}">2018</span>-<span th:text="${currentYear}+1">2019</span></p>
        <a class="btn btn-sm" th:href="@{/toLoginPage(l='zh_CN')}">中文</a>
        <a class="btn btn-sm" th:href="@{/toLoginPage(l='en_US')}">English</a>
    </form>
</body>
</html>

在这里插入图片描述
效果测试,启动项目成功后,在浏览器上访问http://localhost:8080/toLoginPage
在这里插入图片描述
在这里插入图片描述

Spring Boot中MVC功能的定制和扩展

Spring MVC功能扩展实现
项目基础环境搭建
引入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

共能扩展实现
注册视图管理器,在config包下创建实现WebMvcConfigurer接口的配置类MyMvCconfig,用于对MVC框架功能进行扩展

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MyMVCconfig implements WebMvcConfigurer {
//添加视图管理
    public void addViewControllers(ViewControllerRegistry registry){
    //请求toLoginPage映射路径或者login.html页面会自动映射到login.html页面
        registry.addViewController("/toLoginPage").setViewName("login");
        registry.addViewController("/login.html").setViewName("login");
    }
}

效果测试,项目启动成功浏览器访问“http://localhost:8080/toLoginPage”或“http://localhost:8080/toLoginPage”都可
在这里插入图片描述
在这里插入图片描述
注册自定义拦截器
使用WebMvcConfig接口中的addInterceptors()方法注册自定义拦截器。在config包下,创建一个自定义拦截器类M有Interceptor,并编写简单的拦截业务代码

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Calendar;

@Configuration
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    //用户请求/admin开头路径时,判断用户是否登录
        String uri = request.getRequestURI();
        Object loginUser = request.getSession().getAttribute("loginUser");
        if (uri.startsWith("/admin") && null==loginUser){
            response.sendRedirect("/toLoginPage");
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    //向request域中存放当前年月份用于页面动态展示
        request.setAttribute("currentYear", Calendar.getInstance().get(Calendar.YEAR));
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

在自定义配置类MyMVCconnfig中,重写addIntercrtors()方法注册自定义的拦截器,

@Autowired
    private MyInterceptor myInterceptor;
	//添加拦截器管理
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor) //注册自定义拦截器
                .addPathPatterns("/**") //拦截所有路径请求
                .excludePathPatterns("/login.html"); //对/login.html路径请求进行了放行处理
    }

效果测试,项目启动成功浏览器访问“http://localhost:8080/admin”会跳出让登录页面
Spring Boot整合Servlet三大组件
组件注册整合Servlet三大组件,在Spring Boot中,使用组件注册方式整合内嵌Servlet容器的Servlet
Filter、Listener三大组件时,只需将这些自定义组件通过ServletRegistrationBean、FilterRegistrationBean、ServletListenerRegistrationBean类注册到容器中即可。
使用组件注册方式整合Servlet
创建servletComponent包,并在该包下创建一个继承HttpServlet的类MyServlet

import org.springframework.stereotype.Component;

import javax.jws.WebService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Component //组件注册的方式
//@WebServlet("/myServlet") //路径扫描的方式 就不用配置类 但是要在启动类使用@ServletComponentScan注解开启组件扫描
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("hello MyServlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

使用组件注册方式整合Filter
在servletComponent包,并在该包下创建一个类MyFilter

import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@Component //组件注册的方式
//@WebFilter(value = {"/toLoginPage","/myFilter"}) //路径扫描的方式 就不用配置类但是要在启动类使用@ServletComponentScan注解开启组件扫描
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("hello MyFilter");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

使用组件注册方式整合Listener
在servletComponent包,并在该包下创建一个类MyListener

import org.springframework.stereotype.Component;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@Component //组件注册的方式
//@WebListener //路径扫描的方式 就不用配置类但是要在启动类使用@ServletComponentScan注解开启组件扫描
public class MyListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("contextInitialized执行了。。。");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("contextDestroyed执行了。。。");
    }
}

创建Servlet组件配置类,在config包下创建一个Servlet组件配置类ServletConfig,用来对Servlet相关组件进行注册,并将自定义Filter类、Listener类使用组件注册方式进行注册

import com.example.thymeleaf.servletComponemt.MyFilter;
import com.example.thymeleaf.servletComponemt.MyListener;
import com.example.thymeleaf.servletComponemt.MyServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;

@Configuration//组件注册的方式
public class ServletConfig {
    @Bean
    public ServletRegistrationBean getServlet(MyServlet myServlet){
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(myServlet, "/myServlet");
        return registrationBean;
    }

    //注册自定义Filter类
    @Bean
    public FilterRegistrationBean getFilter(MyFilter filter){
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
        registrationBean.setUrlPatterns(Arrays.asList("/toLoginPage","/myFilter"));
        return registrationBean;
    }

    @Bean
    public ServletListenerRegistrationBean getServletListener(MyListener myListener){
        ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean(myListener);
        return registrationBean;
    }
}

效果测试,项目启动成功浏览器访问“http://localhost:8080/myServlet”
在这里插入图片描述
访问“http://localhost:8080/myFilter”
在这里插入图片描述
在这里插入图片描述

最后

以上就是眼睛大皮卡丘为你收集整理的Spring Boot Thymeleaf模板引擎 MVC功能的定制和扩展的全部内容,希望文章能够帮你解决Spring Boot Thymeleaf模板引擎 MVC功能的定制和扩展所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部