SpringMVC

如何使用

建立连接

@RequestMapping :用来注册接口的路由映射,就是注册一个方法

@RequestMapping标识一个类 :表示访问路径的初始信息,主要是增加代码可读性

@RequestMapping标识一个方法 :表示访问路径的具体信息,具体到某个方法,资源路径

对于同一种method资源路径是唯一的

@RestController :一个项目中有很多类,Spring通过@RestController注解知道方法的位置 ,也就是说Spring只会扫描带有@RestController注解的类

http://127.0.0.1:8080/Hello/m1

指定支持的请求类型

方法一:

java 复制代码
@RequestMapping(path="/m2",method=RequestMethod.GET)
 @RequestMapping(path="/m3",method={RequestMethod.GET,RequestMethod.POST})

方法二:

java 复制代码
@PostMapping("m5")

请求

参数可以放到哪里(HTTP):

  1. url资源路径

  2. url查询字符串

  3. header

  4. 请求正文Body

传递参数

直接在方法里拿,传递参数时,参数名 要与形参名保持一致

java 复制代码
 @RequestMapping("r1")
public String r1(String name,String password){
    return "接收参数"+name+":"+password;
}

包装类型与普通类型 :对于包装类型,如果不传递对应的参数,Spring接收到的数据就是null 。而对于一般类型,如果没有传递对应的参数,则会报500错误

传递的参数不匹配 :报400错误

传递对象

​ 如果参数比较多,可以将其封装成一个类,并重写get()/set()方法

java 复制代码
public String r2(UserInfo info){
    return info.toString();
}
lombok

省略自定义类中的get/set/构造方法...

@Data = @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor

可以添加在类上,也可以添加在属性上​

后端参数重命名

前端传递一个参数,后端使用一个不同的参数名去接收

注解: @RequestParam("n") 将n绑定到规定的参数名,加上这个注解后,默认为必传参数

@RequestParam(value="前端参数名",required=false ):修改为默认参数

java 复制代码
@RequestMapping("r3")
public String r3(@RequestParam("q") String name){
    return name;
}
@RequestMapping("r4")
public String r4(@RequestParam(value="q",required=false) String name){
    return name;
}

传递数组/集合

传递数组直接传就可以,传递集合需要加上@RequestParam绑定参数关系

%2c是逗号的转义编码

浏览器传参:http://127.0.0.1:8080/Hello/r4?name=aa%2Cbb

java 复制代码
@RequestMapping("r4")
public String r4(String[] name){
    return Arrays.toString(name);
}
@RequestMapping("r5")
public String r5(@RequestParam List<Integer> list){
    return list.toString();
}

传递JSON参数

JSON是一种数据格式,本质是字符串,主要负责客户端和服务端进行数据交互

{ 整个JSON 数据保存在一个大括号中

数据保存在键值对 中,键与值使用冒号分隔

键值对之间使用逗号分隔

对象使用{}表示,数组使用[]表示

值可以为对象,也可以为数组,数组中可以包含多个对象(不同对象使用逗号分隔)

}

在线JSON校验工具https://www.bejson.com/#google_vignette

JSON字符串与Java对象转换

Spring 内置了jackon-databind JSON工具,不需要额外引入依赖

  1. 创建ObjectMapper对象

    : ObjectMapper objectMapper =new ObjectMapper();

  2. 对象转JSONwriteValueAsString(对象名)

  3. JSON转对象readValue(String s , class<T> valueType)

UserInfo info=objectMapper.readValue(s,UserInfo.class);

注意:readValue()方法会自动调用无参的构造函数,如果自定义类中重写了构造方法,那么默认的无参构造方法不会生效。所以需要手动加上无参的构造函数

传递JSON对象

Spring会自动将JSON转换为对象,所以直接使用对象来接收。使用@RequestBody注解

java 复制代码
@RequestMapping("r6")
public String r6(@RequestBody UserInfo info ){
    return info.toString();
}

不加@RequestBody注解,则无法接收到JSON的数据

获取URL中路径参数

使用@PathVariable注解(也可使用其进行后端参数重命名)

java 复制代码
@RequestMapping("r7/{name}/{tel}")
public String r7(@PathVariable String name,@PathVariable("tel") Integer telenumber){
    return name +":"+telenumber;
}

