get请求和post请求的区别
2026/6/11 21:47:32 网站建设 项目流程

问:
这里为什么要写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(){return"reg";// 显示注册页面(空表单)}
  • 触发场景:用户在浏览器输入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")){// 显示表单return"reg";}else{// 处理提交Stringname=request.getParameter("name");model.addAttribute("userName",name);return"reg-result";}}

这种写法虽然可行,但职责不清晰,违反了单一职责原则。

总结

  • @GetMapping:负责显示页面(展示表单)
  • @PostMapping:负责处理数据(接收提交)

这种分离使得代码更清晰、更易维护,也符合RESTful API设计规范。同一个URL通过不同的HTTP方法来实现不同的业务操作,是Web开发的标准实践。

问:触发场景:用户在浏览器输入 http://localhost:8080/reg 或点击注册链接
作用:显示注册表单页面(空的输入框)
这个为什么是get方法?

这是一个很好的深入问题!浏览器输入URL或点击链接使用GET方法,这是由HTTP协议规范和浏览器的实现决定的。

核心原因:HTTP方法的语义定义

GET方法的语义

  • 获取数据:从服务器获取资源,不应该产生副作用
  • 幂等性:多次请求结果相同
  • 可缓存:响应可以被缓存
  • 参数在URL中:数据通过查询字符串传递(如?key=value

POST方法的语义

  • 提交数据:向服务器发送数据,会产生状态变化
  • 非幂等性:多次请求可能产生不同结果(如多次提交会创建多个订单)
  • 不可缓存(通常)
  • 参数在请求体中:数据不在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

为什么是GET?

  • HTML规范明确规定<a>标签产生GET请求
  • 链接代表"导航到另一个页面",是安全的读取操作

3. 表单提交可以指定方法

<!-- GET提交(不推荐用于表单) --><formaction="/reg"method="get"><inputname="name"><button>提交</button></form><!-- 产生:GET /reg?name=张三 --><!-- POST提交(推荐用于表单) --><formaction="/reg"method="post"><inputname="name"><button>提交</button></form><!-- 产生:POST /reg -->

实际演示

如果用GET方法处理表单提交会怎样?

@GetMapping("/reg")publicStringhandleReg(@RequestParam("name")Stringname){// 这种写法有问题!// 用户首次访问 /reg 时,name 参数为 null,会出错return"reg-result";}

访问http://localhost:8080/reg会报错,因为缺少name参数。

正确的设计

// 显示表单 - GET@GetMapping("/reg")publicStringshowForm(){return"reg";// 只是显示页面,不接收参数}// 处理数据 - POST@PostMapping("/reg")publicStringhandleSubmit(@RequestParam("name")Stringname){return"reg-result";// 处理提交的数据}

历史上的原因

HTTP/1.0(1996年)设计时就明确了:

  • GET:只读操作
  • POST:写入操作

浏览器厂商遵循这个规范:

  • Netscape、IE、Chrome、Firefox、Safari全部遵守
  • 用户输入URL → GET
  • 点击普通链接 → GET
  • 书签收藏 → 保存URL(GET请求)

实际例子对比

操作浏览器行为为什么
输入网址GET用户想要"看"页面
点击链接GET导航到新页面
刷新页面重复上次的请求方法保持操作一致性
提交表单POST(如果method=“post”)发送数据给服务器
上传文件POST发送大容量数据

总结

使用GET是因为:

  1. HTTP协议规定:GET用于获取资源
  2. 浏览器实现:地址栏输入和链接点击自动使用GET
  3. 语义正确:显示注册页面是安全操作,不应改变服务器状态
  4. 用户体验:可以刷新、收藏、分享链接(POST请求的URL不能直接分享)

如果把注册页面改成POST方式访问,用户将无法通过直接输入URL或点击链接看到注册表单,这显然是不合理的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询