文章目录

  • 概述
    • 1.HttpServletRequest
    • 2.@RequestParam
    • 3.@RequestBody
    • 4.直接实体接收
    • HttpServletRequest请求方法详解:

概述

客户端的网络请求首先会被Http服务器接收(也叫Web服务器、web容器,其需要提供web应用运行所需的环境,接收客户端的Http请求);
Web服务器根据请求的路径将请求转交给对应的Servlet容器(也称Servlet引擎,为Servlet的运行提供环境支持,可以理解为tomcat或其他服务器);
Servlet容器根据对应的虚拟路径(@WebServlet中配置的)来加载Servlet,如果Serlvet没有被实例化则创建该Servlet的一个实例(调用init方法);
Servlet容器根据用户的HTTP请求,创建一个ServletRequest对象(HTTP的请求信息被封装在其中)和一个可以对HTTP请求进行响应的ServletResponse对象(类似于寄信,并在信中说明回信的地址),然后调用HttpServlet中重写的service(ServletRequest req, ServletResponse res)方法,并在这个方法中,将ServletRequest、ServletResponse这两个对象向下转型,得到我们非常熟悉的HttpServletRequest和HttpServletResponse两个对象,然后将客户端的请求转发到HttpServlet中protected修饰的service(HttpServletRequest req, HttpServletResponse resp)

HttpServletRequest和@Requestparam、@RequestBody三种都是常用的在http请求中接收前端参数的方式,而后端用于响应的有HttpServletResponse,今天实验了一下用于请求的几种方式:

1.HttpServletRequest

例子

public Object updateSongMsg(HttpServletRequest req){JSONObject jsonObject = new JSONObject();String id = req.getParameter("id").trim();String singer_id = req.getParameter("singerId").trim();String name = req.getParameter("name").trim();String introduction = req.getParameter("introduction").trim();String lyric = req.getParameter("lyric").trim();Song song = new Song();song.setId(Integer.parseInt(id));song.setSingerId(Integer.parseInt(singer_id));song.setName(name);song.setIntroduction(introduction);song.setUpdateTime(new Date());song.setLyric(lyric);boolean res = songService.updateSongMsg(song);if (res){jsonObject.put("code", 1);jsonObject.put("msg", "修改成功");return jsonObject;}else {jsonObject.put("code", 0);jsonObject.put("msg", "修改失败");return jsonObject;}}

参数用HttpServletRequest req,相当于把前端的请求内容包装了起来,个人认为传送时可以类似于Requesparam,下面用postman实验:
localhost:8888/song/update?id=1&singerId=1&name=直接&introduction=烦烦烦&lyric=123

下面查看数据库:

从源码可以看到 HttpServletRequest extends ServletRequest,是一个抽象接口
可以用它获得更多的客户端信息:
我们在上面的方法中输出:

 @ResponseBody@RequestMapping(value = "/song/update", method = RequestMethod.POST)public Object updateSongMsg(HttpServletRequest req){System.out.println("getRequestURI:"+req.getRequestURI()+" getServerName():"+req.getServerName()+" getServerPort():"+req.getServerPort()+" rethod:"+req.getMethod());}

再次发起请求时可以看到:

2.@RequestParam

有一些特殊情况,我们的服务端的接口变量名可能和前端不一致,这个时候我们可以通过 @RequestParam 注解来解决
修改上面的请求参数变为:

 public Object updateSongMsg(@RequestParam("id")String id,@RequestParam("singerId")String singer_id,@RequestParam("name")String name,@RequestParam("introduction")String introduction,@RequestParam("lyric")String lyric){JSONObject jsonObject = new JSONObject();                            Song song = new Song();song.setId(Integer.parseInt(id));song.setSingerId(Integer.parseInt(singer_id));song.setName(name);song.setIntroduction(introduction);song.setUpdateTime(new Date());song.setLyric(lyric);boolean res = songService.updateSongMsg(song);if (res){jsonObject.put("code", 1);jsonObject.put("msg", "修改成功");return jsonObject;}else {jsonObject.put("code", 0);jsonObject.put("msg", "修改失败");return jsonObject;}}

下面发送请求
localhost:8888/song/update?id=1&singerId=1&name=修改&introduction=烦烦烦&lyric=123

再次看数据库:

可以看到name发生了改变。其中数据库字段为singer_id,而我们传的是singerId,相当于把@RequestParam注解中的singerId中传过去的值给了参数中的singer_id,起到的效果与上面的HttpServletRequest相同

3.@RequestBody

@requestbody要求传递的是一个json格式的字符串
如:

$ajax(
{type:"post",
url:"json/user",
data:'{"name":"admin","pwd":"123456"}',
success:function(data){console.log(data);
}
})

注意上面的data是字符串(有单引号)
@RequestBody 注解用于接收前端传来的实体,接收参数也是对应的实体,比如前端通过json 提交传来两个参数username 和password,此时我们需要在后端封装一个实体来接收。

 @PostMapping(value = "/config2",produces ="text/plain;charset=UTF-8" )public String testConfig(@RequestBody  User user) {System.out.println(user.getUsername());System.out.println(user.getPassword());return "success";}

此时必须以json字符串的形式接收。

{
“username":“nihao”,
“password”:“123456”
}

4.直接实体接收

使用实体接收的话,我们不能在前面加@RequestParam 注解了,直接使用即可。这个适合于实体字段非常多,用@RequestParam比较麻烦的场景

