当前位置: 首页 > news >正文

Spring MVC2

在Spring MVC1中,我们知道了MVC的定义,同时也知道了@RequestMapping和@RestController这个注解的作用。

本篇文章,我们将学习使用Spring MVC获取请求参数和返回不同的响应等等

请求

传递单个参数

如图所示,创建RequestController类:

 在类中实现传递单个参数:

@RestController
public class RequestController {@RequestMapping("/r1")public String r1(String name){return "获取参数"+name;}
}

我们可以使用Postman对代码进行测试 :

传int和Integer对比(传错误类型和不传参数):

传递Integer:

  @RequestMapping("/r2")public String r2(Integer num){return "获取参数"+num;}

传递int:

   @RequestMapping("/r3")public String r3(int num){return "获取参数"+num;}

可以看到在不传参时int直接报了个500(500属于客户端的问题,是要我们后端开发人员负责的),因此在实际开发中建议多使用包装类型

传递多个参数

@RequestMapping("/r4")public String r4(String name,Integer age){return "获取参数:"+name+" age:"+age;}

Postman测试: 

传递对象 

当我们需要传递两个以上的参数时,就可以使用对象来进行传递,使代码更加简洁。

先在目录下创建一个学生类:

public class Student {private String name;private Integer age;private Integer id;
}

我们可以使用Lombok的@Data注解来减少Getter和Setter方法的书写:

首先,我们需要在pom.xml中添加Lombok的依赖,这里建议使用插件进行添加: 在pom.xml文件中右键-生成:

选中我们刚才安装的插件:

 

继续按图示点击,然后OK即可: 回到刚才的Student代码处,添加上@Data注解。

@Data
public class Student {private String name;private Integer age;private Integer id;
}

这是Lombok中所包含的一些其他注解: @Data=@Getter+@Setter+@ToString+@EqualsAndHashCode+@RequiredArgsConstructor+@NoArgsContryctor

    @RequestMapping("/r5")public String r5(Student student){return student.toString();}
}

测试: 

后端参数映射(后端参数重命名)

后端参数映射需要使用@RequestParam这个注解:

    @RequestMapping("/r6")public String r6(@RequestParam("name")String userName){return "获取参数"+userName;}

测试: 

传递数组

    @RequestMapping("/r7")public String r7(int[] arr){return Arrays.toString(arr);}

测试:

方式1: 
方式2: 

传递集合

    @RequestMapping("/r8")public String r8(@RequestParam List<String> list){return list.toString();}

 测试:

方式1:
方式2:

传递Json对象

传递Json对象需要使用@RequestBody这个注解

    @RequestMapping("/r10")public String r10(@RequestBody Student student){return student.toString();}

测试: 

Json字符串转对象和对象转字符串

代码:

public class TestJson {public static void main(String[] args) throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();//json字符串转对象String jsonstr = "{\"name\":\"张三\",\"age\":15,\"id\":5}";Student student = mapper.readValue(jsonstr,Student.class);System.out.println(student);//json对象转字符串String s = mapper.writeValueAsString(student);System.out.println(s);}
}

 运行结果:

传递URL中的对象

注意这里的参数一个都不能少,Spring是无法识别出缺失的参数的。 

    @RequestMapping("r9/{name}/{age}")public String r9(@PathVariable("name")String userName,@PathVariable Integer age){return "获取参数:"+userName+" age:"+age;}

测试: 

 传递文件

这里的注解@RequestPart可加也可不加。

   @RequestMapping("/r11")public String r11(MultipartFile file){return file.getOriginalFilename();}

测试: 

获取Cookie

Spring中内置了HttpSeverletRequest和HttpSeverletResponse两个对象(这两个对象包含了Http请求/响应中的所有属性)。因为Cookie一般是在请求中的,所以我们可以通过HttpSeverletRequest来获取到Cookie。

方式1: 
    @RequestMapping("/getC1")public String getCookie1(HttpServletRequest request){Cookie[] cookies = request.getCookies();if(cookies != null){Arrays.stream(cookies).forEach((ck)->{System.out.println(ck.getName()+":"+ck.getValue());});}return "获取cookie成功";}

点击这里创建一个Cookie: 输入127.0.0.1后Add Domain即可:

点击这里创建Cookie:

测试:

方式2:
 @RequestMapping("/getC2")public String getCookie2(@CookieValue("xmy") String xmy){return xmy;}

测试:

设置Session

方式1:
    @RequestMapping("/setSess")public String setSess(HttpServletRequest request){HttpSession session = request.getSession();session.setAttribute("name","zhangsan");return "设置session成功";}
方式2:
  @RequestMapping("/setSess1")public String setSess1(HttpSession session) {session.setAttribute("name","zhangsan");return "设置session成功";}

获取Session 

方式1:
    @RequestMapping("/getSess1")public String getSess1(HttpServletRequest request){HttpSession session = request.getSession();String name = (String) session.getAttribute("name");return name;}

测试:

 方式2:
   @RequestMapping("/getSess2")public String getSess2(HttpSession session){String name = (String) session.getAttribute("name");return name;}

