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";
	}
	
}

@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'}'";	
}

@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;

}

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";
    }


}

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>

第二步:加一个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)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. 以后的每次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);
}

其中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");

3.session,cookies的超时设置

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

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

拦截器:

拦截器(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();
}

其中GlobalConst是一个枚举类:

public enum GlobalConst{
	USER_SESSION_KEY("student"),ADMIN_SESSION_KEY("admin"),;
	privateStringmsg;
	GlobalConst(Stringmsg){
		this.msg=msg;
	}
	publicStringgetMsg(){
		returnmsg;
	}
}
	
		
@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;
}

需要使用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");//表示这些路径不用拦截。
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值