- SpringMVC介绍
- MVC设计模式
- MVC使用举例
- 作用1:实现用户请求和程序关联
- @RequestMapping注解
- 修饰类+方法
- 只修饰方法
- post请求还是get请求
- @GetMapping 和 PostMapping
- 作用2:得到用户的参数
- 单个参数
- 多个参数-通过对象的方式
- 参数重命名(参数映射)
- @PathVariable
- @RequestPart
SpringMVC全称是Spring Web MVC
,是基于Servlet API构建的原始Web框架。Spring MVC是Spring的一个核心模块,专门用来处理和web相关的 *** 作,所以是一个Web框架,基于Servlet API进行构建。
- Spring MVC是Spring的一个核心模块
- Spring MVC是一个轻量级的Web框架
- Spring MVC继承于Servlet API.
MVC全称是Model View Controller
,即模型视图控制器.这是一种工程软件中常用的架构模式,是一种思想,而SpringMVC是这种思想的具体实现。
三个部分:
- Model(模型):应用程序中控制数据的部分,通常模型对象负责在数据库中存取数据。
- View(视图):应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
- Controller(控制器):应用程序中控制与用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,然后像模型发送数据。
总结:Spring MVC是一个实现了MVC思想,继承了Servlet API的Web框架,是Spring的一个核心模块。
MVC使用举例我们创建一个UserController类,然后在浏览器中输入URL映射到这个类中,输入一些信息。
package com.example.demo.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {
@RequestMapping("/hi")
public String sayHi(){
return "Hello,Spring MVC.";
}
}
在SpringMVC项目中,默认return返回的是一个页面,如果不想要返回页面,可以添加@ResponseBody注解,定义返回的数据格式非页面,即非视图(html/text)。
在浏览器中访问:
在MVC中通过 @RequestMapping注解来注册接口的路由映射。
修饰类+方法路由映射:所谓的路由映射指的是,当用户访问一个URL时,将用户的请求对应到程序的某个类的某个方法中。
@RequestMapping即可修饰类,也可以修饰方法,当修饰类和方法时,在浏览器中访问的url是:类+方法
在UserController类中添加类访问路径class,方法访问路径method:
package com.example.demo.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
@RequestMapping("/class") //注解类
public class UserController {
@RequestMapping("/method") //注解方法
public String sayHi(){
return "访问的url是类加方法";
}
}
在浏览器中访问:
@RequestMapping只修饰方法时,url只有方法。
package com.example.demo.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
public class UserController {
@RequestMapping("/hi")
public String sayHi(){
return "this is a message.";
}
}
进行访问:
@RequestMapping默认支持的是Get请求。但也可以在代码中指定接受Post请求:
package com.example.demo.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
@RequestMapping("/p")
public class UserController {
@RequestMapping(value="/message",method= RequestMethod.POST)
public String sayHi(){
return " 这是一条来自post请求的信息.";
}
}
@GetMapping 和 PostMapping
指定Get请求的url的写法:
//写法1:
@Requestmapping("/message")
//写法2:
@RequestMapping(value="/message",method = RequestMethod.GET)
//写法3:
@GetMapping("/message")
指定Post请求的url的写法:
// 写法1
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 写法2
@PostMapping("/index")
@RequestMapping在不指定任何参数的情况下,即只设置了路由地址时,此方法是即支持Get请求又支持Post请求的。
当给@RequestMapping设置了method属性之后,那么它只能支持设置的请求类型,其他类型会报错(405)。
@GetMapping 和PostMapping,在不设置路由的情况下,两者是和@RequestMapping作用相同的,只不过一个只支持get请求方法,另一个支持post请求方式,且这两个Mapping注解只能修饰方法,不能修饰类。
作用2:得到用户的参数 单个参数@GetMapping("/reg")
public String reg(String name){
return "注册成功:"+name;
}
多个参数-通过对象的方式
在UserController类中如下方法,用户可以通过url映射到reg方法,然后reg方法会返回一个对象
@GetMapping("/res")
public Object reg(User user){
return user;
}
User类中:
package com.example.demo.model;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class User {
private String name;
private int age;
private String password;
private int sex;
//..其他所有参数
}
前端传递参数时,可以对应User类中的参数,一次传入多个:
当前端传入的参数名称与后端不匹配时,会导致接收不到参数的情况:
前端传入time,后端用createtime接受:
@GetMapping("/res")
public String setTime(String createtime){
//do something....
return "时间:"+createtime;
}
接收不到参数:
此时就可以通过重映射的方式,将前端的参数名映射到后端参数名称,这样在后端代码量非常大,不便修改时可以很轻松的解决问题:
@GetMapping("/res")
public String setTime(@RequestParam("time") String createtime){
//do something....
return "时间:"+createtime;
}
成功接收参数:
当我们用@RequestParam重映射了一个参数后,这个参数就不可以为空,为必传参数,如果为空,会抛出错误:
如果想要设置这个参数可以为空,不是非必传参数,可以修改required属性:
默认是true,必传,改为false,可为空。
@GetMapping("/res")
public String setTime(@RequestParam(value="time",required = false) String createtime){
//do something....
return "时间:"+createtime;
}
@PathVariable
通常情况下我们前端的参数都是通过form表单的形式传递给后端,而不是在url中获取,但有些情况下,为了增加搜索权重,我们会在url中直接获取参数:
@GetMapping("/p/{name}/{age}")
public String urlParam(@PathVariable String name,@PathVariable Integer age){
return "姓名:"+name+",年龄:"+age;
}
通过注解@PathVariable,将参数对应到具体内容,其功能是:接收请求路径中占位符的值
输入:
@RequestPart
主要用来处理content-type为 multipart/form-data 或 multipart/mixed stream 发起的请求,可以获取请求中的参数,包括普通文本、文件或复杂对象比如json、xml等,针对json等复杂对象,需要明确对应的content-type。
@RequestMapping("/file")
public String upload(@RequestPart("myfile") MultipartFile file){
//1.上传文件目录(从配置文件中读取)
String basePath=uploadPath;
//2.生成动态文件名(包含后缀)xxx.jpg
String fileName= UUID.randomUUID()+(file.getOriginalFilename().substring(file.getOriginalFilename().indexOf(".")));
//保存文件
try {
file.transferTo(new File(basePath+fileName));
} catch (IOException e) {
e.printStackTrace();
}
return "上传成功!";
}
在postman中进行访问,成功上传:
在对应的C盘log目录下成功出现文件:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)