public class User {private String username;
private String password;
// set get
}
@PostMapping("/form2")
public String testForm(User user) {//需注意方法的参数
System.out.println("获取到的username 为:" +
user.getUsername());
System.out.println("获取到的password 为:" +
user.getPassword());
return "success";

注意发送时必须以key-values的格式发送,而不是json格式

HttpServletRequest请求方法详解:

HttpServletRequest可以获得的参数更多,它可以获得客户端的请求行和请求头、请求体信息。
当访问Servlet时,会在请求消息的请求行中,包含请求方法、请求资源名、请求路径等信息,为了获取这些信息,在HTTPServletRequest接口中,定义了一系列用于获取请求行的方法
ttpServletResponse:服务端处理完Http的请求后,根据HttpServletResponse对象将处理结果作为Http响应返回给客户端
且注意HttpServletRequest的不同实现类有实现不同的方法。

获得请求行:一些请求行方法的解释:


获得请求头
除了请求行,在HttpServletRequest接口中,也定义了一系列用于获取HTTP请求头字段的方法:

获得请求体:这也是上面的示例获得参数的方法。
在实际开发中,经常需要获取用户提交的表单数据,例如,用户名,密码、电子邮件等,为了方便获取表单中的请求参数,在HttpServletRequest接口总,定义了一些列获取请求参数的方法

HttpServletRequest和@Requestparam、@RequestBody、直接实体接收请求参数的区别与示例相关推荐

  1. SpringMVC框架 学习DAY_02 : 接收请求参数/向模板页面转发数据/重定向与转发 /Session

    1. 接收客户端提交的请求参数 1.1. 使用HttpServletRequest接收请求参数 在处理请求的方法的参数列表中,添加HttpServletRequest类型的参数,在处理请求的过程中,调 ...

  2. java控制器接收请求参数_SpringMVC之接收请求参数和页面传参

    Spring接收请求参数 1,使用HttpServletRequest获取 Java代码 @RequestMapping("/login.do") public String lo ...

  3. java 页面接收参数_详解SpringMVC——接收请求参数和页面传参

    spring接收请求参数: 1,使用HttpServletRequest获取 @RequestMapping("/login.do") public String login(Ht ...

  4. springmvc接收请求参数(springmvc教程二)

    目录 工程代码 普通接收请求参数 pojo接收请求参数 @RequestParam接收请求参数 restful风格 URL接收请求参数 json接收请求参数 Array数据接收请求参数 接收请求参数序 ...

  5. Struts2的第二天(Action接收请求参数)

    Struts2的第二天 Struts2的第二天的内容 1. Struts2框架中的Servlet的API的使用 2. Struts2中Action接收请求参数 3. Struts2中自定义拦截器 案例 ...

  6. 重定向转发,接收请求参数及数据回显-P11,12

    重定向和转发: 我们的实现本身就是转发 . 想删掉视图解析器的话,就需要在return把路径写全 重定向就改为redirect:而且重定向不走视图解析器,因为是新的请求,新的URL. 接收请求参数: ...

  7. java封装入参_Spring Gateway自定义请求参数封装的实现示例

    一.需求 在使用spring gateway作为网关时,我们需要在经过网关的请求中添加一些需要传递给后续服务的公共参数,这个时候就可以用到spring gateway提供的自定义请求参数功能了. 二. ...

  8. Spring MVC 接收请求参数所有方式总结!

    来源:简书,作者:zhrowable 链接:https://www.jianshu.com/p/5f6abd08ee08 SpringMVC请求参数接收 其实一般的表单或者JSON数据的请求都是相对简 ...

  9. springMVC接收请求参数的几种方式

    1.  用注解@RequestParam绑定请求参数 用注解@RequestParam绑定请求参数a到变量a,当请求参数a不存在时会有异常发生,可以通过设置属性required=false解决,例如: ...

最新文章

  1. projecteuler_problem10
  2. 陈启峰:人工智能生成图像技术,未来或能取代电影特效
  3. android aidl接口初步了解
  4. Centos 中 service iptables stop 失败
  5. 提高PHP编程效率的20个要点(转)
  6. 联想小新300加固态_就联想小新 Pro 13 固态硬盘混用一事,官方回应
  7. ios找不到信任证书_iOS 11 中可用的受信任根证书列表
  8. plsql提示列快捷键_PLsql快捷键
  9. “编程能力差!90%输在了这点上!”谷歌开发:其实你们都是瞎努力
  10. 设备log导入oracle,oracle imp 导入数据库出错 请看log!
  11. c语言课程设计实训主要目的,C语言课程设计实训指导书.doc
  12. Javase基础思维导图
  13. 如何才能把文字的排版做好
  14. 城域网过渡技术之NAT64+DNS64
  15. 摇杆控制方向原理_摇杆电位器结构及工作原理详解
  16. 交换友情链接时要谨防以下12种情况
  17. 哔哩哔哩android4.3,哔哩哔哩(tv.danmaku.bili) - 6.26.0 - 应用 - 酷安
  18. time秒和年月日时分秒的转化
  19. 运筹学基础【二】 之 预测
  20. 企业门户网站前后台开发——油画商城

热门文章

  1. c语言提供了6个位运算,C语言基础丨运算符之位运算符(六)
  2. 浏览器卡怎么办_SD卡无法格式化怎么修复?简单修复方法介绍
  3. python绘制概率密度曲线_[python常用图件绘制#04]核密度曲线图(峰值点显示)
  4. c4d打开没反应_掌握这3种C4D技巧,线框渲染效果图也就几秒的事
  5. 最大流最小割经典例题_C/C++知识点之最大流最小割C++实现
  6. python实现条件匹配_python3 re如何匹配满足条件的选项?
  7. 深度学习开发者的AI Party来了!WAVE SUMMIT+2021与你相约双十二
  8. 更好的对比样本选择,更好的对比效果
  9. 今日arXiv精选 | 15篇ICCV 2021最新论文
  10. 超细粒度分析XLNet中神奇的Attention Mask