HTTP请求消息 与 Request请求

HTTP 请求概念:

  Hyper Text Transfer Protocol 超文本传输协议
  传输协议:对浏览器客户端 和 服务器端 之间数据传输的格式规范
 特点:
  1. 基于TCP/IP的高级协议
  2. 默认端口号:80
  3. 基于请求/响应模型的:一次请求对应一次响应

 版本:
  1.0:当前浏览器客户端与服务器端建立连接之后,只能发送一次请求,一次请求之后连接关闭
  1.1:当前浏览器客户端与服务器端建立连接之后,可以在一次连接中发送多次请求。(基本都使用1.1)

一、请求消息数据格式

1. 请求行  

请求方式 请求url 请求协议/版本
 GET /login.html HTTP/1.1

 请求方式:
  HTTP协议有7中请求方式,常用的有2种
 GET:
  1. 地址栏会跟上参数数据,以?开头,多个参数之间以&分割
  2. GET提交参数数据有限制,不超过1KB
  3. GET方式不适合提交敏感数据
  4. 浏览器直接访问的请求,默认提交方式是GET方式
 POST:
  1. 参数不会跟着地址栏后面,参数而是跟在请求的实体内容中   

  2. POST提交的参数数据没有限制   

  3. POST方式提交敏感数据相对安全

2. 请求头:

  客户端浏览器告诉服务器一些信息
  请求头名称: 请求头值
 常见的请求头:
  Accept: text/html,image/*    —— 浏览器接受的数据类型
  Accept-Charset: ISO-8859-1     ——浏览器接受的编码格式
  Accept-Encoding: gzip,compress   ——浏览器接受的数据压缩格式
  Accept-Language: en-us,zh     ——浏览器接受的语言
  Host: www.company.org:80    ——(必须的)当前请求访问的目标地址(主机:端口)
  If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT   ——浏览器最后的缓存时间
  Referer: http://localhost/login.html     ——当前请求来自于哪里
  User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)   ——浏览器类型
  Cookie:name=jack            ——浏览器保存的cookie信息
  Connection: close/Keep-Alive       ——浏览器跟服务器连接状态。
                     close: 连接关闭 keep-alive:保持连接。
  Date: Tue, 11 Jul 2000 18:23:51 GMT    ——请求发出的时间

3. 请求体:请求的内容   

  页面参数

request 请求

1.request对象和response对象的原理

 1.request和response对象是由服务器创建的。我们来使用他们

 2.request对象是来获取请求消息的,response对象是来设置响应消息

2. request对象继承体系结构:  

ServletRequest -- 接口
    |   继承
  HttpServletRequest -- 接口

3.request功能:获取请求消息数据

 1.获取请求数据

  request.getMethod();  获取请求方式

  request.getRequestURT() / request.getRequestURL()  请求资源

  request.getProtocol()  请求http协议版本

   URL: 统一资源定位符,只能定位互联网资源,是URI的子集。
   URI: 统一资源标记符,用于标记任何资源,可以是本地文件系统,局域网的资源,也可以是互联网资源
  比如:
   URL:统一资源定位符 : http://localhost/day01/demo1 *
   URI:统一资源标识符 : /day01/demo1 *

 2.获取请求头数据

  request.getHeader("名称")  根据请求头获取请求值

  request.getHeaderName()  获取所有的请求头名称

package com.qf.servlettest;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/servletDome1")
public class ServletDome1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求行信息
        String method = req.getMethod();    //获取请求方式
        System.out.println("请求方式是:" + method);

        /*
        * URL:  统一资源定位符,只能定位互联网资源,是URI的子集。
        URI: 统一资源标记符,用于标记任何资源,可以是本地文件系统,局域网的资源,也可以是互联网资源
        比如:
        URL:统一资源定位符 : http://localhost/day01/demo1    *
        URI:统一资源标识符 : /day01/demo1                    *
        */
        StringBuffer requestURL = req.getRequestURL();
        System.out.println("请求url:" + requestURL);

        String requestURI = req.getRequestURI();
        System.out.println("请求uri:" + requestURI);

        int remotePort = req.getRemotePort();
        System.out.println("ipv6的表现形式,对应ipv4来说相当于127.0.0.1:" + remotePort);

        String servletPath = req.getServletPath();
        System.out.println("servletPath:" + servletPath);

        String protocol = req.getProtocol();
        System.out.println("协议:" + protocol);

        System.out.println("=====================================");

        //请求头
        //获取所有的请求头名称
        Enumeration<String> headerNames = req.getHeaderNames();     //获取迭代器

        //遍历
        while (headerNames.hasMoreElements()){      //hasMoreElements() 方法返回布尔类型
            //获取每个请求头的名称
            String heaName = headerNames.nextElement();
            //通过请求头名称,获取对应的值
            String header = req.getHeader(heaName);
            System.out.println(heaName + " : " + header);
        }

        System.out.println("----------------------");

        //判断运行浏览器
        if(req.getHeader("user-agent").contains("Firefox")){    //contains表示是否包含某一字符串
            System.out.println("你正在使用的是火狐浏览器");
        }else if(req.getHeader("user-agent").contains("Chrome")){
            System.out.println("你正在使用的是谷歌浏览器");
        }else {
            System.out.println("你正在使用的是其他浏览器");
        }
    }
}

 3.获取请求体数据

  request.getInputStrieam()  post方式

  requset.getueryString()   get方式

