文章目录
服务器端要得到用户的请求参数
@DatapublicclassUserInfo{privateint id;privateString username;privateString password;privateint age;}
1. 获取单个参数
注意这里的参数类型要用 包装类,否则传一个空的值就会出错, 并且这里的参数一定要和前端传递的参数名保持一致,否则就获取不到参数的值了
@Controller@ResponseBody// 作用: 表示的是返回一个非静态页面的数据@RequestMapping("/user")// 类上的 RequestMapping 可以省略publicclassUserController{@RequestMapping("/getuserbyid")publicUserInfogetUserById(Integer id){//两种命名方式 getUserById | findUserById// 不查数据库,伪代码,返回用户对象UserInfo userInfo =newUserInfo();
userInfo.setId(id);
userInfo.setUsername("张三");
userInfo.setAge(18);return userInfo;}}
2. 获取多个参数
@Controller@ResponseBody// 作用: 表示的是返回一个非静态页面的数据@RequestMapping("/user")// 类上的 RequestMapping 可以省略publicclassUserController{@RequestMapping("/login")publicStringlogin(String username,String password){return"用户名: "+ username +" | 密码: "+ password;}}
3. 获取对象
如果要获取的参数很多的话,也可以按照第二种方法来写,但是从代码的美观和维护角度来看,就不太建议这样来写了
Spring MVC 可以自动实现参数对象的赋值
@Controller@ResponseBody// 作用: 表示的是返回一个非静态页面的数据@RequestMapping("/user")// 类上的 RequestMapping 可以省略publicclassUserController{@RequestMapping("/reg")publicStringreg(UserInfo userInfo){return"用户信息:"+ userInfo;}}
4. 后端参数重命名 @RequestParam
有些特殊情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传递了一个 time 给后端,而后端又是用 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值
@Controller@ResponseBody// 作用: 表示的是返回一个非静态页面的数据@RequestMapping("/user")// 类上的 RequestMapping 可以省略publicclassUserController{@RequestMapping("/login")publicStringlogin(@RequestParam(value ="name", required =false)String username,String password){return"用户名: "+ username +" | 密码: "+ password;}}
5. 接收 JSON 格式的数据 @RequestBody
服务器端实现 JSON 数据的接收需要使用 @RequestBody 注解
@Controller@ResponseBody// 作用: 表示的是返回一个非静态页面的数据@RequestMapping("/user")// 类上的 RequestMapping 可以省略publicclassUserController{@RequestMapping("/reg")publicStringreg(@RequestBodyUserInfo userInfo){return"用户信息:"+ userInfo;}}
6. 从 URL 地址中获取参数 @PathVariable
@Controller@ResponseBody// 作用: 表示的是返回一个非静态页面的数据@RequestMapping("/user")// 类上的 RequestMapping 可以省略publicclassUserController{@RequestMapping("/hero/{id}/{name}")publicStringgetHeroInfo(@PathVariableString id,@PathVariableString name){return"ID:"+ id +" | Name: "+ name;}}
7. 上传文件 @RequestPart
@Slf4j@Controller@ResponseBody// 作用: 表示的是返回一个非静态页面的数据@RequestMapping("/user")// 类上的 RequestMapping 可以省略publicclassUserController{@RequestMapping("/upimg")publicbooleanupImg(Integer uid,@RequestPart("img")MultipartFile file){boolean result =false;// 保存图片到本地目录try{
file.transferTo(newFile("D:/IDEA/img.png"));
result =true;}catch(IOException e){
log.error("上传图片失败: "+ e.getMessage());}return result;}}
文件上传,这样还有一个问题,这里上传文件到的目录是写为固定了的,那么比如说张三上传图片到这个位置,李四上传另一个图片也是到这个位置,李四的图片就会把张三的图片覆盖了,所以说就会有这样的一个问题
针对这个问题可以对上面的代码进行改进,主要就是这三个方面
(1)解决目录问题:不同平台的配置文件设置
比如说在开发环境,需要将上传的文件保存到这个目录,但在生产环境中又需要将文件保存到 Linux 中的某个目录上,如果在开发时写了很多个需要上传文件的目录,那么到项目上线时,需要修改到 Linux 目录,是极为麻烦的,所以这就需要进行不同平台的配置文件设置
application-dev.yml
# 开发环境的配置文件
# 图片保存的路径
img:
path:D:/IDEA/
application-prod.yml
# 生产环境的配置
# 图片保存的路径
img:
path:/root/img/
application.yml
# 设置配置文件的运行平台
spring:
profiles:
active: dev
UserController.java
@Slf4j@Controller@ResponseBody// 作用: 表示的是返回一个非静态页面的数据@RequestMapping("/user")// 类上的 RequestMapping 可以省略publicclassUserController{// 从配置文件中读取图片的保存路径@Value("${img.path}")privateString imgPath;@RequestMapping("/sayhi")publicStringsayHi(){return"66666"+ imgPath;}}
如果 application.yml 中设置的配置文件运行平台是开发环境,也就是 application-dev.yml,运行程序可以看到
反之如果在 application.yml 中设置为生产环境,运行程序
(2)生成图片名称:UUID
(3)获取原图片的上传格式:获取原文件名称,并根据原文件名称的后缀,来截取 “.” 后面的字符
@Slf4j@Controller@ResponseBody// 作用: 表示的是返回一个非静态页面的数据@RequestMapping("/user")// 类上的 RequestMapping 可以省略publicclassUserController{// 从配置文件中读取图片的保存路径@Value("${img.path}")privateString imgPath;@RequestMapping("/upimg")publicbooleanupImg(Integer uid,@RequestPart("img")MultipartFile file){boolean result =false;// 1.目录=imgPath// 2.图片名称(图片名称不能重复,如果重复就会把重名的图片覆盖)【UUID】// 3.获取原上传图片的格式(获取原文件名称,并根据原文件名称的后缀,来截取 “.” 后面的字符)String fileName = file.getOriginalFilename();// 得到原图片的名称(xxx.png)
fileName = fileName.substring(fileName.lastIndexOf("."));// 得到图片后缀 (png)
fileName =UUID.randomUUID().toString()+ fileName;//UUID + 后缀格式// 保存图片到本地目录try{// file.transferTo(new File("D:/IDEA/img.png"));
file.transferTo(newFile(imgPath+fileName));
result =true;}catch(IOException e){
log.error("上传图片失败: "+ e.getMessage());}return result;}}
可以看到这里使用 Postman,多点几次 Send,每次上传图片的名字是不同的
8. 获取Cookie (@CookieValue)/Session/header
8.1 获取 Request 和 Response 对象
因为 Spring MVC是基于 Servlet 的,所以这里可以直接写
@Slf4j@Controller@ResponseBody// 作用: 表示的是返回一个非静态页面的数据@RequestMapping("/user")// 类上的 RequestMapping 可以省略publicclassUserController{@RequestMapping("/sayhi")publicStringsayHi(HttpServletRequest request){return"66666"+ request.getParameter(("name"));}}
8.2 获取 Cookie
(1)Servlet 获取 Cookie 的方法
@Slf4j@Controller@ResponseBody// 作用: 表示的是返回一个非静态页面的数据@RequestMapping("/user")// 类上的 RequestMapping 可以省略publicclassUserController{@RequestMapping("/cookie")publicvoidgetCookie(HttpServletRequest request){// 得到全部 CookieCookie[] cookies = request.getCookies();for(Cookie item : cookies){
log.info("Cookie Name:"+ item.getName()+" | Cookie Value: "+ item.getValue());}}
(2)使用 @CookieValue 注解实现 Cookie 的读取
@RequestMapping("/cookie2")publicStringgetCookie2(@CookieValue("666")String cookie){return"Cookie Value: "+ cookie;}
8.3 获取 Header(请求头)里面的信息
(1)Servlet 获取 Header 的方法
@RequestMapping("getua")publicStringgetHead(HttpServletRequest request){return"header: "+ request.getHeader("User-Agent");}
(2)使用 @RequestHeader 注解实现 Header 的获取
@RequestMapping("getua2")publicStringgetHead(@RequestHeader("User-Agent")String userAgent){return"header: "+ userAgent;}
8.4 存储和获取 Session
(1)Session 存储和 Servlet 类似,是使⽤ HttpServletRequest 中获取的
@RequestMapping("/setsess")publicbooleansetSession(HttpServletRequest request){boolean result =false;// 1.得到 HttpSession// true =》 如果没有会话,那就创建HttpSession session = request.getSession(true);// 2.使用 setAtt 设置值
session.setAttribute("userinfo","userinfo");
result =true;return result;}
(2)获取 Session 方法1(Servlet 模式)
@RequestMapping("/getsess")publicStringgetSession(HttpServletRequest request){String result =null;// 1. 先得到HttpSession 对象HttpSession session = request.getSession(false);// 2. getAttribute 得到 Session 信息if(session !=null&& session.getAttribute("userinfo")!=null){
result =(String) session.getAttribute("userinfo");}return result;}
(3)获取 Seesion 方法2:@SessionAttribute
通常情况下需要添加 required = false ,如果不添加,那么当 session 中不存在此属性的时候程序运行就会报错
@RequestMapping("/getsess2")publicStringgetSession2(@SessionAttribute(value ="userinfo",
required =false)String userinfo){return"会话:"+ userinfo;}
版权归原作者 快到锅里来呀 所有, 如有侵权,请联系我们删除。