目录
Tomcat是Apache下的一个web服务器,Web服务器就是对HTTP协议进行封装,使程序员不需要直接对协议进行操作,Spring以及集成,idea集成了Maven,8080是Tomcat的默认端口号
Spring WebMVC是基于ServletAPI构建的原始Web框架,从⼀开始就包含在Spring框架中。它的 正式名称“SpringWebMVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC"(Servlet是一种实现动态页面的技术,准确地来说Servlet是一套Java Web开发的规范,只是规范并不能做任何事情,需要有人去实现它,tomcat,jetty等进行了实现,他们称之为“servlet容器”)SpringBoot是springMVC的一种实现方式
一,MVC/Spring MVC
MVC(Model View Controller): MVC是⼀种架构设计模式,也是⼀种思想
Spring MVC:是对MVC思想的具体实现.除此之外, Spring MVC还是⼀个Web框架
二,学习Spring MVC
1,@RequestMapping
它是⽤来注册接⼝的路由映射的.(路由映射:当⽤⼾访问⼀个URL时,将⽤⼾的请求对应到程序中某个类的某个⽅法的过程就叫路由映射)
既是一个类注解,也是方法注解,访问路径=类路径+方法路径
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/p1")
public String p1( String name){
return "接收到参数name" +name;
}
}
上述代码的访问路径为:http://127.0.0.1:8080/param/p1
2,GET/POST请求均支持
(1)如果想要指定某种方法,可以给@RequestMapping添加method属性
@RequestMapping(value = "/say" ,method = RequestMethod.GET)
//建立连接,方法路径,只接受get请求
public String hello(){
return "hello String";
}
@RequestMapping(value = "/v3" ,method = RequestMethod.POST)
//建立连接,方法路径,只接受post请求
public String v3(){
return "hello v3";
}
(2)注解@GetMapping/@PostMapping
@GetMapping("v2")
public String v2(){
return "hello v2";
}
@PostMapping("/v4")
public String v4(){
return "hello v4";
}
3,传参介绍
(1)单个传参
@RestController
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/p1")
public String p1( String name){
return "接收到参数name" +name;
}
}
@RestController
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/p2")
public String p2( Integer age){
return "接收到参数age" +age;
}
@RequestMapping("/p3")
public String p3( int age){
return "接收到参数age" +age;
}
}
当接受类型为Integer,且不传参的的时候,会返回null:
但是如果接受类型为int,且不传参的的时候,就会报状态码为:500
所以企业开发中,对于参数可能为空的数据,建议使⽤包装类型
(2)传递多个参数
@RequestMapping("/p4")
public String p4( String name,Integer age){
return "接收到参数name:"+ name+" "+"接收到参数age:" +age;
}//参数的传参顺序不受影响,因为源代码是下方代码,spring是将servlet再次进行封装
@RequestMapping("/p41")
public String p41(HttpServletRequest request){
String name=request.getParameter("name");
Integer age=Integer.valueOf(request.getParameter("age"));
return "接收到参数name:"+ name+" "+"接收到参数age:" +age;
}
参数的传参顺序不受影响,spring是将servlet再次进行封装.p4方法的底层逻辑为p41方法,由p41方法可知参数传参的顺序是不受影响的
(3)传递对象
public class User {
private String name;
private Integer age;
private Integer sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
@RequestMapping("/p6")
public String p6(User user){
return "user:"+user;
}
这里可以缺少参数,因为成员变量有默认值
(4)后端参数重命名:@RequestParam
@RequestMapping("/p7")
public String p7(@RequestParam(value = "userName" ) String name){
return "接收到参数name:"+ name;
}
@RequestMapping("/p71")
public String p7(@RequestParam(value = "userName" ,required = false) String name){
return "接收到参数name:"+ name;
}
可以看到 required 的默认值为true,表⽰含义就是:该注解修饰的参数默认为必传,既然如此,我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错
(5)传递数组
@RequestMapping("/p8")
public String p8(String[] arr){
return "arr:"+ List.of(arr);
}
(6)传递集合
如果接受的参数为List时,传list=第一,第二,第三,会自动被封装为数组,所以要进行参数的绑定(将数组转化成list)
@RequestMapping("/p9")
public String p9(@RequestParam List<String> list){
return "list:"+ list;
}
(7)传递JSON数据
JSON语法(一种数据交互格式):
1. 数据在 键值对 (Key/Value) 中
2. 数据由逗号 , 分隔
3. 对象⽤ { } 表⽰
4. 数组⽤ [ ] 表⽰
5. 值可以为对象,也可以为数组,数组中可以包含多个对象
JSON字符串和Java对象互转
objectMapper.writeValueAsString(对象);
objectMapper.readValue(s,类名);
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper=new ObjectMapper();
User user=new User();
user.setName("lisi");
user.setAge(12);
user.setAge(1);
//对象转换JSON
String s=objectMapper.writeValueAsString(user);
System.out.println(s);
//JSON转换为对象
User user1=objectMapper.readValue(s,User.class);
System.out.println(user1);
//json就是一个字符串,
}
JSON优点:
1. 简单易⽤:语法简单,易于理解和编写,可以快速地进⾏数据交换
2. 跨平台⽀持: JSON可以被多种编程语⾔解析和⽣成,可以在不同的平台和语⾔之间进⾏数据交换和 传输
3. 轻量级:相较于XML格式,JSON数据格式更加轻量级,传输数据时占⽤带宽较⼩,可以提⾼数据传输 速度
4. 易于扩展: JSON的数据结构灵活,⽀持嵌套对象和数组等复杂的数据结构,便于扩展和使⽤
5. 安全性:JSON数据格式是⼀种纯⽂本格式,不包含可执⾏代码,不会执⾏恶意代码,因此具有较⾼的安全性
用JSON对象传,需要@RequestBody这个的注解,请求正文,在正文中去取到数据
@RequestMapping("/p10")
public String p10(@RequestBody User user){
return "user:"+user;
}
(8)获取URL中的参数@PathVariable
@RequestMapping("/article1/{articleID}")
public String p11(@PathVariable String articleID){
return "article:"+articleID;
}
#重命名
@RequestMapping("/article2/{articleID}")
public String p12(@PathVariable("articleID") String ID){
return "article:"+ ID;
}
@RequestMapping("/article3/{articleID}/{name}")
public String p13(@PathVariable("articleID") String ID,
@PathVariable String name){
return "article:"+ ID+", name:"+name;
当别名与名称不一样时,需要额外标注,如果一致,就不需要重复书写
}

