练习一下SpringBoot
首先新建一个springboot项目
-
这里选择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里面
接下来伪造一部分数据,因为我们没有链接数据库
- 新建pojo文件夹,写入Department和Employee类
- Department两个属性,id和name,使用注解加入有/无参构造
- @Data : 注解在类上, 为类提供读写属性, 此外还提供了 equals()、hashCode()、toString() 方法
- Employee也同理
- 新建dao文件夹,编造一部分数据
- 新建DepartmentDao和EmployeeDao
@Repository // 给spring托管
- 实现DepartmentDao和EmployeeDao
至此准备工作完毕
实现登录界面
- 导入thymeleaf,万物都可被thymeleaf接管
xmlns:th="http://www.thymeleaf.org"
- 更改href标签让thymeleaf接管,具体方法查看thymeleaf文档
- 新建config文件夹,新建MyMvcConfig.java
- 在这里配置首页内容,直接转发到index.html页面,继承WebMvcConfigurer
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";
}
}
}
- 在index.html中 给input标签设置两个名字 name=“username” / name=“password”
国际化
-
这里会涉及到中文乱码问题,具体解决方法如下!
setting 里面搜索 File Encoding 都改成utf-8 即可解决
-
在 resources 新建一个i18n文件夹,
- login.properties
- login_en_US.properties
- login_zh_CN.properties
-
更改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
- 在MyMvcConfig中注入
@Bean
public LocaleResolver localeResolver(){
return new MyLocalResolver();
}
- 注意:MyMvcConfig中一定要加@Configuration注解,不然跳转不过来
拦截器
在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>
- 修改list.html和dashboard.html, 更改员工展示映射地址,并加入点击高亮
<a class="nav-link" th:class="${active=='list.html'? 'nav-link active':'nav-link'}" th:href="@{/emps}">
这里把html*同的代码放到common里面,设置成函数的模式,维护的时候方便
增加员工列表
- 在Dao层写一个添加的方法
- 在emp中新建一个add.html
- 在add中添加一个表单用来收集信息
- 在controller层添加一个返回给表单’‘部门’'信息的方法
@GetMapping("/emp")
public String toAddpage(Model model){
Collection<Department> departments = departmentDao.getDepartments();
model.addAttribute("departments",departments);
return "emp/add";
}
- 再添加一个post请求用于添加员工
@PostMapping("/emp")
public String addEmp(Employee employee){
// 添加的操作 forward
employee.setBirth(new Date());
employeeDao.save(employee);
return "redirect:/emps";
}
- list.html中加一个跳转到添加页面的按钮
<h2><a class="btn btn-sm btn-success" th:href="@{/emp}">添加员工</a></h2>
修改和删除基本上也是大同小异
404处理
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