不懂就问,多写多记

Session

存储方式

session是服务器为了不同客户端存储信息而创建的一个对象,其存储方式类似与map,是以key-value进行存放的。key必须是一个字符串,value是一个对象。

session

底层实现

每个客户端发送Http请求给服务器时都会携带cookie(因此我们可以request.getSession获取Session),而cookie中可能携带有JSESSIONID,其表示的就是session的id,是唯一的。如果有携带就会根据此id生成session,若没有携带就会创造一个session.

常用方法

request.getSession():获取浏览器(客户端)的session,无则创建新的

request.setAttribute(String s,Object o):在session存放属性

session.getAttribute(String s,):在session中获取s对应属性

session.removeAttribute(String s):从session中删除s对应的属性

session.getId():得到session所对应的id

session.invalidate():使session立即无效

session.setMaxInactiveInterval(int i):设置session最大的有效时间(两次访问服务器的间隔时间)

cookie与session

cookie存在于客户端,相对不安全,而session是存放于服务端,但是过多的客户端时会产生大量的session,影响服务器性能。

cookie存放的数据量要小于session.

cookie只作用于当前url,而session代表客户端和服务器的一次会话过程,一个浏览器(用户)独占一个session,web页面跳转时也可以共享数据,范围是本次会话,客户端关闭也不会消失。

Cookie

cookie是服务器返回给客户端的,一般在还包含有session id

restful风格

含义:强调使用HTTP动词来表示对资源的操作(GET、POST、PUT、PATCH、DELETE等),并通过URI表示资源的唯一标识符。

优点:使用统一的接口来简化客户端与服务器之间的交互,客户端可以缓存响应,以提高性能和减少网络流量。

注解

(1)@RequestMapping

  • 类型 方法注解
  • 位置 SpringMVC控制器方法定义上方
  • 作用 设置当前控制器方法请求访问路径
  • 范例
 @RequestMapping(value = "/users", method = RequestMethod.GET)
 @ResponseBody
 public String save()
    {
      System.out.println("save user");
      return " '{'module': 'user save' }' ";
    }
  • 属性
  1. value 请求访问路径
  2. method http请求动作,标准动作(GET、POST、PUT、DELETE)

(2)@PathVariable

  • 类型 形参注解
  • 位置 SpringMVC控制器方法形参定义前面
  • 作用 绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应
  • 范例
@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'}'";
    }

(3)@RestControll

  • 类型 类注解
  • 位置 基于SpringMVC的RESTful开发控制器类定义上方
  • 作用 设置当前控制器类为RESTful风格,等同于 @Controller 与 @ResponseBody(返回的是数组,而不是页面)两个注解的组合功能
  • 范例
@RestController
public class UserController
{
 @RequestMapping(value = "/users",method = RequestMethod.GET)
 public String save()
    {
 System.out.println("save user");
 return " '{'module': 'user save' }' ";
    }

(4)@GetMapping @PostMapping @PutMapping @DeleteMapping

  • 类型 方法注解
  • 位置 基于SpringMVC的RESTful开发控制器方法定义上方
  • 作用 设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作
  • 范例
@RestController
@RequestMapping("/users") // 下面的每个控制器方法的请求路径都有前缀 /users
public class UserController
{
 @GetMapping("/{id}")
 public String getById(@PathVariable Integer id)
    {
        return "getById";
    }
}

(5)@RequestBody @RequestParam @PathVariable

区别