当URL中的资源路径与@RequestMapping注解中的路径一致时,就可提取URL中的参数

http://127.0.0.1:8080/Hello/r7/Tom/17628952

上传文件

使用@RequestPart()用于文件传输的后端参数重命名

使用MultipartFile对象去接收

java 复制代码
@RequestMapping("r8")
public String r8(@RequestPart("file") MultipartFile gifFile) throws IOException {
    //获取文件名称
    System.out.println(gifFile.getOriginalFilename());
    //将文件保存至指定路径
    gifFile.transferTo(new File("C:\\Users\\32355\\Desktop\\111\\"+gifFile.getOriginalFilename()));
    return "文件接收成功";
}

获取Cookie/Session

HTTP协议的客户端与服务器之间的这次通信,默认和下次通信之间时没有直接关联 的(无状态 ),可是网站需要保存我们的一些信息(Session ),以提供定制化服务。客户端就需要存储相应的信息,使得网站可以通过客户端的信息(sessionID )从服务器中提取对应的信息。

Session(服务器) :直译过来就是会话 ,每一次与客户端与服务器之间的连接 都可以称之为一次会话。遇到陌生客户端与服务器建立连接,服务器就会创建一个新的会话,会话中存储着这个用户的信息。Session就是服务器为了保存这些会话而创建的一个特殊对象 ,本质上就是一个哈希表 SessionID - 用户信息

Cookie(客户端) :服务器不能直接将SessionID存储到硬盘上,只能通过Set - Cookie 字段,将SessionID存储到Cookie中。客户端后续向服务器发送请求时,也会通过Cookie字段带上SessionID

SessionID就是Session和Cookie之间的桥梁

获取Cookie

方法一:

获取Cookie: Cookie[] getCookies()

java 复制代码
@RequestMapping("r9")
public void r9(HttpServletRequest request, HttpServletResponse response) throws IOException {
Cookie[] cookies= request.getCookies();
if(cookies!=null){
    for(Cookie cookie:cookies){
        System.out.println(cookie.getName()+":"+cookie.getValue());
    }
}
response.getWriter().println("Get Cookie succeed");
}

**HttpServletRequest:**表示客户端请求,请求header中所有的信息都保存在这个对象中

HttpServletResponse:表示服务器响应,比如向客户端发送的数据响应头,状态码等都保存在这个对象中。也可通过内置的流对象向客户端返回信息

方法二:

通过@CookieValue注解,获取Cookie对应的value

java 复制代码
 @RequestMapping("r10")
     public String r10(@CookieValue("Cookie名") String cookieValue){
         return cookieValue;
     }
设置Cookie
java 复制代码
//键值对
Cookie myCookie=new Cookie("Username","en");
//最大存活时间
myCookie.setMaxAge(60*60*60);
//作用路径
myCookie.setPath("/");
response.addCookie(myCookie);
获取Session

Session设置:

java 复制代码
    //方法一
    @RequestMapping("r12")
public String r11(HttpServletRequest request){
    //从cookie中获取SessionID,根据sessionId,获取session对象
   HttpSession session= request.getSession();
   //默认存储在内存中
    session.setAttribute("username","lisi");
    session.setAttribute("age","111");
    return "设置session成功";
}
        //方法二
    @RequestMapping("r13")
public String r13(HttpSession session){
    session.setAttribute("username","lisi");
    session.setAttribute("age","111");
    return "设置session成功";
}

getSession(boolean flag)

true(默认):没有获取到Session返回一个空的Session对象

false:没有获取Session返回null

首次访问时,由于Cookie中并没有SessionID字段,所以服务器会创建一个Session对象 ,并在响应中将SessionID保存在Cookie中

Session获取:

java 复制代码
//方法一
HttpSession session =request.getSession(false);
//方法二,Session不存在就会报错
@RequestMapping("r14")
public String r14(@SessionAttribute("username") String name){
     return "登录用户为"+name;
}

Http请求时,SessionID通过Cookie发送给服务器

获取Header

