问这里为什么要写getmapping还要写postmapping// 处理访问 /reg 的GET请求显示注册页面 GetMapping(/reg) public String showRegPage() { // 返回的逻辑视图名是 reg根据配置会映射到 /WEB-INF/jsp/reg.jsp return reg; } // 处理来自注册页面的POST表单提交 PostMapping(/reg) public String handleReg(RequestParam(name) String name, RequestParam(age) Integer age, Model model) { // 将接收到的数据存入Model以便在结果页面上显示 model.addAttribute(userName, name); model.addAttribute(userAge, age); // 返回逻辑视图名 reg-result映射到 /WEB-INF/jsp/reg-result.jsp return reg-result; }这是一个很好的问题这两个方法虽然映射到同一个路径/reg但处理的是不同的HTTP请求方法职责完全不同1.GET 请求- 显示注册表单页面GetMapping(/reg)// 处理 HTTP GET 方法publicStringshowRegPage(){returnreg;// 显示注册页面空表单}触发场景用户在浏览器输入http://localhost:8080/reg或点击注册链接作用显示注册表单页面空的输入框特点不提交数据只是展示页面2.POST 请求- 处理表单提交PostMapping(/reg)// 处理 HTTP POST 方法publicStringhandleReg(RequestParam(name)Stringname,...触发场景用户填写完注册表单点击提交按钮作用接收表单数据处理注册逻辑特点携带用户填写的数据为什么要分开写Web开发的标准模式Post/Redirect/Get模式用户操作流程 ┌─────────────┐ GET /reg ┌─────────────┐ │ 用户访问 │ ─────────────── │ 显示注册表单 │ │ 注册页面 │ │ (空表单) │ └─────────────┘ └─────────────┘ │ │ 用户填写表单 ↓ ┌─────────────┐ POST /reg ┌─────────────┐ │ 显示注册 │ ─────────────── │ 提交表单数据 │ │ 结果页面 │ │ (处理注册) │ └─────────────┘ └─────────────┘实际例子说明如果只写一个 POST 方法用户第一次访问/reg时这个方法不会被触发因为是GET请求用户可能会看到错误页面无法显示空表单如果只写一个 GET 方法可以显示表单页面但用户提交表单时POST请求这个方法也不会被触发表单数据无处处理合并的写法不推荐但能说明问题// 不推荐用一个方法处理两种请求RequestMapping(value/reg,method{RequestMethod.GET,RequestMethod.POST})publicStringhandleReg(HttpServletRequestrequest,Modelmodel){if(request.getMethod().equals(GET)){// 显示表单returnreg;}else{// 处理提交Stringnamerequest.getParameter(name);model.addAttribute(userName,name);returnreg-result;}}这种写法虽然可行但职责不清晰违反了单一职责原则。总结GetMapping负责显示页面展示表单PostMapping负责处理数据接收提交这种分离使得代码更清晰、更易维护也符合RESTful API设计规范。同一个URL通过不同的HTTP方法来实现不同的业务操作是Web开发的标准实践。问触发场景用户在浏览器输入 http://localhost:8080/reg 或点击注册链接作用显示注册表单页面空的输入框这个为什么是get方法这是一个很好的深入问题浏览器输入URL或点击链接使用GET方法这是由HTTP协议规范和浏览器的实现决定的。核心原因HTTP方法的语义定义GET方法的语义获取数据从服务器获取资源不应该产生副作用幂等性多次请求结果相同可缓存响应可以被缓存参数在URL中数据通过查询字符串传递如?keyvaluePOST方法的语义提交数据向服务器发送数据会产生状态变化非幂等性多次请求可能产生不同结果如多次提交会创建多个订单不可缓存通常参数在请求体中数据不在URL中显示浏览器行为规范1. 地址栏输入URL// 用户在地址栏输入http://localhost:8080/reg// 浏览器自动发起GET/regHTTP/1.1Host:localhost:8080为什么是GET用户想查看注册页面这是安全操作不会改变服务器状态符合GET的语义获取资源2. 点击链接标签!-- HTML代码 --ahref/reg注册/a!-- 点击后浏览器发起 --GET /reg HTTP/1.1为什么是GETHTML规范明确规定a标签产生GET请求链接代表导航到另一个页面是安全的读取操作3. 表单提交可以指定方法!-- GET提交不推荐用于表单 --formaction/regmethodgetinputnamenamebutton提交/button/form!-- 产生GET /reg?name张三 --!-- POST提交推荐用于表单 --formaction/regmethodpostinputnamenamebutton提交/button/form!-- 产生POST /reg --实际演示如果用GET方法处理表单提交会怎样GetMapping(/reg)publicStringhandleReg(RequestParam(name)Stringname){// 这种写法有问题// 用户首次访问 /reg 时name 参数为 null会出错returnreg-result;}访问http://localhost:8080/reg会报错因为缺少name参数。正确的设计// 显示表单 - GETGetMapping(/reg)publicStringshowForm(){returnreg;// 只是显示页面不接收参数}// 处理数据 - POSTPostMapping(/reg)publicStringhandleSubmit(RequestParam(name)Stringname){returnreg-result;// 处理提交的数据}历史上的原因HTTP/1.01996年设计时就明确了GET只读操作POST写入操作浏览器厂商遵循这个规范Netscape、IE、Chrome、Firefox、Safari全部遵守用户输入URL → GET点击普通链接 → GET书签收藏 → 保存URLGET请求实际例子对比操作浏览器行为为什么输入网址GET用户想要看页面点击链接GET导航到新页面刷新页面重复上次的请求方法保持操作一致性提交表单POST如果method“post”发送数据给服务器上传文件POST发送大容量数据总结使用GET是因为HTTP协议规定GET用于获取资源浏览器实现地址栏输入和链接点击自动使用GET语义正确显示注册页面是安全操作不应改变服务器状态用户体验可以刷新、收藏、分享链接POST请求的URL不能直接分享如果把注册页面改成POST方式访问用户将无法通过直接输入URL或点击链接看到注册表单这显然是不合理的。