  • RequestParam 用于接收URL地址传参或表单传参
  • RequestBody 用于接收JSON数据
  • PathVariable 用于接收路径参数,使用 {参数名} 描述路径参数

(六)@ComponentScan

这个如果不配置的话,默认扫描跟启动类中同一级的包及子包。

案例

public class Student {
    private int id;
    private String name;
    private int age;
​
    public Student() { }
​
    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
​
    // Getters and setters
}
然后,我们需要创建一个控制器类来处理客户端请求:

@RestController
@RequestMapping("/students")
public class StudentController {
​
    // Mock data - replace with database queries later
    private static List<Student> students = new ArrayList<>(Arrays.asList(
            new Student(1, "Alice", 20),
            new Student(2, "Bob", 21),
            new Student(3, "Charlie", 22)
    ));
​
    // GET /students - get all students
    @GetMapping("")
    public List<Student> getAllStudents() {
        return students;
    }
​
    // GET /students/{id} - get a student by id
    @GetMapping("/{id}")
    public Student getStudentById(@PathVariable int id) {
        for (Student s : students) {
            if (s.getId() == id) {
                return s;
            }
        }
        return null;  // Return null if student not found
    }
​
    // POST /students - create a new student
    @PostMapping("")
    public ResponseEntity<String> createStudent(@RequestBody Student student) {
        students.add(student);
        return ResponseEntity.status(HttpStatus.CREATED).build();
    }
​
    // PUT /students/{id} - update an existing student
    @PutMapping("/{id}")
    public ResponseEntity<String> updateStudent(@PathVariable int id, @RequestBody Student updatedStudent) {
        for (int i = 0; i < students.size(); i++) {
            if (students.get(i).getId() == id) {
                students.set(i, updatedStudent);
                return ResponseEntity.status(HttpStatus.OK).build();
            }
        }
        return ResponseEntity.status(HttpStatus.NOT_FOUND).build();  // Return 404 if student not found
    }
​
    // DELETE /students/{id} - delete a student by id
    @DeleteMapping("/{id}")
    public ResponseEntity<String> deleteStudentById(@PathVariable int id) {
        for (int i = 0; i < students.size(); i++) {
            if (students.get(i).getId() == id) {
                students.remove(i);
                return ResponseEntity.status(HttpStatus.OK).build();
            }
        }
        return ResponseEntity.status(HttpStatus.NOT_FOUND).build();  // Return 404 if student not found
    }
}

方法关键字分析

  1. public: 这是一个访问修饰符,表示该方法是公共的,可以被任何其他类访问。

  2. static: 这也是一个修饰符,表示该方法是静态的,可以直接通过类名调用,而不需要创建类的实例。

  3. <T>: 这是泛型声明,表示这个方法是一个泛型方法,其中 <T> 是一个类型参数,用于表示可以接受任意类型的数据。为括号后的数据作解析。

  4. Result<T>: 这是方法的返回类型,表示该方法会返回一个 Result 类型的对象,其中 <T> 是一个泛型参数,表示这个 Result 对象可以持有任意类型的数据。

  5. success: 这是方法的名称,表示这个方法用于创建一个成功的 Result 对象。

  6. (T data): 这是方法的参数列表,其中 T data 表示方法接受一个名为 data 的参数,该参数的类型是泛型参数 T 所表示的任意类型的数据。

综合起来,这个方法的作用是创建一个成功的 Result 对象,并将传入的数据作为其响应数据,其中数据的类型可以是任意类型,由调用方指定。

分析开源项目

目的:学习模块化开发,对特定功能进行学习模仿。

前提:观察前后端的项目结构,看运用了什么技术,如pom.xml则表示是maven项目,还有是否提供数据库语句。

下载:下载之后应该可以得到两文件夹,其中web的就是项目的前端部分。

运行项目:springboot提供服务,前端调用接口数据,vue负责渲染页面        

  1. 先将sql语句执行,注意观察是否有建库语句,没有要根据项目名称进行建库。
  2. 前端打开文件夹后在地址最前面增加cmd  ,通过命令行打开之后输入npm install ,这是Node.js 中用于安装 Node.js 模块的命令。所需的依赖模块安装到项目的 node_modules 目录中。执行 npm install 会根据 package.json 中的依赖信息来安装相应的模块。之后等待下载。成功之后就可以npm run dev 来启动前端项目。在前端中,跟后端接口连接一般是放在env.develpment中
  3. 后端我们可以通过idea 中的import project 来打开,不要直接open,这里打开之后可能需要一定时间,因为要下载 很多的依赖。之后我们可以观察项目中的各个模块,重点关注common,systenm,tools模块。然后再查看配置文件中默认的端口号,模块中是否有swagger,redis 等。如果有redis还要去将redis服务打开。

模块分析:从前端开始,找到对应的调用接口接着去后端找controller->service->mapper

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值