如何使用
建立连接
@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):
-
url资源路径
-
url查询字符串
-
header
-
请求正文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工具,不需要额外引入依赖
-
创建ObjectMapper对象
:
ObjectMapper objectMapper =new ObjectMapper(); -
对象转JSON :
writeValueAsString(对象名) -
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
包名使用小写,每一个单词使用**.**分隔