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' }' ";
}
- 属性
- value 请求访问路径
- 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
}
}
方法关键字分析
-
public
: 这是一个访问修饰符,表示该方法是公共的,可以被任何其他类访问。 -
static
: 这也是一个修饰符,表示该方法是静态的,可以直接通过类名调用,而不需要创建类的实例。 -
<T>
: 这是泛型声明,表示这个方法是一个泛型方法,其中<T>
是一个类型参数,用于表示可以接受任意类型的数据。为括号后的数据作解析。 -
Result<T>
: 这是方法的返回类型,表示该方法会返回一个Result
类型的对象,其中<T>
是一个泛型参数,表示这个Result
对象可以持有任意类型的数据。 -
success
: 这是方法的名称,表示这个方法用于创建一个成功的Result
对象。 -
(T data)
: 这是方法的参数列表,其中T data
表示方法接受一个名为data
的参数,该参数的类型是泛型参数T
所表示的任意类型的数据。
综合起来,这个方法的作用是创建一个成功的 Result
对象,并将传入的数据作为其响应数据,其中数据的类型可以是任意类型,由调用方指定。
分析开源项目
目的:学习模块化开发,对特定功能进行学习模仿。
前提:观察前后端的项目结构,看运用了什么技术,如pom.xml则表示是maven项目,还有是否提供数据库语句。
下载:下载之后应该可以得到两文件夹,其中web的就是项目的前端部分。
运行项目:springboot提供服务,前端调用接口数据,vue负责渲染页面
- 先将sql语句执行,注意观察是否有建库语句,没有要根据项目名称进行建库。
- 前端打开文件夹后在地址最前面增加cmd ,通过命令行打开之后输入npm install ,这是Node.js 中用于安装 Node.js 模块的命令。所需的依赖模块安装到项目的
node_modules
目录中。执行npm install
会根据package.json
中的依赖信息来安装相应的模块。之后等待下载。成功之后就可以npm run dev 来启动前端项目。在前端中,跟后端接口连接一般是放在env.develpment中 - 后端我们可以通过idea 中的import project 来打开,不要直接open,这里打开之后可能需要一定时间,因为要下载 很多的依赖。之后我们可以观察项目中的各个模块,重点关注common,systenm,tools模块。然后再查看配置文件中默认的端口号,模块中是否有swagger,redis 等。如果有redis还要去将redis服务打开。
模块分析:从前端开始,找到对应的调用接口接着去后端找controller->service->mapper