SpringBoot 学习笔记(三) Web开发

一、导入静态资源

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

  1. 在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的使用

  1. 在pom.xml中引入Themeleaf
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

默认为Thymeleaf2

  1. 导入命名空间
<html lang="en" xmlns:th="http://www.thymeleaf.org">
  1. 所有的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>
  1. 在controller中传递值
@RequestMapping("/test")
    public String test(Model model){
        model.addAttribute("msg","<h1>hello,springboot</h1>");
        model.addAttribute("users", Arrays.asList("yanao","niubi"));
        return "test";
    }
  1. 显示结果
    在这里插入图片描述

2、语法规则

常用表达式:

  1. ${…}:变量表达式
  2. #{…}:消息文字表达式
  3. *{…}:选择表达式
  4. @{…}:链接URL表达式

常用标签:

  1. th:value:给属性赋值
  2. th:style:设置样式
  3. th:action:表单提交的地址

总的类似,Thymeleaf的标签用法和常规的HTML标签的用法类似

三、Spring Boot返回JSON数据

1、常用数据类型转为JSON格式

  1. 创建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;
    }
}

  1. 创建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;
    }
}

  1. 在浏览器输入url测试结果
    在这里插入图片描述
    其他的同理

2、封装统一返回的数据结构

  1. 定义统一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;
    }
}

  1. 修改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);
    }
}
  1. 测试结果
    在这里插入图片描述

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中使用拦截器

  1. 自定义拦截器,新建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也渲染了对应的视图咯,此时我可以做一些清理的工作了");
    }

}
  1. 注册拦截器
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);

    }
}
  1. 运行测试
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值