(9)上传文件
@RequestPart 用于文件的重命名
@RequestMapping("/p14")
public String p14 ( @RequestPart("filename") MultipartFile file){
System.out.println(file.getOriginalFilename());
return "文件名称"+file.getOriginalFilename();
}
(10)获得Cookie/Session
Cookie是客户端的,Session是服务器端的
Session本质上就是一个哈希表,储存了一些键值对结构,key就是SessionId,Value就是用户信息
Cookie 和Session的区别:
• Cookie是客户端保存⽤户信息的⼀种机制.Session是服务器端保存用户信息的⼀种机制.
• Cookie和Session之间主要是通过SessionId关联起来的,SessionId是Cookie和Session之间的 桥梁
• Cookie和Session经常会在⼀起配合使⽤.但是不是必须配合.
• 完全可以⽤Cookie来保存⼀些数据在客⼾端.这些数据不⼀定是用户⾝份信息,也不⼀定是SessionId
• Session中的sessionId也不需要⾮得通过Cookie/Set-Cookie传递,⽐如通过URL传递.
#获得Cookie#
#法一:
@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest request){
Cookie[] cookies=request.getCookies();
if (cookies!=null){
for (Cookie cookie:cookies){
System.out.println(cookie.getName()+":"+cookie.getValue());
}
}
return "获取Cookie成功";
}
#法二:
@RequestMapping("/getCookie2")
public String getCookie2(@CookieValue("name") String name){
return "从Cookie中获取信息,name:"+name;
}
这句代码的底层逻辑是从Cookie中获取SessionID,根据SessionID来获得session对象
getSession(true),如果session对象为空,就会创建一个空Session
getSession(false),如果Session对象为空,不会创建对象session
getSession的默认值为true
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request){
HttpSession session=request.getSession();
session.setAttribute("userName" ,"zhangSan");
session.setAttribute("userAge",15);
return "设置Session成功";
}
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request){
HttpSession session=request.getSession();
//session是一个类似于map的结果
if (session==null){
return null;
}else {
String UserName=(String) session.getAttribute("userName");
System.out.println(session.getAttribute("userAge"));
return "从session中获取信息,UserName:" +UserName;
}
}
@RequestMapping("/getSession2")
public String getSession2(HttpSession session){
String UserName=(String) session.getAttribute("userName");
System.out.println(session.getAttribute("userAge"));
return "从session中获取信息,UserName:" +UserName;
}
@RequestMapping("/getSession3")
public String getSession3(@SessionAttribute("userName") String userName ){
return "从session中获取信息,UserName:" +userName;
}//如果UserName为空,则不会进入后端程序,直接报400
Session默认存储在内存中,如果重启服务器则Session数据就会丢失
(11)获取Header
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){
String userAgent =request.getHeader("User-Agent");
return "User-Agent:"+userAgent;
}
@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String userAgent){
return "User-Agent:"+userAgent;
}
三,响应
1,返回静态页面:
这里不能使用@RestController,因为@RestController=@Controller+@ResponseBody,后者注解是返回数据,一开始的注解是@Controller,这时前端后端是在一起的,所以直接return 某个页面就可以,但是逐渐,前端和后端分开,后端只负责传输数据,前端收到数据然后根据数据返回对应的画面,所以这时就引入了@ResponseBody,.定义返回的数据格式为⾮视图,所以上述代码如果使用@RestController收到的只是return里面的字符串.
@ResponseBody既是类注解,又是方法注解,加在类上,表示该类所有的方法都是返回数据,如果加在方法上,表示该方法返回数据,其他方法不受影响
注意:状态码404,原因有两个,(1)URL写错了(2)注解写错了(比如将@RestController写成了@Controller就会报错,因为找不到该字符串所代表的的资源页面)
2,返回Html代码片段
直接在代码中写Html代码就可以了
3,返回JSON
当返回的是对象的时候,默认返回的就是JSON
4,设置状态码
状态码并不影响界面的展示
5,设置Header
该部分设置的是响应里面的header
(1)法一:@RequestMapping的属性来设置
1. value: 指定映射的URL
2. method:指定请求的method类型,如GET,POST等
3. consumes:指定处理请求(request)的提交内容类型(Content-Type),例如application/json, text/html;
4. produces: 指定返回的内容类型,还可以同时设置返回值的字符编码
5. Params:指定request中必须包含某些参数值时,才让该⽅法处理
6. headers: 指定request中必须包含某些指定的header值,才能让该⽅法处理请求
@ResponseBody
@RequestMapping(value = "/setHeader",produces = "application/json")
public String setHeader(){
return "{\"success\":true}";
}
(2)法二:HttpServletResponse
@ResponseBody
@RequestMapping(value = "/setHeader2")
public String setHeader2(HttpServletResponse response){
response.setHeader("success","true");
return "success";
}
6,设置Cookie
@RequestMapping("/setCookie")
public String setCookie(HttpServletResponse response){
Cookie cookie=new Cookie("key","value");
response.addCookie(cookie);
return "success";
}