什么网站可以直接做word,哈尔版网站建设,代加工厂都不做网站,网站建设中最重要的是什么Spring MVC是基于Servlet API构建的原始Web框架。 MVC是Model View Controller的缩写即视图模型控制器#xff0c;是一种思想#xff0c;而Spring MVC是对该思想的具体实现。关于SpringMVC的学习我们需要掌握用户和程序的连接、获取参数以及返回数据三大部分。而这三大功能的… Spring MVC是基于Servlet API构建的原始Web框架。 MVC是Model View Controller的缩写即视图模型控制器是一种思想而Spring MVC是对该思想的具体实现。关于SpringMVC的学习我们需要掌握用户和程序的连接、获取参数以及返回数据三大部分。而这三大功能的实现离不开注解所以这里对这三个过程进行说明同时对在此过程中用到的注解进行总结。 文章目录 一、连接过程RequestMapping1.作用2.基本用法3.RequestMapping支持的请求连接类型验证4.接口特定请求类型设置方法1使用PostMapping注解2设置RestMapping并设置method属性 二、获取参数过程1.1.获取单个参数补充 1.1.获取多个参数RequestParam用法2.获取普通对象3.获取JSON对象——使用RequestBody接收4.从基础的URL中获取参数非参数位置而是path位置——使用PathVariable注解5.获取上传文件——使用RequestPart注解6.获取Cookie——使用CookieValue注解7.获取Header——使用RequestHeader注解8.获取Session——使用SessionAttribute注解session的存储没用注解session的获取 三、返回数据过程1.返回静态页面默认类型|不加RestContrlloer或ResponseBody2.返回非静态页面数据——加ResponsBody注解3.返回跳转/链接【forwardVSredirect】 一、连接过程
Spring MVC 中使⽤ 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//返回text/html
RequestMapping(/user)//一级路由注册
public class UserController {RequestMapping(/sayhi)//二级路由注册public String sayHi(){return hi;}
}启动后访问对应的url地址 接下来详细介绍RequestMapping用法
RequestMapping
它是spring web应用程序中最常被用到的注解之一。
1.作用
作用注册接口的路由映射。路由映射是指用户访问一个url将用户的请求对应到应用程序中某个方法的过程。
2.基本用法
它可以修饰类也可以修饰方法。 修饰类和方法时修饰的地址时类方法。参考上边的例子 直接修饰方法 import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;Controller
ResponseBody
public class UserController2 {RequestMapping(/user2/sayhi)//二级路由注册public String sayHi(){return hi;}
}注意无论是Controller还是ResponseBody都不可省略
原因如下 这个类必须随着spring的加载而加载别人才能通过注册的路由访问到它。 ResponseBody用来修饰类或者方法。修饰类时类中所有的方法都返回html或者json而不是视图。如果时字符会转换成tex/html如果是对象会转换成applicaiton/json返回给前端。 另外这两个注解还可以替换成RestContrlloerRestContrlloerResponseBodyController。他是一个组合注解
3.RequestMapping支持的请求连接类型验证
是支持所有的还是支持特定的请求下边我们进行验证。
首先它默认支持的肯定是get请求因为我们在浏览器上输入url地址敲下回车其实就是get我们可以通过抓包来验证
使用刚刚的sayhi方法 其次它也支持post请求我们可以通过postman抓包进行验证
在测试post请求之前我们先再做一次get POST
显然可以得出RequestMapping也是支持post请求的。
最后我们也可以实验别的请求发现它也是可以支持的
这里不再一一演示。
4.接口特定请求类型设置方法
当领导一刀切要求必须只支持某一种方法怎么设置
通过查看源码结合注释及官网我们可以知道一共有两种设置方法这里我们使用post请求为例
1使用PostMapping注解 抓包验证 与之类似的对应的get方法有GetMapping注解
2设置RestMapping并设置method属性
看RestMapping源码我们可以知道它有一个属性叫做method类型是枚举数组而枚举的值恰巧是请求的方法类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aCjWoEZ3-1684133790636)(F:\typora插图\image-20230510085015006.png)] 补充 1.很容易知道value和name意思是一样的 2.consume和produces是用来进行路由筛选的一个用于设置只有特定请求才能访问到一个用于只能返回特定类型的数据用的比较少了解即可。 这样我们就可以将其设置成post
RestController//ControllerResponseBody
RequestMapping(/user)
public class UserController {RequestMapping(/sayhi)public String sayHi(){return hi;}RequestMapping(value /sayhi2,method RequestMethod.POST)public String sayHi2(){return hi;}
}[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QcEqd1ke-1684133790637)(F:\typora插图\image-20230510085437563.png)\
另外我们也可以通过抓到的包看显示请求类型是否是Post来验证 很容易看出来是的所以这种设置方法可行。
二、获取参数过程
获取参数需要我们后端代码这里有接受的容器其实也就是我们方法的设置上要有形参所以获取参数的问题其实也就是形参的设置。
1.1.获取单个参数
我们之前怎么传形参这里其实就怎么传。
package com.example.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;//Controller//类注解
//ResponseBody//返回非视图
RestController//ControllerResponseBody
RequestMapping(/user)
public class UserController {RequestMapping(/gp)public String getParam(String name){return name;}
}注意 拿到单个参数前提是形参和传的参数名一定要相同 不传参数返回的是默认值.所以推荐参数传递时不要使用基础类型数据 那么这里其实就涉及到一个基础类型和非基础类默认值的问题了对于基础类型不传参数会直接报错对于非基础类型不传参数返回的是null引用类型默认值是null 验证 package com.example.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;//Controller//类注解
//ResponseBody//返回非视图
RestController//ControllerResponseBody
RequestMapping(/user)
public class UserController {RequestMapping(/gp)public String getParam(String name){return name;}RequestMapping(/gp1)public String getParam(Integer id){return id;}RequestMapping(/gp2)public String getParam(int id){return id;}
}补充 内置隐藏参数:request和reponse对象【了解】 当项目启动时spring mvc会自动帮我们把请求和相应对象赋值给他们 package com.example.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
RestController//ControllerResponseBody
RequestMapping(/user)
public class UserController {RequestMapping(/gp3)public String getParam(HttpServletRequest request,HttpServletResponse response) throws IOException {response.sendRedirect(http://www.javacn.site);return hi;}
}1.1.获取多个参数
RequestMapping(/gp4)
public String getParam(String name,String password) {return name:password;
}注意1. 当有多个参数时前后端进⾏参数匹配时是以参数的名称进⾏匹配的因此参数的顺序是不影响后端获取参数的结果
RequestParam用法
特殊情况下前端传递参数和后端接收参数名不同可以使用RequestParam重命名前后端参数值完成后端参数映射。
使用方法
RequestParam(前端参数名) xxx xxx(后端参数名)
RequestMapping(/gp5)
public String getParam5(RequestParam(username) String name) {return name;
}除了上述基本用法它还可以完成必传参数和非必传参数的设置
我们可以看以下它的源码他是通过required这个字段来完成这个功能的。当required值为true时不传此参数就会报错400错误当它为false时不传也没有关系。 默认情况下参数既然有是必须传递的。
说明使用这个注解是一种特殊的场景即前后端参数不一致时它不是一种获取参数的类型。
2.获取普通对象
传递方式和多个参数一样顺序不重要但是名称必须写对如果传的参数不对或者名字传错了就会返回默认值。
因为框架会通过名称帮我们完成了自动参数映射并且根据返回的结果帮助我们返回恰当的封装对象。
package com.example.demo.entity;import lombok.Data;Data
public class UserInfo {private int id;private String name;private String password;private int age;
}//获取对象
RequestMapping(/reg)
public Object getParam9(UserInfo userInfo){return userInfo;
}通过抓包我们可以看出来这里是返回了json对象 再比如我们使用h1标签那么框架就会返回html形式的结果
//返回结果
RequestMapping(/reg1)
public Object reg1(UserInfo userInfo){return h1userInfo/h1;
}两种方式①使用传递多个参数的形式②把表单封装成一个对象使用对象去获取。框架帮助自动映射。
3.获取JSON对象——使用RequestBody接收 不加注解获取不到 //获取json对象(通过请求体获取json对象)
RequestMapping(/reg2)
public Object reg2(RequestBody UserInfo userInfo){return userInfo;
}4.从基础的URL中获取参数非参数位置而是path位置——使用PathVariable注解
//从基础的url中获取参数
//花括号里填的变量的名字注意这里对位置是敏感的
RequestMapping(/reg3/{name}/{pwd})
public Object reg3(PathVariable String name,PathVariable(required false,name pwd) String password){return name:password;
}注意1. 对位置敏感
使用频率不高但也有自己的应用场景。例如详情页注解中name支持重命名required支持可不传递参数注解位置不同PathVariable和RequestParam使用前者是获取之前的参数后者是获取之后的参数具体看参数约定、公司要求和业务场景。
5.获取上传文件——使用RequestPart注解
这个还是比较常用的比如上传头像
//获取上传文件
RequestMapping(/myupload)
public Object upload(RequestPart(myimage)MultipartFile file){File saveFilenew File(F://test//myimage.png);try {file.transferTo(saveFile);return true;} catch (IOException e) {e.printStackTrace();}return false;
}这里使用postman去模拟 注意
这里的参数必须使用MultipartFile类型接收。因为他里边有transfer方法可以直接把上传过来的文件流保存为图片。如果文件太大了可能上传失败需要在配置文件中重新配置最大文件大小,max-file-size具体配置项看官方配置文件。RequestPart中的参数传的
但是这个代码存在一个问题是不能上生产线的——后面上传的文件会覆盖前边上传的。
解决思路文件的名称不能重复——使用Java里边的UUID通用唯一id。他是时间戳随机数电脑的mac地址随机种子。文件格式可能会不同所以还需要得到原生的后缀名。
这里使用file的获取文件名的方法然后使用substring获得后缀。
//获取上传文件可以上生产线的代码
RequestMapping(/myupload2)
public Object upload2(RequestPart(test)MultipartFile file){String fileName UUID.randomUUID()file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(.));File saveFilenew File(F://test//fileName);try {file.transferTo(saveFile);return true;} catch (IOException e) {e.printStackTrace();}return false;
}补充目录和文件名都不写死 //获取文件3目录和文件名都不写死
public Object upload3(RequestPart(test)MultipartFile file) throws IOException {String contextNamenew ClassPathResource().getFile().getAbsolutePath();String fileName UUID.randomUUID()file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(.));File saveFilenew File(contextNamefileName);try {file.transferTo(saveFile);return true;} catch (IOException e) {e.printStackTrace();}return false;
}6.获取Cookie——使用CookieValue注解
获取方式①使用之前servlet方式有隐藏参数之前已经提到②使用注解比较简洁。这里使用第二种
这里注解的参数有两个值其中value取决于我们cookie里边的值这里前端可能没有传递所以我们这里required设置成false
//获取cookie
RequestMapping(/getck)
public Object getck(CookieValue(value java,required false)String java){return java;
}这里因为前端没有传递过来有java的cookie所以我们这里伪造一个cookie。伪造方法在浏览器界面f12,点击cookie 7.获取Header——使用RequestHeader注解
也有两种方式①使用request对象②使用注解
代码示例获取host
//获取Header
RequestMapping(gethd)
public Object getHeader(RequestHeader(Host)String ht){return ht;
}可以看到这个注解的参数里边还是有前端的名字
8.获取Session——使用SessionAttribute注解
要获取session我们必须先存
session的存储没用注解
存储方式还是之前servlet的方式
private static final String SESSION_KEYUSERINFO_SESSIONKEY;
RequestMapping(setsess)
public void setsess(HttpServletRequest request) {HttpSession session request.getSession(true);if(session!null){session.setAttribute(SESSION_KEY,zhangsan);}
}session的获取
使用注解SessionAttribute
//获取Session
RequestMapping(getsess)
public Object getSession(SessionAttribute(SESSION_KEY)String name){return session:name;
}系统项的配置
三、返回数据过程
1.返回静态页面默认类型|不加RestContrlloer或ResponseBody !DOCTYPE html
html langen
headmeta charsetUTF-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1.0titleDocument/title
/head
bodyh1返回参数测试/h1
/body
/htmlpackage com.example.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;Controller
RequestMapping(test)
public class TestController {RequestMapping(/index)public Object getIndex(){return /index.html;}
}注意加斜杠表示从根目录访问不加表示在当前路径寻找。
路径问题可以通过抓包访问
默认请求转发
2.返回非静态页面数据——加ResponsBody注解
可能是json对象或者其他框架会自动进行映射。这里以json对象为例
//返回json对象
RequestMapping(/reg2)
public Object reg2(RequestBody UserInfo userInfo){return userInfo;
}3.返回跳转/链接【forwardVSredirect】 用的不多但主要看业务需求。 请求转发(forward)和请求重定向(redirect)是常见面试题 这部分跟注解关系不大但是面试却很重要所以单独总结。