Spring Web MVC 入门
一.简单认识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";
}
}
此时这个程序就可以返回我们的静态页面
![]()
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)