• SpringBoot课堂笔记20230913


    本篇文章为SpringBoot学习笔记,方便自己再复习。

    Maven:jar包管理工具
    注解:
    @Controller:处理http请求,返回的视图
    @RestController: 相当于@ResponseBody和@Controller一起用,返回的是json

    @ResponseBody:返回响应内容
    @RequestMapping:配置url映射
    例子:

    @RestController
    @RequestMapping("/users") //表示是下面每一个控制器方法请求路径的前缀
    public class UserController{
    	@GetMapping("/{id}")
    	public String getById(@PathVariable Integer id){
    		return "getById";
    	}
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    @PathVariable:用于接收路径参数,使用参数名描述路径参数。例如:

    @RequestMapping(value="users/{id}",method=RequestMethod.DELETE)
    @ResponseBody
    public String delete(@PathVariable Integer id)
    //PathVariable路径参数id对应路径中的id
    {
    	System.out.println("delete user");
    	return "'{'module':'user delete'}'";	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    @RequestParam:用于接收URL地址传参或表单传参
    如:@RequestParam(“name”) String name1
    表示这里定义的name1与传来的参数name是一个东西。
    方法注解:@GetMapping
    @PostMapping
    @PutMapping
    @DeleteMapping
    用于设置当前控制器方法请求访问路径与请求动作

    软件设计的基本原则:单一责任原则

    服务器最基本的三层系统结构:
    在这里插入图片描述

    MVC:
    M:model(模型),对应数据和逻辑
    V:view(视图),代表模型包含的数据的可视化
    C:controller(控制器),作用于视图和模型上。控制数据流向模型对象,并在数据变化时更新视图
    在这里插入图片描述

    post:暗送
    Get:明送
    Restful风格(认为post和get太过单调而提出的):
    restful=有意义的URL+合适的http动词

    功能和HTTP MethodURL
    获取一组数据列表(GET)/base-path/records
    根据ID获取某个数据(GET)/base-path/records/{recordID}
    新建数据(POST)/base-path/records
    完整的更新数据(PUT)/base-path/records/{recordID}
    部分更新数据(PATCH)/base-path/records/{recordID}
    删除(DELETE)/base-path/records/{recordID}
    跨域访问预请求(OPTION)/base-path/records/{recordID}

    书写风格:驼峰法则,如getById(类名)

    int和integer的区别,integer是一个对象,可以为空,int是一个整数。

    @Data:自动生成getter和setter,还会生成无参构造器和String函数
    @AllArgsConstructor:自动生成全参构造函数
    @NoArgsConstructor:自动生成无参构造函数

    课堂代码

    项目结构

    在这里插入图片描述

    StudentVO

    package cn.edu.ctbu.demo1.vo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    /**
     * 这是用于显示学生信息的值对象
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class StudentVo {
    
        private Integer sno;
        private String name;
        private Integer age;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    StudentController

    package cn.edu.ctbu.demo1.api;
    
    import cn.edu.ctbu.demo1.vo.StudentVo;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    @RestController  //返回json数据
    @RequestMapping("/api/student")  //路径映射
    public class StudentController {
        private static final List<StudentVo> students =new ArrayList<>(Arrays.asList(
                new StudentVo(1,"A",20),
                new StudentVo(2,"B",20),
                new StudentVo(3,"C",20)
        ));
    
        //get all students
        @GetMapping("")
        public List<StudentVo> getAllStudents(){
            return students;
        }
        //get student by id
        @GetMapping("/{sno}")
        public StudentVo getStudentBySno(@PathVariable Integer sno){
            for(StudentVo s:students){
                if(s.getSno() == sno){
                    return s;
                }
            }
            return null;
        }
    
        //create a new student
        @PostMapping("")
        public String createStudent(StudentVo student){
            students.add(student);
            return "Success";
        }
    
        //update an existing student
        @PutMapping("/{sno}")
        public String updateStudent(@PathVariable Integer sno,StudentVo updateStudent){
            for(int i=0;i< students.size();i++){
                if(students.get(i).getSno() == sno){
                    students.set(i,updateStudent);
                    return "Success";
                }
            }
            return "Error";
        }
    
        //delete a student by id
        @DeleteMapping("/{sno}")
        public String deleteStudentById(@PathVariable Integer sno){
            for(int i=0;i<students.size();i++){
                if(students.get(i).getSno() == sno){
                    students.remove(i);
                    return "Success";
                }
            }
            return "Error";
        }
    
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    postman显示截图

    在这里插入图片描述

    小结

    之前学过SSM框架,所以在刚学SpringBoot时没有感到很吃力,很多注解和项目的框架比较熟悉。但这次学习让自己对各个知识点都理解更深刻,更能把握。也解锁了很多IEDEA里的快捷方式。继续努力!
    使用AOP的第一步:就在 pom.xml 加入 依赖

    补充1:

    框架必备(AOP)

    AOP(Aspect Oriented Programing):将通用逻辑从业务逻辑中分离出来。AOP是一种编程范式,与语言无关,是一种程序设计思想。

    <dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-aop</artifactId>
    			<version>1.5.9.RELEASE</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    第二步:加一个aspect(注意:仍然是一个class)

    package com.tms.firtsp.aspect;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.springframework.stereotype.Component;
    @Aspect
    @Component
    public class HttpAspect {
    	@Before("execution(public * com.tms.firtsp.WebApi.StudentController.getAll(..))")
    	public void log(){
    		System.out.println("1111");
    		}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    说明:
    1)…表示任意参数
    2)Before表示之前切入

    在这里插入图片描述
    在这里插入图片描述请添加图片描述

    使用Pointcut去重:
    在这里插入图片描述

    补充2:

    用户

    Session(http中、表现层上):

    称为会话控制。Session对象存储特定用户会话所需要的属性及配置信息。
    服务器为每个用户创建的一个会话对象(session对象)。一个浏览器只能产生一个session,当新建一个窗口访问服务器时,还是原来的那个session。session中默认保存的是当前用户的信息。因此,在需要保存其他用户数据时,我们可以自己给session添加属性。session(会话)可以看为是一种标识,通过带session的请求,可以让服务器知道是谁在请求数据。当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。session对象最常见的一个用法就是存储用户的基本信息。

    Cookie:

    指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息.

    token(一开始针对手机):

    session和cookie的区别:

    1. session是由服务器创建的,并保存到服务器上,在session创建好之后,会把sessionId放在cookie中返回(response)给客户端。返回的代码应该是这样子的。返回的cookie是保存在客户端的。
    String sessionId = session.getId();
    Cookie cookie = new Cookie("JSESSIONID", sessionId);
    cookie.setPath(request.getContextPath());
    response.addCookie(cookie);
    
    • 1
    • 2
    • 3
    • 4
    1. 以后的每次HTTP请求都会带着sessionId,来跟踪用户的整个会话。
    2. session的过期和超时与cookie的过期没有什么联系,都是可以分别进行设置的。但是当session或cookie中任意一方过期,那么用户就需要重新登录了。

    1. session的创建:

    @GetMapping"demo"public void demo(HttpServletRequest request){
    HttpSession sessoin=request.getSession();//这就是session的创建
    session.setAttribute("username","TOM");//给session添加属性属性name: username,属性 value:TOM
    session.setAttribute("password","tommmm");//添加属性 name: password; value: tommmm
    System.out.println(session.geiId);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    其中HttpSession session=request.getSession(true); //true表示如果这个HTTP请求中,有session,那么可以直接通过getSession获取当前的session,如果当前的请求中没有session,则会自动新建一个sessionHttpSession session=request.getSession(false);//false表示只能获取当前请求中的session,如果没有也不能自动创建。

    2. session获取属性:

    session.getAttribute("username");
    session.getAttribute("password");
    
    • 1
    • 2

    3.session,cookies的超时设置

    1 在.yml里面或.xml配置文件里面
    在这里插入图片描述
    2. 在创建session时:

    session.setMaxInactiveInterval(30*60);//以秒为单位,即在没有活动30分钟后,session将失效
    
    • 1

    拦截器:

    拦截器(Interceptor),主要完成请求参数的解析、将页面表单参数赋给值栈中相应属性、执行功能检验、程序异常调试等工作。
    过滤器:是在javaweb中,你传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入s ervlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符。
    (1)修改login的webapi

    @GetMapping(value="login")
    public Rlogin(StringuserName,Stringpassword,HttpServletRequesthttpServletRequest,HttpServletResponseht tpServletResponse)throwsException{
    	studentService.validUserNameAndPassword(userName,password);
    	httpServletRequest.getSession().setAttribute(GlobalConst.USER_SESSION_KEY.getMsg(),1);
    	returnR.ok();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    其中GlobalConst是一个枚举类:

    public enum GlobalConst{
    	USER_SESSION_KEY("student"),ADMIN_SESSION_KEY("admin"),;
    	privateStringmsg;
    	GlobalConst(Stringmsg){
    		this.msg=msg;
    	}
    	publicStringgetMsg(){
    		returnmsg;
    	}
    }
    	
    		
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    @Slf4j
    public class LoginInterceptor implements HandlerInterceptor {
    	@Override
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//类似于before
    		Integer code = (Integer)request.getSession().getAttribute(GlobalConst.USER_SESSION_KEY.getMsg());
    		log.info(request.getRequestURI().toString());
    		if (code == null || code.equals("")) {
    			response.sendRedirect("/login/student");//请求重新定向
    			log.info("请先登录"+request.getRequestURI());
    			return false;
    		}
    		return true;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    需要使用WebConfigurer来用这个拦截器:

    @Configuration
    public class WebConfigurer implements WebMvcConfigurer {
    	@Override
    	public void addInterceptors(InterceptorRegistry registry) {
    		registry.addInterceptor(new LoginInterceptor())
    			.addPathPatterns("/**")
    			.excludePathPatterns("/error","/login/student"
    			,"/css/**","/js/**","/img/**","/plugins/**", "/fonts/**","/pagejs/**","/webapi/student/login");//表示这些路径不用拦截。
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    Java中缓存实现的最佳实践
    与git相关错误的究极解决方案
    Python操作Redis数据库—redis库(可直接使用的模板通用操作)
    无法加载文件xxx,此系统上禁止运行脚本
    二十一、【文本工具组】
    CrownCAD 2023十大亮点解析,快速读懂“完全自主可控CAD”
    Splunk UBA 备份和恢复
    操作滚动条小结:scrollIntoView/animate等方法的来龙去脉
    CSDN每日一题学习训练——Python版(搜索插入位置、最大子序和)
    JAVA创建线程案例
  • 原文地址:https://blog.csdn.net/m0_47484802/article/details/132846751