文首:Thymeleaf 工具 在官网https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#dates第19点
- @Controller 才能对template包进行访问
- 配置首页需要导入thymeleaf包
依赖pom.xml配置 都是基于3.x开发
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
-
使用lombok
1.导入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2.在idea中要安装插件才能使他生效
-
3. lombok的具体作用是你需要用注解来创建代码,目的是减少你要写的样板代码的数量。它为你提供如下,注解,这可能会永远改变代码(不是你的生活):
@Getter 和 @Setter: 为你的字段创建getter和setter
@EqualsAndHashCode: 实现equals()和hashCode()
@ToString: 实现toString()
@Data: 使用上面四个注解的特征
@Cleanup: 关闭流
@Synchronized: 对象上同步
@SneakyThrows: 抛出异常
4月30日
- 关于后端模板引入的问题:
由于使用的是bootstrap模板,因此需要导入pom.xml依赖,否则无法加载样式,当然也需要加入thymeleaf依赖
<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>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>4.0.0</version>
</dependency>
- 关于首页配置的问题:thymeleaf使用前需要在头部添加依赖否则无法使用th:
<html lang="en" xmlns:th="http://www.thymeleaf.org">
所有页面的静态资源都要交给thymeleaf接管: @{},例如:
优点:在读取路径前自动加上application.properties上配置的默认根路径,例如我配置了如下代码,他会在读出路径时候自动加上/zeng,如图:
#设置标签头
server.servlet.context-path=/zeng
-
关于编码国际化问题
①.首先保证idea setting中编码格式都是utf-8否则后面都会出现乱码
5月5日
1 . RequestGetMapping 进行请求转发后 css 样式失效问题: 原因是找不到css样式地址:如下图:
解决办法有三种
1.找到相对路径 ,在目录前加上**. ./**这种方法比较不好,就是不知道当前路径处于哪一级别目录
2 . 采用绝对路径,根路径的方式:(采纳)
5月6日
1 .图片加载问题:可能是资源未加载到target文件种,所以在idea右侧的maven中clean ,然后package重新打包
-
登录拦截器:使用的是继承HandlerInterceptor接口创建实现类实现preHandle方法 , 此处登录拦截器使用的是判断用户名是否为null来拦截进入main.html页面的条件,再设置session值对当前操作状态进行提醒,具体下((5月11日修改版本,解决页面跳转后静态资源无法访问的问题)):
1.在application.properties文件中添加配置
##设置静态资源路径
spring.mvc.static-path-pattern=/static/**
2.创建LoginHandlerInterceptor 类继承HandlerInterceptor ,进行拦截器的拦截判断(可以实现三个方法
preHandle():请求之前拦截
postHandle():请求完成后拦截
afterCompletion():最终拦截
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("/login.html").forward(request,response);
return false;
}else {
return true;
}
}
}
3.接着在MyMvcConfig(带有@Configuration配置类)中实现方法addInterceptors方法,
调用里面的参数registry配置拦截器:registry.addInterceptor(new LoginHandlerInterceptor()),设置拦截器具体类如下
package com.jluzh.springbootday01.config;
import org.omg.PortableInterceptor.Interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
//配置静态资源路径
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/");
registry.addResourceHandler("/templates/**").addResourceLocations("classpath:/templates/");
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
// 配置视图层url
registry.addViewController("/").setViewName("login");
registry.addViewController("/login.html").setViewName("login");
registry.addViewController("/main.html").setViewName("index");
registry.addViewController("/list.html").setViewName("emp/list");
}
//拦截器配置
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/","/login.html","/user/login","/static/**");//"/static/**"放行所有静态资源
}
}
}
- 在html中获取session.setAttribute(s:“xxx”,o:“XXX”)对象:[[${session.xxx}]]如图:
页面中的显示
5月7日
1 . dao层无法注入Controller层(报错:Could not autowire. No beans of ‘EmployeeDao’ type found.):dao类没有添加注解@Resposity ,添加上以后报错解决
2 .引入小标签问题,原配的无法使用:
<link
href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"
rel="stylesheet">
需要改成,直接在网上获取
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.12.0/css/fontawesome.min.css">
<link
rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.12.0/css/brands.min.css">
<link
rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.12.0/css/solid.min.css">
5月11日
- 抽取公共的html代码部分:使用的是Thymeleaf框架的语法糖th:fragment=“xxx”,在Template目录下创建一个公共代码的html页面,主要用来存放公共代码,其他html页面需要用到的时候,使用th:insert或者th:replace,使用方法为th:insert=“~{公共文件的位置::公共文件定义的th:frament名字}” 实例代码如下图
commons.html中的部分公共代码
其他html文件的引用
其中还可以传递参数,用于一些组件激活条件的判断,此时用的是Tymeleaf的语法糖
If-then-else: (if) ? (then) : (else)
例子如下(点击当前页面,当前组件高亮):
在点击页面定义active=xxx
然后在跳转的页面定义组件的行为
简单来说就是只要标签被Tymeleaf接管,就可以使用其中的表达式传递参数 - `页面中日期格式的转换,使用Thymeleaf的表达式,在官网第19点可以找到对于date的转换
例如
<td th:text="${emp.getGender()==0?'女':'男'}"></td>
<td th:text="${#dates.format(emp.getDate(), 'yyyy-MM-dd/ HH:mm')}"></td>
5月12日
- 增加员工页面add.html的实现:页面可以参考bootstrap样式或者Layui
1 .请求到add页面的实现,跳转页面使用的是默认的Get方法,表单提交使用的是Post方法:
2 .具体的方法实现:在index.html跳转到(控制器)/adds路径,此时获取Department数据用于add.html的选择框使用,选择框的数据输出使用的是Tymeleaf模板的th:each=“dept:${depts}” 获取每个Department 对象dept,然后用th:text进行输出;th:value用于绑定pojo类的department对象用于在后面数据回显的时候使用,注意此处value使用的是id所以在传参的时候name的值应该设置为与pojo类对应对象名相同并且后面加上.id,今天错误的把name设置在div中导致数据封装不进去,报500错误,细心问题,具体代码如下
3 .输入数据中,日期格式的转换:在application.properties中加入参数:spring.mvc.format.date=yyyy-MM-dd
5月13日
- 修改员工类的实现,具体代码和增加员工类实现的大同小异,需要注意的是在进行页面参数传递时,将选择的id作为参数传递到Controller控制器中,通过employeeDao.GetEmployeeById()的方法获得与id值相同的employee,然后使用model.addAttribute(),将数据封装进对象模型中供前端页面update显示赋值,
- input-text/email/date 赋值是th:value
- date显示的时候需要进行格式转换,否则无法显示成功,
<input type="text" th:value="${#dates.format(emp.getDate(), 'yyyy-MM-dd HH:mm')}"/>
- input-radio 赋值是th:check
<input type="radio" th:checked="${emp.getGender()==0}"
- input-text/email/date 赋值是th:value
5月14日
- 删除员工页面的实现
5月15日
解决无法下载源码的问题can not download source:
在项目文件下,执行命令mvn dependency:resolve -Dclassifier=sources
- springboot整合Mybatis,依赖导入:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- appliction.propeties文件配置:
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#整合mybatis
mybatis.type-aliases-package=com.jluzh.pojo
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
-
@Mapper注解的使用
1.识别他为mybatis的mapper接口,会自动的把加了@Mapper的类创建代理类对象
2.也可以在启动类上加上@MapperScan(“包路径名”) -
@RestController注解的使用:显示前端页面->必须导入依赖spring-boot-start-web
5月16日
- Spring security的使用:导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
- thymeleaf整合security
1.导入依赖
<dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity4</artifactId> <version>3.0.4.RELEASE</version> </dependency>
2. - 继承相关的接口 WebSecurityConfigurerAdaptar实现其中的方法:主要有两个:
-
授权:configure(HttpSecurity http)
1.定制login登录页面:- 当只有一个.loginPage(“/toLogin”)时候,登录验证都是这个页面
- 当后面有.loginProcessingUrl(“/login”);时候,表单校验的是/login这个地址,所以login的提交地址也为/login
- 当使用这种方式的时候有一点需要注意就是,提交表单的name在没有配置的情况下必须为username和password
- 如果要使用自定义的username 和password 就必须在Controller层的http.formLogin().loginPage(“/toLogin”).loginProcessingUrl(“/login”)加上参数
.usernameParameter(“”).passwordParameter(“”)
- 当使用这种方式的时候有一点需要注意就是,提交表单的name在没有配置的情况下必须为username和password
- 当只有一个.loginPage(“/toLogin”)时候,登录验证都是这个页面
-
认证:configure(AuthenticationManagerBuilder auth)
-