这里选择Spring Initializr
改一下文件名和路径,java版本选择java8
依赖这里勾选Spring Web
多余的东西删掉
等待依赖加载完成即可(过程很慢,在网上下载)
本项目比较小,没有实现数据库层面,所以只导入了lombok和thymeleaf
<!-- lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- import thymeleaf--> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
这几个html文件我们拷贝到templates里面,asserts下面的资源拷贝到static里面
- @Data : 注解在类上, 为类提供读写属性, 此外还提供了 equals()、hashCode()、toString() 方法
@Repository // 给spring托管
至此准备工作完毕
xmlns:th="http://www.thymeleaf.org"
addViewControllers:页面跳转
以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,其实重写WebMvcConfigurer中的addViewControllers方法即可达到效果了
@Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/toLogin").setViewName("login"); }
值的指出的是,在这里重写addViewControllers方法,并不会覆盖WebMvcAutoConfiguration(Springboot自动配置)中的addViewControllers(在此方法中,Spring Boot将“/”映射至index.html),这也就意味着自己的配置和Spring Boot的自动配置同时有效,这也是我们推荐添加自己的MVC配置的方式
@Controller public class LoginController { @RequestMapping("/user/login") public String login(@RequestParam("username") String username, @RequestParam("password") String password, Model model, HttpSession session){ if(!StringUtils.isEmpty(username) && "123456".equals(password)){ session.setAttribute("loginUser",username); return "redirect:/main.html"; }else { model.addAttribute("msg","用户名或者密码错误"); return "index"; } } }
这里会涉及到中文乱码问题,具体解决方法如下!
setting 里面搜索 File Encoding 都改成utf-8 即可解决
在 resources 新建一个i18n文件夹,
更改index.html
主要就是对每个有文字的地方加一个 th:text="#{login.remember}"
最后中英文那里 th:href="@{/index.html(l=‘zh_CN’)}"
在config下新建MyLocalResolver.java写一个自己的LocaleResolver
在application.properties中加入
# 关闭默认缓存机制 spring.thymeleaf.cache=false spring.messages.basename=i18n/login
@Bean public LocaleResolver localeResolver(){ return new MyLocalResolver(); }
在config下新建LoginHandlerInterceptor.java
public class LoginHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object loginUser = request.getSession().getAttribute("loginUser"); if(loginUser==null){ request.setAttribute("msg","没有权限,请先登录"); request.getRequestDispatcher("/index.html").forward(request,response); return false; }else { return true; } } }
同时在MyMvcConfig.java下配置拦截器
@Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginHandlerInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/index.html","/","/user/login","/css/*","/js/**","/img/**"); }
在EmployeeDao中加入返回所有的方法
public Collection<Employee> getAll(){ return employees.values(); }
新建EmployeeController.java
@RequestMapping("/emps") public String list(Model model){ Collection<Employee> employees = employeeDao.getAll(); model.addAttribute("emps",employees); return "emp/list"; }
新建emp文件夹,将list.html加入其中, 如上所示
修改原有展示的内容
<table class="table table-striped table-sm"> <thead> <tr> <th>id</th> <th>lastName</th> <th>email</th> <th>gender</th> <th>department</th> <th>birth</th> <th>操作</th> </tr> </thead> <tbody> <tr th:each="emp:${emps}"> <td th:text="${emp.getId()}"></td> <td th:text="${emp.getLastName()}"></td> <td th:text="${emp.getEmail()}"></td> <td th:text="${emp.getGender()}"></td> <td th:text="${emp.getDepartment()}"></td> <td th:text="${emp.getBirth()}"></td> </tr> </tbody> </table>
<a class="nav-link" th:class="${active=='list.html'? 'nav-link active':'nav-link'}" th:href="@{/emps}">
这里把html中共同的代码放到common里面,设置成函数的模式,维护的时候方便
@GetMapping("/emp") public String toAddpage(Model model){ Collection<Department> departments = departmentDao.getDepartments(); model.addAttribute("departments",departments); return "emp/add"; }
@PostMapping("/emp") public String addEmp(Employee employee){ // 添加的操作 forward employee.setBirth(new Date()); employeeDao.save(employee); return "redirect:/emps"; }
<h2><a class="btn btn-sm btn-success" th:href="@{/emp}">添加员工</a></h2>
404的话 直接在templates下新建一个error把404放进去即可
在LoginController中加一个关闭session方法即可
<a class="nav-link" th:href="@{/user/logout}">注销</a>
展示一下界面截图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EvKXjxJi-1637900550431)(C:\Users\MissLiuAndMrWang\AppData\Roaming\Typora\typora-user-images\image-20211126121452175.png)]
项目链接:https://pan.baidu.com/s/1RckRekY3mpnAdJoLPEP1GA
提取码:wlfd