这里使用登录表单提交作为例子
1、导入的依赖以及依赖版本
<!--导入thymeleaf依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--thymeleaf的版本号-->
<thymeleaf.version>3.0.11.RELEASE</thymeleaf.version>
<thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
2、创建表单提交页面和成功页面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"><!--引入thymeleaf的空间-->
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="登录">
<span th:text="${error}" th:if="${not #strings.isEmpty(error)}"></span>
<span th:text="${handlerInterceptorMessage}" th:if="${not #strings.isEmpty(handlerInterceptorMessage)}"></span>
<!--request域中的数据可以直接取出使用-->
</td>
</tr>
</table>
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
[[${session.username}]]<!--session域中数据的使用方法-->
</body>
</html>
3、实现controller(两种写法,一种是没有重定向,所以会重复提交表单,一种是重定向,不会重复提交表单)如果打开了检查元素是不会看见重复提交表单的提示框的
package com.xjj.demo97003.controller;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpSession;
import java.util.Map;
@Controller
public class MyController {
@RequestMapping("/login")
public String login(@RequestParam String username, @RequestParam String password, Map<String,Object> map, HttpSession httpSession){
//当登陆结果不正确时,返回error,这里就没有重定向,所以会重复提交表单
if(StringUtils.isEmpty(username)){
map.put("error","用户名不能为空");
return "login";
}
if(StringUtils.isEmpty(password)){
map.put("error","密码不能为空");
return "login";
}
if(!username.equals("123")||!password.equals("123")){
map.put("error","账号或密码错误");
return "login";
}
//为了防止表单重复的提交,只能够设置重定向的操作,但是重定向map就不能给信息,所以用session
httpSession.setAttribute("username",username);
//重定向到success.html的请求,而这个请求已经被拓展配置文件配好了,会直接跳到成功页面。否则只会被当作静态资源的访问请求,不会到找到templates文件夹里面自己想要的那个文件。
return "redirect:/success.html";
}
}
4、拓展springboot的配置和Interceptor的编写
package com.xjj.demo97003.config;
import com.xjj.demo97003.component.MyHandlerinterceptor;
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.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//加上才能被SpringBoot读取
@Configuration
public class MyConfig implements WebMvcConfigurer {
//注入到容器中
@Bean
public WebMvcConfigurer webMvcConfigurer(){
WebMvcConfigurer webMvcConfigurer = new WebMvcConfigurer() {
@Override
//写了这个才能实现对templates文件夹下面的页面的直线访问
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login.html").setViewName("login");
registry.addViewController("/success.html").setViewName("success");
}
//写了这个才能实现对某个请求的拦截功能
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyHandlerinterceptor()).addPathPatterns("/success.html");
}
};
return webMvcConfigurer;
}
}
package com.xjj.demo97003.component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//用来创建自己的拦截器
public class MyHandlerinterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//通过session的值来判断是否要进行拦截
Object username=request.getSession().getAttribute("username");
if(username!=null){
return true;
}else{
request.setAttribute("handlerInterceptorMessage","没有权限,请先登录");
//当权限不够的时候直接跳回主页面
request.getRequestDispatcher("/login.html").forward(request,response);
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}