Http请求(Day03)

Stella981
• 阅读 520

ServletRequest接口

​ 在容器中接收到Web客户端的 HTTP请求之后会先解析该请求,并创建与之相对应的请求对象和响应对象,而创建的请求对象的类型就是ServletRequest 类型。

1、ServletRequest

​ 简单点说就是该接口封装了请求信息。可以从中获取到任何的请求信息。同时该接口还定义了向请求对象中设置数据的方法。

​ 使用该接口和客户端进行数据传递的大致过程为:容器在解析HTTP请求之后,将HTTP请求中的数据映射到新创建的ServletRequest对象中,再将该对象传递给相应的Servlet实例的service方法,所以说ServletRequest对象中存在客户端向Servlet程序发送的数据信息。

2、ServletRequest常用方法

2.1、获取请求协议

  • java.lang.String getProtocol()

    返回请求协议
    

2.2、获取请求头

  • java.lang.String getContentType()

    返回请求体的MIME类型,如果类型未知则返回null

  • int getContentLength()

    返回输入流可用的请求体的长度(以字节为单位),如果长度未知则返回-1
    

2.3、获取请求参数

  • java.lang.String getParameter(java.lang.String name)

    以字符串的形式返回请求参数的值,如果该参数不存在,则返回null
    
  • java.util.Enumeration<java.lang.String> getParameterNames()

    该方法用于获取请求对象中所有的请求参数名称
    
  • java.lang.String[] getParameterValues(java.lang.String name)

    该方法用于从请求对象中获取指定参数名称对应的多个值的方法,当页面上通过同一个名称传递多个取值时,可以使用该方法来获取这些取值(比如页面上的 checkbox)
    
  • java.util.Map<java.lang.String,java.lang.String[]> getParameterMap()

    该方法用于获取所有请求参数及其取值,其返回类型是 Map,其中 key 为参数名称,value 为参数值。因为同一个参数名称可能对应多个取值,所以这里的 value 是 String 数组类型
    

2.4、读取请求体数据

  • java.io.BufferedReader getReader()

    该方法返回一个可以 读取请求体中 所包含内容的 字符输入 流,当请求报头中content-type 字段的取值为 application/x-www-form-urlencoded 或 text/plain 时,可以通过该方法来读取请求体中所包含的字符数据。
    
  • ServletInputStream getInputStream()

    该方法返回一个可以 读取请求体中 所包含内容的 字节输入流 ,当请求报头中content-type 字段的取值为 multipart/form-data 时,可以通过该方法来读取请求体中所包含的字节数据。
    

2.5、字符编码

  • void setCharacterEncoding(java.lang.String env)

    该方法用于设置请求体中使用的字符编码的名称。
    
  • java.lang.String getCharacterEncoding()

    该方法用于获取请求体中使用的字符编码方案的名称。如果从未指定过处理请求体数据时所使用的字符编码方案,则返回 null,此时容器会采用当前默认的字符编码方案来处理请求体中的数据
    

2.6、属性操作

  • void setAttribute(String attributeName, Object attributeValue )

    该方法用于将指定对象关联到当前请求对象的指定属性上
    
  • java.lang.Object getAttribute(java.lang.String name)

    该方法用于从请求对象中获取指定名称的属性的属性值
    
  • java.util.Enumeration<java.lang.String> getAttributeNames()

    用于从请求对象中获取所有的属性名称
    
  • void removeAttribute(java.lang.String name)

    该方法用于从请求对象中删除指定的属性
    

3、HttpServletRequest

​ HttpServletRequest 接口继承了 ServletRequest 接口,它是针对 HTTP协议提供的一个接口,容器通过该类型的对象向 HttpServlet 传递 HTTP 请求数据,其中提供了大量的获取 HTTP 请求数据的方法。