java 复制代码
@RequestMapping("r15")
public String r15(HttpServletRequest request){
    String ua=request.getHeader("User-Agent");
    return ua;
}
@RequestMapping("r16")
public String r16(@RequestHeader("User-Agent") String ua){
    return ua;
}

响应

返回静态页面/数据

使用@Controller注解,页面文件要存储在/resources/static路径下,返回的页面地址是相对于static目录相对路径

java 复制代码
@RequestMapping("/resp")
@Controller
public class resp {
    @RequestMapping("/r1")
    public String r1(){
        return "/Hello.html";
    }
}

使用@Controller注解修饰的类中想返回数据,需要在返回数据的方法上面加上@ResponseBody注解

java 复制代码
@ResponseBody
@RequestMapping("r2")
public String r2(){
    return "<h1>Hello en</h1>";
}

返回数据时,如果数据中有HTML代码,也可以被解析

返回JSON

​ 返回类型为一个对象 时,会自动解析为JSON格式

java 复制代码
 @ResponseBody
 @RequestMapping("r3")
 public UserInfo r3(){
     UserInfo info=new UserInfo("zhangsan","man",11);
     return info;
 }

设置状态码

java 复制代码
@RequestMapping("r4")
public String r4(HttpServletResponse response){
    response.setStatus(505);
    return "设置状态码成功";
}

这里的状态码不影响页面的展示

设置Header

​ Http响应报头也会向客户端传递一些附加信息,这些信息通过@RequestMapping注解的属性来实现

consumes :限制请求的Content-Type,仅接受指定类型的请求体

method:限制请求的方法类型,GET

value:限制请求的url

produces :指定返回内容的类型 ,还可以同时设置返回值的字符编码

params :限制请求中必须 包含某些参数 时,才让该方法处理,可写条件表达式@RequestMapping(params = "id=1")

headers :指定request中必须 包含某些指定的header值,才让该方法处理

设置响应的Content-Type:

java 复制代码
@RequestMapping(value="r5",produces="application/json")
public String r5(){
      return "<h1>Hello en</h1>";
}

设置其他Header:

void setHeader(String name,String value):设置一个带有名称和值的Header,如果name已经存在,则覆盖旧值

java 复制代码
@RequestMapping("r6")
public String r6(HttpServletResponse response){
    response.setHeader("myHeader","myHeader");
    return "设置Header成功";
}

规范

三层架构

表现层:展示数据结果和接收用户指令

业务逻辑层:负责处理业务逻辑数据

数据层:存储和管理与应用程序相关的数据

com.example.demo.controller:控制层(表现层),接收前端的请求 ,对请求进行处理 ,并响应数据

com.example.demo.service:业务逻辑层,处理具体的业务逻辑

com.example.demo.dao:数据访问层,也称为持久层,负责数据访问操作,增删改查

com.example.demo.model自定义类

命名规范

大驼峰UserController 名使用大驼峰

小驼峰userController 变量/方法名

蛇形user_controller 数据库字段

串行user-controller CSS

包名使用小写,每一个单词使用**.**分隔

相关推荐
程序边界2 小时前
NFS环境下数据库安装报错解析(上篇):一个诡异的"权限门"事件
后端
nashane2 小时前
HarmonyOS 6学习:界面布局“消消乐”——实战拆解组件遮挡与快照技术
深度学习·学习·harmonyos·harmony app
一叶飘零_sweeeet2 小时前
Spring AI 与 Spring AI Alibaba怎么选?
java·spring·spring ai
武子康2 小时前
大数据-272 Spark MLib-Spark MLlib 逻辑回归实战:二分类场景下的原理与代码实现
大数据·后端·spark
我登哥MVP2 小时前
【SpringMVC笔记】 - 8 - 文件上传与下载
java·spring boot·spring·servlet·tomcat·maven
IT_陈寒2 小时前
Vue的响应式更新把我坑惨了,原来问题出在这里
前端·人工智能·后端
_张一凡2 小时前
【大语言模型学习】2026年十大LLM训练数据集汇总
人工智能·学习·语言模型·aigc·大模型训练·llm数据集
dLYG DUMS2 小时前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
别具匠心3 小时前
嵌入式微型数据库-FlashDB
数据库·经验分享·笔记·学习·嵌入式实时数据库