在spring boot 当中使用 thymeleaf 视图解析器
想要在 spring boot 当中使用 thymeleaf 视图,就需要导入相关的 jar
依赖。在 pom.xml 文件中配置。
<!-- 引入 thymeleaf-start ,项目会自动完成配置,--> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-thymeleaf</artifactid> </dependency>
在 spring boot当中的 thymeleaf 相关的类是 :thymeleafproperties.java 类。
注意:路径不可以随便改,要按照要求来,或者通过 application.yaml 进行修改。
spring: thymeleaf: prefix: "classpath:/填写自己想要的路径目录" # classpath:/ 类路径起手
对应 html页面上想要使用上 thymeleaf 语法的需要加上如下的一行内容,才行。
<html lang="en" xmlns:th="http://www.thymeleaf.org">
案例举例:
在 pom.xml 文件当中,导入相关的 jar
包文件。
<?xml version="1.0" encoding="utf-8"?> <project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion> <groupid>com.rainbowsea</groupid> <artifactid>springboot_usersys</artifactid> <version>1.0-snapshot</version> <!-- 导入springboot 父工程-规定写法--> <parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>2.5.3</version> </parent> <!-- 导入web项目场景启动器:会自动导入和web开发相关的jar包所有依赖【库/jar】--> <!-- 后面还会在说明spring-boot-starter-web 到底引入哪些相关依赖--> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <!--引入lombok--> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> </dependency> <!-- 引入 thymeleaf-start ,项目会自动完成配置,--> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-thymeleaf</artifactid> </dependency> <!-- 引入 lombok 插件 --> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> </dependency> </dependencies> </project>
编写相关项目的启动场景。
package com.rainbowsea.springboot; import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.springbootapplication; @springbootapplication // 项目启动标志 public class application { public static void main(string[] args) { springapplication.run(application.class,args); } }
对应的 bean 类
package com.rainbowsea.springboot.bean; import lombok.data; import lombok.noargsconstructor; @data @noargsconstructor // 无参数 public class admin { private string name; private string password; }
package com.rainbowsea.springboot.bean; import lombok.allargsconstructor; import lombok.data; import lombok.noargsconstructor; @data @noargsconstructor // 无参数 @allargsconstructor // 全参数 public class user { private integer id; private string name; private string password; private integer age; private string email; }
编写相关 thymeleaf 视图,html文件。
<!doctype html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> <title>管理后台</title> </head> <body> <a href="#" rel="external nofollow" rel="external nofollow" >返回管理界面</a> <a href="#" rel="external nofollow" rel="external nofollow" >安全推出</a> <hr> <div style="text-align: center"> <h1>管理员</h1> <table border="1px" cellspacing="0" bordercolor="green" style="text-align: center"> <tr bgcolor="pink"> <td>id</td> <td>name</td> <td>pwd</td> <td>email</td> <td>age</td> </tr> <tr bgcolor="#7fffd4" style="text-align: center" th:each="user:${users}"> <td th:text="${user.id}"></td> <td th:text="${user.name}"></td> <td th:text="${user.password}"></td> <td th:text="${user.email}"></td> <td th:text="${user.age}"></td> </tr> </table> </div> </body> </html>
<!doctype html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> <title>login</title> </head> <body> <div style="text-align: center"> <h1>用户登录</h1> <form action="#" th:action="@{/login}" method="post"> <label style="color: red" th:text="${msg}"></label><br> 用户名: <input type="text" style="width: 150px" name="name"><br> 密码: <input type="password" style="width: 150px" name="password"><br> <input type="submit" value="登录"><br> <input type="reset" value="重新填写"><br> </form> </div> </body> </html>
相关的 controller 控制器,处理请求内容。
package com.rainbowsea.springboot.controller; import com.rainbowsea.springboot.bean.admin; import com.rainbowsea.springboot.bean.user; import com.sun.org.apache.xpath.internal.operations.mod; import org.springframework.stereotype.controller; import org.springframework.ui.model; import org.springframework.util.stringutils; import org.springframework.web.bind.annotation.getmapping; import org.springframework.web.bind.annotation.postmapping; import javax.jws.webparam; import javax.servlet.http.httpsession; import java.util.arraylist; @controller public class admincontroller { @postmapping("/login") public string login(admin admin, httpsession session, model model) { // 验证用户是否合法 if(stringutils.hastext(admin.getname()) && "666".equals(admin.getpassword())) { // 将登录用户保险到 session会话域当中 session.setattribute("loginadmin",admin); // 合法,重定向到manage.html // 请小伙伴回忆,java web ,不使用请求转发是防止刷新页面会重复提交 // 这里老师为什么写的是 manage.html,因为这样可以更加明确的表示到哪个页面 // manage.html 表示要去找方法的映射路径为: manage.html return "redirect:/manage.html"; } else { // 不合法,就重新登录,请求转发 model.addattribute("msg","账号/用户错误"); return "adminlogin"; // 视图解析 } } // 处理用户的请求到 manage.html // 是重定向——>get @getmapping("/manage.html") public string mainpage(model model,httpsession session){ // 可以这里集合~模板数据,放入到request域中,并显示 arraylist<user> users = new arraylist<>(); users.add(new user(1,"关羽","666",28,"gy@ohu.com")); users.add(new user(2,"关羽","666",28,"gy@ohu.com")); users.add(new user(3,"关羽","666",28,"gy@ohu.com")); users.add(new user(4,"关羽","666",28,"gy@ohu.com")); users.add(new user(5,"关羽","666",28,"gy@ohu.com")); model.addattribute("users",users); // 放入到请求域当中 return "manage"; // 视图解析器 // 拦截器处理 // 获取到 session会话域当中的信息,判断用户是否登录过,进行一个过滤 /*object loginadmin = session.getattribute("loginadmin"); if(null != loginadmin) { // 说明成功登录过 // 可以这里集合~模板数据,放入到request域中,并显示 arraylist<user> users = new arraylist<>(); users.add(new user(1,"关羽","666",28,"gy@ohu.com")); users.add(new user(2,"关羽","666",28,"gy@ohu.com")); users.add(new user(3,"关羽","666",28,"gy@ohu.com")); users.add(new user(4,"关羽","666",28,"gy@ohu.com")); users.add(new user(5,"关羽","666",28,"gy@ohu.com")); model.addattribute("users",users); // 放入到请求域当中 return "manage"; // 视图解析器 } else { // 说明没有登录过, // 这里就返回登录页,并给出提示 model.addattribute("msg","你没有登录/请登录"); // 请求域 return "adminlogin"; // 请求转发到 adminlogin.html视图解析 }*/ } }
package com.rainbowsea.springboot.controller; import org.springframework.stereotype.controller; import org.springframework.web.bind.annotation.getmapping; @controller public class indexcontroller { // 编写方法,转发到登录页面 /* 解释: 1.因为我们引入了 starter-thymeleaf 2.这里就会直接使用视图解析到thymeleaf下的模板文件admin */ @getmapping(value = {"/","/login"}) public string login(){ return "adminlogin"; } }
配置的相关拦截器:
package com.rainbowsea.springboot.interceptor; import lombok.extern.slf4j.slf4j; import org.springframework.web.servlet.handlerinterceptor; import org.springframework.web.servlet.modelandview; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import javax.servlet.http.httpsession; @slf4j public class logininterceptor implements handlerinterceptor { @override public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception { // 为了让大家看到访问的uri string requesturi = request.getrequesturi(); string requesturl = request.getrequesturl().tostring(); log.info("prehandle 拦截到的请求uri={}", requesturi); log.info("prehandle 拦截到的请求url={}", requesturl); // 进行登录的校验 httpsession session = request.getsession(); object loginadmin = session.getattribute("loginadmin"); if (null != loginadmin) { // 说明该用户已经成功登录 // 返回 true 就是放行 return true; } else { // 拦截,重新返回到登录页面 request.setattribute("msg", "你没有登录/请登录~~~"); // 注意:因为这里我们只有一个内容被拦截了,而且该内容的 uri路径就是我们要跳转进入的路径 request.getrequestdispatcher("/").forward(request, response); // 重定向 return false; // 拦截了,不放行 } } @override public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception { log.info("posthandle执行了..."); } @override public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception { log.info("aftercompletion执行了..."); } } // handlerinterceptor
package com.rainbowsea.springboot.config; import com.rainbowsea.springboot.interceptor.logininterceptor; import org.springframework.context.annotation.bean; import org.springframework.context.annotation.configuration; import org.springframework.web.servlet.config.annotation.interceptorregistry; import org.springframework.web.servlet.config.annotation.webmvcconfigurer; @configuration // 配置拦截器 public class webconfig /* implements webmvcconfigurer { @override public void addinterceptors(interceptorregistry registry) { // 注册自定义拦截器logininterceptor registry.addinterceptor(new logininterceptor()) .addpathpatterns("/**") // 拦截所有的请求 .excludepathpatterns("/","/login","/images/**"); // 还要放行视图的内容,因为上面是 // 拦截所有,注意不要: templates ,因为sprinboot的默认配置,就是以templates为根路径往下找的 // 所以添加就错了,就成了 /templates/templates/images/**了。 }*/ { @bean public webmvcconfigurer webmvcconfigurer() { return new webmvcconfigurer() { @override public void addinterceptors(interceptorregistry registry) { system.out.println("addinterceptors~~~"); // 注册拦截器 registry.addinterceptor(new logininterceptor()) .addpathpatterns("/**") .excludepathpatterns("/","/login","/images/**"); } }; } }
启动程序,打开浏览器运行测试
最后:
以上就是在springboot当中使用thymeleaf视图解析器的详细教程的详细内容,更多关于springboot使用thymeleaf的资料请关注代码网其它相关文章!
发表评论