本篇文章为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 Method | URL |
---|---|
获取一组数据列表(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:自动生成无参构造函数
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;
}
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";
}
}
之前学过SSM框架,所以在刚学SpringBoot时没有感到很吃力,很多注解和项目的框架比较熟悉。但这次学习让自己对各个知识点都理解更深刻,更能把握。也解锁了很多IEDEA里的快捷方式。继续努力!
使用AOP的第一步:就在 pom.xml 加入 依赖
补充1:
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对象存储特定用户会话所需要的属性及配置信息。
服务器为每个用户创建的一个会话对象(session对象)。一个浏览器只能产生一个session,当新建一个窗口访问服务器时,还是原来的那个session。session中默认保存的是当前用户的信息。因此,在需要保存其他用户数据时,我们可以自己给session添加属性。session(会话)可以看为是一种标识,通过带session的请求,可以让服务器知道是谁在请求数据。当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。session对象最常见的一个用法就是存储用户的基本信息。
指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息.
String sessionId = session.getId();
Cookie cookie = new Cookie("JSESSIONID", sessionId);
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
@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,如果没有也不能自动创建。
session.getAttribute("username");
session.getAttribute("password");
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");//表示这些路径不用拦截。
}
}