Spring Web MVC

目录

一,MVC/Spring MVC

二,学习Spring MVC

1,@RequestMapping

2,GET/POST请求均支持

3,传参介绍

(1)单个传参

(2)传递多个参数

(3)传递对象

(4)后端参数重命名:@RequestParam

(5)传递数组

(6)传递集合

(7)传递JSON数据

(8)获取URL中的参数@PathVariable

​编辑​编辑(9)上传文件

(10)获得Cookie/Session

(11)获取Header

三,响应

1,返回静态页面:

2,返回Html代码片段

3,返回JSON

4,设置状态码

5,设置Header

(1)法一:@RequestMapping的属性来设置

(2)法二:HttpServletResponse

6,设置Cookie


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

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值