一.简单认识Spring MVC

Spring Web MVC(简称 Spring MVC)是 Spring 框架的一个核心模块,专门用于开发基于 MVC 设计模式的 Java Web 应用. MVC是ModelViewController的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分

二.MCV设计模式

View(视图):指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.

Model(模型):是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分.

Controller(控制器):⽤来决定对于视图发来的请求,需要⽤哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。

三.学习MVC

1.建立连接:这一步就是将浏览器跟我们的Java程序连接起来,给他们一个地址,让他们可以访问到我们的Spring程序。

2.请求:用户请求的时候会带上一些参数,我们需要在程序中需要获取到这些参数。

3.响应:执行了对应的业务逻辑之后,我们将结果返回给用户。

1).建立连接

在Spring MVC 中使用 @Requestmapping 来进行URL的路由映射(起到浏览器连接程序的作用)

这个就是我们的启动类:其中SpringBootApplication是我们的启动类注解。

我们想要让浏览器连接到程序,需要创建一个类,使用@RequestMapping注解来映射Url

@RestController的核心作用是定义一个处理 Web 请求的控制器,并且控制器的所有方法默认直接返回数据,而非跳转视图页面。类加了注解@RestController,Spring才会看类里面的方法有没有加@RequestMapping这个注解。

这样我们的连接就做好了。接下来我们访问:http://127.0.0.1:8080/sayHi

得到如下页面:

@RequestMapping注解

这个注解是用来注册接口的路由映射的,路由映射就是当用户访问一个URL的时候,将请求对应到程序的某个类的某个方法的过程

当我们对@RequestController 进行注释掉的时候,我们重启服务。页面会显示404

@RequestMapping既可以修饰类,也可以修饰方法。

此时我们就需要访问 127.0.0.1:8080/User/sayHi

注:@RequestMapping注解中加不加入 / 都没问题,如果你没加入 / ,那么当Spring程序启动的时候会自行判断,当你没加入 / 的时候他会自动加入.

2).请求

那么当用户访问我们的程序的时候,是get请求还是post请求呢?我们通过Postman来发送请求:

我们使用了get请求和post请求,发现@RequestMapping都是支持的

传递单个参数

我们首先要创建一个带参的类:

使用postman来进行上传参数:

得到结果:

此时就是我们接收参数的步骤,要注意:postman上传的参数要与程序需要接受的参数名一样,当我们上传的参数名不对的时候,就无法得到结果:

用浏览器来操作是这样的:

访问  http://127.0.0.1:8080/User/sayHi?name=张三     我们就可以得带结果:

要注意:使⽤基本类型来接收参数时,参数必须传(除boolean类型),否则会报500错误

传递多个参数

得到结果:

注意:当有多个参数时,系统是按照参数名称来匹配的,所以我们传参的先后顺序不影响要获取的参数结果。

传递对象

创建一个Person类,属性有:name age gender,并且创建了相关的 get 和 set 方法,重写了toString方法,重写一个方法methon:

接下来我们访问一下这个方法:

得到结果:

得到结论:

后端程序正确拿到了Person对象⾥各个属性的值,Spring MVC可以⾃动实现对象参数的赋值,会根据参数名称⾃动绑定到对象的各个属性上。当然:如果传递的某个参数为空,那么会返回null:

例:,

后端参数重命名

例:当我们前端传入age参数的时候,而我们后端需要使用 newage ,此时我们就需要@RequestParam 注解:

传入参数:

得到结果:

注意:此时我们如果要传入 newage 参数而不是 age 参数,就会导致404

总结:当我们使用@RequestParam 注解进行重命名的时候,我们请求的参数就只能与@RequestParam  声明的注解一致 

使用 @RequestParam 注解进行重命名后,参数就成为了必传的参数,如果不传入参数会报400错误

非必传参数设置

@RequestMapping("/method1")
public String method1(@RequestParam("age") String newage){
    return "接收到参数newage=" + newage;
}

我们只需要在@RequestParam 里面添加 required = false 就行,此时我们再来测试一下程序:

可以得到返回值为null。

传递数组

    @RequestMapping("/method2")
    public String method2(String[] array){
        return Arrays.toString(array);
    }

发送请求:

传递JSON数据

JSON的语法

1.数据在键值对中(Key/Value)

2.数据用,分隔

3.对象用{ }表示

4.数组用[ ] 表示

5.值可以作为对象也可以做为数组,数组中可以包含多个对象

传递JSON对象

传递JSON对象需要使用 @RequestBody 注解,然后用Postman发送JSON请求:

    @RequestMapping("/method3")
    public Object method3(@RequestBody Person person){
        return person.toString();
    }

得到结果:

获取Url中的参数

    @RequestMapping("/method4/{name}/{age}/{gender}")
    public String method4(@PathVariable("name") String newname,
                           @PathVariable("age") Integer newage,
                           @PathVariable String gender){
    return newname+" "+newage+" "+gender;
    }

@PathVariable 注解:主要作⽤在请求URL路径上的数据绑定

如果我们想要对参数重命名的话,直接在PathVariable中设置就可以

获取cookie

    @RequestMapping("method6")
    public String method6(HttpServletRequest request, HttpServletResponse response){
        Cookie[] cookie = request.getCookies();
        StringBuilder builder = new StringBuilder();
        if (cookie != null){
            for (Cookie cook :cookie) {
                builder.append(cook.getName()+":"+cook.getValue());
            }
        }
        return builder.toString();
    }

手动对网页添加cookie:

运行后我们可以看到cookie的值已经返回:

HttpServletRequest request:获取客户端请求信息。
HttpServletResponse response:用于设置响应内容

Session存储

    @RequestMapping("/method7")
    public String method7(HttpServletRequest request){
        //获取当前请求的HttpSession对象,如果没有就创建一个新的Session
        HttpSession httpsession = request.getSession();
        if(httpsession != null){
            //从Session中读取key为name的属性值
            httpsession.setAttribute("name","张三");
        }
        return "session存储成功";
    }

Session读取

    @RequestMapping("/method8")
    public String method8(HttpServletRequest reqeust){
        HttpSession session = reqeust.getSession(false);
        String name = null;
        //判断session是否存在并且session里面是否有name值
        if(session != null && session.getAttribute("name") != null){
            //读取sesision里面的name值并且赋值给name
            name = (String) session.getAttribute("name");
        }
        return name;
    }

首先运行Session读取程序:通过fiddler我们可以看到:

JESSIONID是自动生成的 Session 标识 Cookie

运行Session读取程序之后,在页面就可以看到我们的name了:

简洁读取Session:

    @RequestMapping("/method9")
    public String method9(@SessionAttribute(value = "username",required = false) String username) {
        return "username "+username;
    }
    @RequestMapping("/method10")
    public String method10(HttpSession session) {
        String username = (String)session.getAttribute("username");
        return "username"+" "+username;
    }

获取Header

    @RequestMapping("/method11")
    public String method11(HttpServletRequest request,HttpServletResponse response){
        String Agent = request.getHeader("User-Agent");
        return Agent;
    }

页面显示结果:

User-Agent 是标准请求头

返回静态页面

@RestController
public class IndexTest {
    @RequestMapping("/method12")
    public Object method12(){
        return "/index.html";
    }
}

我们可以看到,页面的返回结果并不是我们想要跳转的页面,这是因为http并没有将 index/html识别为一个静态页面,我们需要将@RestController 改为 @Controller

@Controller
public class IndexTest {
    @RequestMapping("/method12")
    public Object method12(){
        return "/index.html";
    }
}

此时这个程序就可以返回我们的静态页面

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