3.1、获取_请求行_数据

  • java.lang.StringBuffer getRequestURL()

    用于获取完整的请求路径,包括协议、主机名、端口、资源路径等。
    
  • java.lang.String getRequestURI()

    用于获取当前请求所访问的资源路径(不包含协议、主机名、端口等)
    
  • java.lang.String getMethod()

    用于获取本次请求所采用的请求方式,比如 GET
    
  • java.lang.String getContextPath()

    用于获取当前 Web 应用对应的路径

  • java.lang.String getQueryString()

    当客户端采用 GET 方式请求指定资源时,如果同时向服务器发送了数据,则这些数据被编码到 request-URL 中,该方法即用于获取 request-URL 中的 queryString 部分
    

3.2、获取_请求头_数据

  • Cookie[] getCookies()

    用于从请求头中获取所有的 cookie。
    
  • long getDateHeader(java.lang.String name)

    用于从请求头中获取指定名称的、用来表示日期和时间的字段取值
    
  • java.lang.String getHeader(java.lang.String name)

    用于从请求头中获取指定名称的字段的单个取值
    
  • java.util.Enumeration<java.lang.String> getHeaderNames()

    用于获取请求头中所有的字段名称。
    
  • java.util.Enumeration<java.lang.String> getHeaders(java.lang.String name)

    用于从请求头中获取指定名称的字段的所有取值
    
  • int getIntHeader(java.lang.String name)

    以整数形式返回请求头中指定名称的字段的单个取值

3.3、获取_请求体_数据

  • Part getPart(java.lang.String name)

    当处理文件上传操作时,使用 getPart 方法可以获得表单中单个对应的 Java 对象,它是一个 Part 类型的对象,其中封装了所上传的文件的内容、名称、类型等信息。

  • Part getPart(java.lang.String name)

    当处理文件上传操作时,使用该方法 可以获 取文件 上传 表单中 所有的 对应的 Part 对象对应的 Collection 集合

4、案例

  • Servlet类继承HttpServlet并实现其中service方法

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String method = request.getMethod(); StringBuffer buffer = request.getRequestURL(); String queryString = request.getQueryString(); if(queryString != null){ buffer.append("?"); buffer.append("queryString"); } String url = buffer.toString(); String protocol = request.getProtocol(); System.out.println("------------请求行---------------"); System.out.println("请求方式:"+method+"\t 请求路径:"+url+"\t 请求协议:"+protocol); System.out.println("------------请求头---------------"); Enumeration e = request.getHeaderNames(); //获取请求头信息的所有的key。 //遍历所有的键 while(e.hasMoreElements()){ String key = e.nextElement(); //根据键取值 String value = request.getHeader(key); //根据键取出对应的值(请求头的信息) System.out.println(key+":"+value); } System.out.println("------------请求体---------------"); BufferedReader bufferedReader = request.getReader();
    String string = null; while (( s = bufferedReader.readLine()) != null){
    System.out.println(string); } response.setContentType("text/html;charset=UTF-8"); PrintWriter writer = response.getWriter(); writer.println("<p'>Hello world

    "); writer.close(); }

  • html页面

  • 报文结果

Http请求(Day03)

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Souleigh ✨ Souleigh ✨
2年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
虾米大王 虾米大王
1年前
java代码012
code012.jspInserttitlehere<%JSP内置对象1.request用于处理HTTP请求中的各项参数。如,删除可以通过request对象的getParameter()方法获取如,request.getParameter("id")在请求转发时,需要把一些数据传递到转发后的页面处理。就需要用到request的se
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Easter79 Easter79
2年前
SpringMvc接受特殊符号参数被转义
WEB开发时,在前端通过get/post方法传递参数的时候 如果实参附带特殊符号,后端接收到的值中特殊符号就会被转义例如该请求: http://localhost:10001/demo/index.do?name张三(1)注:中文()不会出现此种情况后台就收到的实际name值为:  张三&40;1&41;&40;其实为h
Wesley13 Wesley13
2年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这