一、导入静态资源
1、静态资源可以存放在4个位置
1. classpath:/META-INF/resources/ ##需自行创建目录
2. classpath:/resources/ ##需自行创建目录
3. classpath:/static/ ##工具已经自动生成
4. classpath:/public/ ##需自行创建目录
优先级从上到下
存放在public,static,resources中的静态资源
可以直接使用 localhost:8080/index.html这样的方式访问,然后根据从上到下的优先级依次访问目录寻找index.html
- 在template目录下的所有页面,只能通过controller来跳转
在template中新建test.html
新建controller
@Controller
public class TestController {
@RequestMapping("/test")
public String test(){
return "test";
}
}
使用localhost:8080/test访问
访问时,通过Thymeleaf模板,会自动给返回值添加.html的后缀
二、整合Themeleaf
1、Themeleaf的使用
- 在pom.xml中引入Themeleaf
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
默认为Thymeleaf2
- 导入命名空间
<html lang="en" xmlns:th="http://www.thymeleaf.org">
- 所有的html元素都可以被themeleaf替换接管 格式:th: 元素名
<!--所有的html元素都可以被themeleaf替换接管 格式:th: 元素名-->
<!--utext表示转义-->
<body>
<div th:text="${msg}"></div>
<div th:utext="${msg}"></div>
<div th:each="user:${users}" th:text="${user}"></div>
</body>
</html>
- 在controller中传递值
@RequestMapping("/test")
public String test(Model model){
model.addAttribute("msg","<h1>hello,springboot</h1>");
model.addAttribute("users", Arrays.asList("yanao","niubi"));
return "test";
}
- 显示结果
2、语法规则
常用表达式:
- ${…}:变量表达式
- #{…}:消息文字表达式
- *{…}:选择表达式
- @{…}:链接URL表达式
常用标签:
- th:value:给属性赋值
- th:style:设置样式
- th:action:表单提交的地址
总的类似,Thymeleaf的标签用法和常规的HTML标签的用法类似
三、Spring Boot返回JSON数据
1、常用数据类型转为JSON格式
- 创建entity目录,并创建实体类User
package com.beixi.helloworld.entity;
public class User {
private int id;
private String name;
private String password;
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
- 创建controller目录,并创建JsonController类
package com.example.demo6json.controller;
import com.example.demo6json.entity.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/json")
public class JsonController {
@RequestMapping("/user")
public User getUser() {
return new User(1, "贝西", "123456");
}
@RequestMapping("/list")
public List<User> getUserList() {
List<User> userList = new ArrayList<>();
User user1 = new User(1, "贝西", "123456");
User user2 = new User(2, "贾志杰", "123456");
userList.add(user1);
userList.add(user2);
return userList;
}
@RequestMapping("/map")
public Map<String, Object> getMap() {
Map<String, Object> map = new HashMap<>(3);
User user = new User(1, "贾志杰", "123456");
map.put("作者信息", user);
map.put("博客地址", "https://blog.csdn.net/beixishuo");
map.put("公众号", "贝西奇谈");
map.put("B站", "贝西贝西");
return map;
}
}
- 在浏览器输入url测试结果
其他的同理
2、封装统一返回的数据结构
- 定义统一JSON结构,创建util目录,创建JsonResult类
package com.example.demo6json.util;
public class JsonResult<T> {
private T data;
private String code;
private String msg;
/**
* 若没有数据返回,默认状态码为0,提示信息为:操作成功!
*/
public JsonResult() {
this.code = "0";
this.msg = "操作成功!";
}
/**
* 若没有数据返回,可以人为指定状态码和提示信息
* @param code
* @param msg
*/
public JsonResult(String code, String msg) {
this.code = code;
this.msg = msg;
}
/**
* 有数据返回时,状态码为0,默认提示信息为:操作成功!
* @param data
*/
public JsonResult(T data) {
this.data = data;
this.code = "0";
this.msg = "操作成功!";
}
/**
* 有数据返回,状态码为0,人为指定提示信息
* @param data
* @param msg
*/
public JsonResult(T data, String msg) {
this.data = data;
this.code = "0";
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
- 修改Controller中的返回值类型
package com.example.demo6json.controller;
import com.example.demo6json.entity.User;
import com.example.demo6json.util.JsonResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/jsonresult")
public class JsonController {
@RequestMapping("/user")
public JsonResult<User> getUser() {
User user = new User(1, "贝西", "123456");
return new JsonResult<>(user);
}
@RequestMapping("/list")
public JsonResult<List<User>> getUserList() {
List<User> userList = new ArrayList<>();
User user1 = new User(1, "贝西", "123456");
User user2 = new User(2, "贾志杰", "123456");
userList.add(user1);
userList.add(user2);
return new JsonResult<>(userList, "获取用户列表成功");
}
@RequestMapping("/map")
public JsonResult<Map<String, Object>> getMap() {
Map<String, Object> map = new HashMap<>(3);
User user = new User(1, "贾志杰", "123456");
map.put("作者信息", user);
map.put("博客地址", "https://blog.csdn.net/beixishuo");
map.put("公众号", "贝西奇谈");
map.put("B站", "贝西贝西");
return new JsonResult<>(map);
}
}
- 测试结果
3、配置嵌入式Servlet容器
默认的Servlet容器为Tomcat
新建MyMvcConfig类
package com.example.demo6json.config;
import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyMvcConfig {
@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer(){
return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
@Override
public void customize(ConfigurableWebServerFactory factory) {
factory.setPort(8082);
}
};
}
}
4、在SpringBoot中使用拦截器
- 自定义拦截器,新建LoginInterceptor类
package com.example.demo6json.interceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
/**
* 自定义拦截器
*/
public class LoginInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
String methodName = method.getName();
logger.info("====拦截到了方法:{},在该方法执行之前执行====", methodName);
// 判断用户有没有登陆,一般登陆之后的用户都有一个对应的token
String token = request.getParameter("token");
if (null == token || "".equals(token)) {
logger.info("用户未登录,没有权限执行……请登录");
return false;
}
// 返回true才会继续执行,返回false则取消当前请求
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("执行完方法之后进执行(Controller方法调用之后),但是此时还没进行视图渲染");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("整个请求都处理完咯,DispatcherServlet也渲染了对应的视图咯,此时我可以做一些清理的工作了");
}
}
- 注册拦截器
package com.example.demo6json.interceptor;
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 InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//需要拦截的路径,/**表示需要拦截所有请求
String[] addPathPatterns={"/**"};
//不需要拦截的路径
String [] excludePathPaterns={
"/login.html",
"/registry.html"
};
//注册一个登录拦截器
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns(addPathPatterns)
.excludePathPatterns(excludePathPaterns);
//注册一个权限拦截器 如果有多个拦截器 ,只需要添加以下一行代码
//registry.addInterceptor(new LoginInterceptor())
// .addPathPatterns(addPathPatterns)
// .excludePathPatterns(excludePathPatterns);
}
}
- 运行测试