package com.qf.servlettest;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/servletdome3")
public class ServletDome3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //getQueryString获取页面所有内容(需要进一步解析),只适用与Get方式提交
//        System.out.println(req.getQueryString());
ServletInputStream inputStream = req.getInputStream();  //只适用与pots方式 byte[] bytes = new byte[1024]; int read = inputStream.read(bytes); while (read!=-1){ System.out.println(new String(bytes)); read = inputStream.read(bytes); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }

  问题:以上两种不通用,而且获取到的参数还需要进一步的解析

  所以可以使用统一方便的获取参数的方式:

 核心的API:

  request.getParameter("参数名");  根据参数名获取参数值(注意,只能获取一个值的参数)

  request.getparameterValuss("参数名");  根据参数名获取参数值(可以获取多个值的参数)

  request.getParameterName();  获取所有参数名称列表

<!-- 表单 -->
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登录</title> </head> <body> <form action="/servletDome2" method="post"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="userpassword"><br> 性别:<input type="radio" name="sex" value="man" checked>男&nbsp;&nbsp;&nbsp; <input type="radio" name="sex" value="woman">女<br> 爱好:<input type="checkbox" name="hobby" value="basketball" >篮球&nbsp;&nbsp; <input type="checkbox" name="hobby" value="football" >足球&nbsp;&nbsp; <input type="checkbox" name="hobby" value="game" checked>游戏&nbsp;&nbsp; <br> 城市:<select name="city"> <option value="zz">郑州</option> <option value="ny">南阳</option> <option value="xy">信阳</option> </select> <br> 日期:<input type="date" name="time"><br> <input type="hidden" name="id" value="giaoigaoigao"> <textarea name="inof" rows="20" cols="20"></textarea><br> <input type="submit" value="提交">&nbsp;&nbsp;&nbsp;&nbsp; <input type="reset" value="重置"> </form> </body> </html>
package com.qf.servlettest;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;

@WebServlet("/servletDome2")
public class ServletDome2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //获取表单中name的属性值的集合
        Enumeration<String> parameterNames = req.getParameterNames();

        //遍历
        while (parameterNames.hasMoreElements()){

            //获取每个name值的属性
            String parameterName = parameterNames.nextElement();
            //根据name值属性,获取value
            String parametervalue = req.getParameter(parameterName);

            if("hobby".equals(parameterName)){
                //根据name值,获取value数组
                String[] parameterValues = req.getParameterValues(parameterName);
                System.out.println(Arrays.toString(parameterValues));
            }else {
                System.out.println(parameterName + " : " + parametervalue);
            }
        }
    }
}

4.其他 

request.getContextPath() --得到当前web应用的路径

package com.qf.servlettest;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/servletdome4")
public class ServletDome4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //localhost:8080/xxx 获取到 xxx
        String contextPath = req.getContextPath();
        System.out.println(contextPath);

    }
}

 request.getRequestDispatcher(java.lang.String path).forward(request,response); --转发(类似于重定向)

package com.qf.servlettest;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/servletdome5")
public class ServletDome5 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        this.doGet(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //这里写对应的业务逻辑
        //查询数据库,判断……

        //转发:
        req.getRequestDispatcher("/login.html").forward(req,resp);
    }
}

中文乱码问题:tomcat 8 已经将乱码问题解决了
 如果出现乱码:
  get方式:String name = new String(name.getBytes("iso-8859-1"),"utf-8");
  post方式:request.setCharacterEncoding("utf-8");

 

HTTP请求消息 与 Request请求

上一篇:Json的数据定义


下一篇:Jackson解析Json