目录
一、什么是springMVC
1.1springMVC定义:
模型(Model)
视图(View)
第一大类:服务器端的视图
第二大类:客户端的视图
springMVC的工作流程
1.2 MVC和springMVC之间的关系
二、学习SpringMVC的目标
2.1实现用户和程序之间的映射
使用@RequestMapping注解
关于方法的返回值
@RequestMapping注解的参数
2.2获取用户请求的参数
第一种:用户只传递一个参数的情况
第二种:传递多个参数的情况(本质上和单个一样的)
第三种方式:获取一个对象
第四种方式:JSON格式传递对象
第五种方式:后端参数的重命名@RequestParam
@RequestParam的required属性
第六种方式:从URL地址栏当中获取参数(不是URL的查询字符串)
第七种方式:文件上传
实际开发当中的文件上传
第一步:新建一个配置文件:application-dev.yml(开发环境的配置)和
(application-prod.yml)运行环境的配置
第二步:分别配置本地的文件路径(开发环境)和Linux的文件的路径(运行环境)
第四步:在方法当中传递一个参数:MultipartFile file,并且采用@RequestPart修饰
2.2获取request和response对象
2.3通过注解的方式来获取cookie和header
2.4获取session的方式
2.5关于响应(方法的返回值)
一、什么是springMVC
SpringMVC是一个web框架,这个框架是基于MVC思想和Servlet的API实现的一个Web框架。
1.1springMVC定义:
MVC是Model View Controller的缩写,它是软件工程中的一种软件架构模式,它把软件系统分为:
模型(Model)、视图(View)、控制器(Controller)三个部分。
模型(Model)
是应用程序当中用于处理应用数据逻辑的部分。通常情况下,模型对象用于负责在数据库当中存储数据。
视图(View)
是应用程序当中处理数据显示的部分,通常视图是依据模型数据创建的。
视图分为两大类:
第一大类:服务器端的视图
运行在服务器端的视图:负责解析数据和模板
第二大类:客户端的视图
运行在客户端的视图:负责展示实际的前端页面。
springMVC的工作流程
1.2 MVC和springMVC之间的关系
MVC是一种软件设计的思想,而springMVC是MVC思想的具体实现。
同时SpringMVC又是Spring框架当中的一个Web模块,它是随着Spring的诞生而存在的一个框架。
二、学习SpringMVC的目标
有下面的三个步骤:
步骤1:实现用户和程序的映射(在浏览器输入URL地址之后,能够在程序当中匹配到相应的方法);
步骤2:服务器端要得到用户请求的参数;
步骤3:服务器端要把结果返回给用户
下面,将分别介绍这三个步骤的具体实现:
2.1实现用户和程序之间的映射
使用@RequestMapping注解
这个注解可以作用于类上面,也可以作用于方法上面,但是一定要作用在方法上面。
当这个注解作用在类(Controller)上面的时候,意味着:当访问这一个类下面的所有方法的时候,请求的一级路径就是@RequestMappping(路径)。
二级路径:就是作用在方法上面的路径。
关于方法的返回值
当这一个方法
没有被@ResponseBody注解作用的时候:那么返回值将会是一个待跳转的页面。
如果被@ResponseBody注解作用的时候:那么返回值就是往页面回写的数据(相当于response.getWriter().write())
@RequestMapping注解的参数
@RequestMapping(method = RequestMethod.POST,value = "/get2")
method参数:可以指定是get,还是post,还是delete等等方法。
value参数:指的是访问的路径。
但是这个方法是一个枚举类型。
除了@RequestMapping以外,还可以使用@GetMapping、@PostMapping、@DeleteMapping等等的注解来处理请求。分别是:Get请求、Post请求、delete请求等等。
2.2获取用户请求的参数
第一种:用户只传递一个参数的情况
/**
* 用户提交的时候,只需要提交一个参数,也就是?后面跟着这一个参数
* 用户的id@param id
* user对象@return
*/
@RequestMapping("/getUserById")
@ResponseBody
public User getUserById(Integer id){
User user=new User();
user.setAge(18);
user.setId(id);
user.setPassword("123");
return user;
}
测试:
需要注意的是:括号内的参数一定要和前端传递的参数名称一致。如上图:"?"后面的id需要和方法当中的参数名称保持一致。
第二种:传递多个参数的情况(本质上和单个一样的)
/**
* 用户提交的时候,只需要提交一个参数,也就是?后面跟着这一个参数
* 用户的id@param id
* user对象@return
*/
@RequestMapping("/getUserById")
@ResponseBody
public User getUserById(Integer id,String password){
User user=new User();
user.setAge(18);
user.setId(id);
user.setPassword(password);
return user;
}
前端传递参数的时候,需要使用queryString的方式进行传参。 因此获取1个参数和多个参数的格式是一致的。
第三种方式:获取一个对象
当queryString特别多的时候,那么这样代码的可读性、可维护性就变得非常差。因此,可以考虑使用对象来接受。
/**
* 用户注册
* 用户实体@param user
* 注册成功的提示@return
*/
@RequestMapping("/register")
@ResponseBody
public String register(User user){
return "用户注册成功:"+user;
}
然后,前端提交信息的时候,只需要指定user的各个属性即可。
以上的几种方式,支持使用URL进行传递,也支持使用form表单进行实体提交。
第四种方式:JSON格式传递对象
在上面,我们演示了以queryString的格式来传递一个对象,下面,将演示以json的格式传递user对象。
需要在参数User前面加一个注解:@RequestBody
当使用这一个注解修饰参数的时候,那么这个参数将会被以json的格式进行提交。
/**
* 用户注册
* 用户实体@param user
* 注册成功的提示@return
*/
@RequestMapping("/register")
@ResponseBody
public String register(@RequestBody User user){
System.out.println(user);
return "用户注册成功:"+user;
}
运行结果:
@RequestBody当中也有一个参数是required,默认是true,前端必须要提交user对象,否则报400
如果把这个参数设置为false,那么前端就不一定需要提交user对象
第五种方式:后端参数的重命名@RequestParam
使用@RequestParam注解,当中指定的名称就是前端传递的参数。
/**
* 用户提交的时候,只需要提交一个参数,也就是?后面跟着这一个参数
* 用户的id@param id
* user对象@return
*/
@RequestMapping("/getUserById")
@ResponseBody
public User getUserById(@RequestParam("userId")Integer id, String password){
User user=new User();
user.setAge(18);
user.setId(id);
user.setPassword(password);
return user;
}
这种情况,用于前后端出现了差异的时候,后端为了改变参数列表的名称,改用的一种方式:
@RequestParam的required属性
@RequestMapping("/getUserById")
@ResponseBody
public User getUserById(@RequestParam(value = "userId",required = false)Integer id, String password){
User user=new User();
user.setAge(18);
user.setId(id);
user.setPassword(password);
return user;
}
如果使用@RequestParam注解的时候,不指定required参数,那么默认就是true,也就意味着前端一定要传递一个名称为"userId"的参数,否则就会报错。
只有改成了false,才不会令userId这个参数设置为"必传"的。
第六种方式:从URL地址栏当中获取参数(不是URL的查询字符串)
第一步:需要在@RequestMapping当中使用{}来指定参数;
第二步:需要在方法当中使用@PathVariable来修饰参数。
代码实现:
@RequestMapping("/url/{username}/{password}")
@ResponseBody
public User getFromUrl(@PathVariable String username,@PathVariable String password){
User user=new User();
user.setUserName(username);
user.setPassword(password);
return user;
}
运行结果:
第七种方式:文件上传
第一步:需要在方法当中传入一个参数,这个参数是:Multipart file,需要被注解@RequestPart修饰,其中@RequestPart的参数为前端传递的参数名字。
第二步:调用file的transferTo方法指定需要上传的路径+文件名称
代码实现:
@RequestMapping("/upImg")
@ResponseBody
public boolean upImg(Integer id, @RequestPart("img")MultipartFile file){
boolean flag=true;
try {
file.transferTo(new File("E://SpringLearning/img.png"));
} catch (IOException e) {
log.error("出问题了:"+e.getMessage());
flag=false;
}
return flag;
}
使用postMan的测试方式:
运行结果:
实际开发当中的文件上传
考虑到:实际项目运行的环境是Linux环境,但是我们项目开发的环境是本地的windows环境,二者存在一些路径上面的差异,因此,需要设置两种环境(通过配置文件设定)
第一步:新建一个配置文件:application-dev.yml(开发环境的配置)和
(application-prod.yml)运行环境的配置
注意事项:
开发的命名规则是:application-开发平台名称.yml;
运行的命名规则是:application-运行平台.yml
黑色加粗的字体一定要内容一致
第二步:分别配置本地的文件路径(开发环境)和Linux的文件的路径(运行环境)
开发环境:
运行环境:
总的配置文件(application.properties)当中需要指定开发环境还是运行环境:
此处指定是开发环境(dev)
第四步:在方法当中传递一个参数:MultipartFile file,并且采用@RequestPart修饰
需要在这个注解当中传递一个参数,这个参数为前端指定的file的名称。
并且获取文件的后缀名,在方法当中调用file.transferTo(new File("指定的文件路径"));
把文件上传到指定的路径。
/**
* 从配置文件当中读取图片的保存路径
*/
@Value("${img.path}")
private String imgPath;
@RequestMapping("/upImg")
@ResponseBody
public boolean upImg(Integer id, @RequestPart("img")MultipartFile file){
//获取到原始的文件名称
String fileName=file.getOriginalFilename();
//截取到文件名称的末尾,也就是.后面的内容
fileName=fileName.substring(fileName.lastIndexOf("."));
fileName= UUID.randomUUID() +fileName;
System.out.println(imgPath+fileName);
boolean flag=true;
try {
file.transferTo(new File(imgPath+fileName));
} catch (IOException e) {
log.error("出问题了:"+e.getMessage());
flag=false;
}
return flag;
}
2.2获取request和response对象
直接在controller的方法当中传递参数:HttpServletRequest和HttpServletResponse对象
然后就可以实现和servlet一样的功能。
/**
* 测试request和response对象
* 请求对象@param request
* 响应对象 response
* 回写的内容@return
*/
@RequestMapping("/get")
@ResponseBody
public String get(HttpServletRequest request, HttpServletResponse response){
String name=request.getParameter("name");
String password=request.getParameter("password");
return name+password;
}
总结:servlet有的功能,springMVC都会有。
2.3通过注解的方式来获取cookie和header
如果想要获取cookie,那么就要在方法当中加上一个注解:@CookieValue("cookie的名称")
和@RequestHeader("header的键的名称")
代码实现:
@RequestMapping("/getHeader")
@ResponseBody
public String getHeader(HttpServletRequest request,
@RequestHeader("User-Agent") String userAgent,
@CookieValue("Idea-8de7fbb3")String cookie){
HttpSession session=request.getSession(true);
session.setAttribute("123","123");
return "header:"+userAgent+";"+"cookie:"+cookie;
}
图解: (获取header信息)
2.4获取session的方式
有一种方式比较简单,直接调用request.getSession()方法获取session对象。
@RequestMapping("/getHeader")
@ResponseBody
public String getHeader(HttpServletRequest request){
//直接通过request来获取session对象
HttpSession session=request.getSession();
return (String) session.getAttribute("hello");
}
但是,也可以通过注解来获取session对象。
获取的方式就是:使用(@SessionAttribute("session对象的key") String userInfo)
@RequestMapping("/getUserInfo")
@ResponseBody
public String getSession(@SessionAttribute("userInfo") String userInfo){
return "value的值:"+userInfo;
}
这一步的含义就是:当前服务器当中只要存在一个session的对象为:(userInfo,Object),那么就会返回Object,否则就会抛出异常。
代码实现:
@RequestMapping("/getUserInfo")
@ResponseBody
public String getSession(@SessionAttribute("userInfo") String userInfo){
return "value的值:"+userInfo;
}
如果想避免以为不存在key而抛出异常,那么就需要把@SessionAttribute当中的required参数设置为false。
@RequestMapping("/getUserInfo")
@ResponseBody
public String getSession(@SessionAttribute(value = "userInfo",required = false) String userInfo){
return "value的值:"+userInfo;
}
2.5关于响应(方法的返回值)
默认情况下(也就是不添加@ResponseBody的情况下),方法的返回值是一个跳转的静态的页面。
但是如果在类的上面加一个注解@RestController,那么就相当于令两个注解同时作用:
@Controller+@ResponseBody。
文章来源:https://www.toymoban.com/news/detail-408935.html
三、请求转发和重定向的区别
3.1:关键字不一样
请求转发使用的关键字是forward,重定向的关键字是redirect文章来源地址https://www.toymoban.com/news/detail-408935.html
/**
* 请求重定向
* 以重定向的方式跳转到这个页面@return
*/
@RequestMapping("/redirect")
public String redirect(){
return "redirect:/index.html";
}
/**
* 请求转发
* 以请求转发的方式跳转到这个页面@return
*/
@RequestMapping("/forward")
public String forward(){
return "forward:/index.html";
}
到了这里,关于【springMVC篇1】初识springMVC的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!