测试:

 方式3:
    @RequestMapping("/getSess3")public String getSess3(@SessionAttribute("name")String name){return name;}

获取Header中的元素

这里我们获取的是Header中的User-Agent元素。

方式1:
 @RequestMapping("/getHeader")public String getHeader(HttpServletRequest request){String header = request.getHeader("User-Agent");return header;}

测试:

 方式2:
    @RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent")String header){return header;}

测试:

响应

返回静态页面

先在static目录下创建一个HTML文件: 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>我是一个标题</h1>
</body>
</html>

这里我们需要把类上面的@RestController变成@Controller,@Controller是定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理(返回的是视图),而@RestController = @ResponseBody(返回数据)+@Controller,因此RestController返回的是数据。

@Controller
public class ResponseController {@RequestMapping("/index")public String index(){return "/index.html";}

测试:

注意:因为在这里使用的是@Controller,所以我们后面需要返回数据的内容都要加上@ResponseBody 。

返回数据

@RequestMapping("/index2")@ResponseBodypublic String index2(){return "返回数据";}

测试: 

返回HTML代码片段

    //返回html@RequestMapping("/index3")@ResponseBodypublic String index3(){return "<h1>hello springmvc<h1>";}

 测试:

返回Json 

    //返回json@RequestMapping("/index4")@ResponseBodypublic HashMap<String,String> index4(){HashMap<String,String> map = new HashMap<>();map.put("k1","v1");map.put("k2","v2");map.put("k3","v3");map.put("k4","v4");return map;}

 测试:

设置状态码

设置状态码需要使用HttpSeverletResponse对象 

    //设置状态码@ResponseBody@RequestMapping("/index5")public String setStatus(HttpServletResponse response){response.setStatus(418);return "设置状态码";}

测试:

设置返回类型

//设置返回类型@RequestMapping(value = "return",produces = "applicatin/json")@ResponseBodypublic String returnJson(){return "{\"success\":true}";}

 测试:


文章转载自:
http://carbuncular.wanhuigw.com
http://boon.wanhuigw.com
http://anonyma.wanhuigw.com
http://blackout.wanhuigw.com
http://birthrate.wanhuigw.com
http://bumpy.wanhuigw.com
http://are.wanhuigw.com
http://chromate.wanhuigw.com
http://channels.wanhuigw.com
http://chiasma.wanhuigw.com
http://bacteroid.wanhuigw.com
http://antiblastic.wanhuigw.com
http://auscultation.wanhuigw.com
http://alleged.wanhuigw.com
http://ablush.wanhuigw.com
http://catapult.wanhuigw.com
http://brawling.wanhuigw.com
http://calcar.wanhuigw.com
http://alibi.wanhuigw.com
http://biotypology.wanhuigw.com
http://anaesthesia.wanhuigw.com
http://avocado.wanhuigw.com
http://agonoze.wanhuigw.com
http://bellpull.wanhuigw.com
http://bedkey.wanhuigw.com
http://anaglyptics.wanhuigw.com
http://breconshire.wanhuigw.com
http://cassel.wanhuigw.com
http://bronzer.wanhuigw.com
http://affectless.wanhuigw.com
http://www.dtcms.com/a/281395.html

相关文章:

  • React 手动实现页面锚点导航
  • AI Agent 框架LangChain概述
  • 【MCU控制 初级手札】1.1 电阻
  • CUDA 环境下 `libcuda.so` 缺失问题解决方案
  • 自注意力机制:让 AI 像人类一样「读懂」上下文
  • 明远智睿SSD2351:开启嵌入式系统开发新时代
  • WebApplicationType.REACTIVE 的webSocket
  • dotnet命令详解
  • linux的数据库与web服务器
  • LSTM入门案例(时间序列预测)
  • 平升智慧水务整体解决方案,大数据驱动的智慧水务,让城市供水更智能
  • 康谋分享 | 破解数据瓶颈:智能汽车合成数据架构与应用实践
  • 改进_开源证券_VCF_多尺度量价背离检测因子!
  • 【从0-1的JavaScript】第1篇:JavaScript的引入方式和基础语法
  • 第五章 管道工程 5.2 燃气管道
  • 数据库第三次作业
  • 脚手架新建Vue2/Vue3项目时,项目文件内容的区别
  • yolo-world环境配置
  • 【PCIe 总线及设备入门学习专栏 5.1.1 -- PCIe PERST# 信号的作用】
  • 关于实习的经验贴
  • eSearch识屏 · 搜索 v14.3.0
  • Redis集群搭建(主从、哨兵、读写分离)
  • netstat -tlnp | grep 5000
  • 3.创建表-demo
  • 进程的内存映像,只读区,可读写区,堆,共享库,栈详解
  • 23.将整数转换为罗马数字
  • 磁悬浮轴承的“眼睛”:位移测量核心技术深度解析
  • 【监控实战】Grafana自动登录如何实现
  • 关于tresos Studio(EB)的MCAL配置之FEE
  • dataLoader是不是一次性的