zoukankan      html  css  js  c++  java
  • 【Web入门系列】初探HttpServletRequest

    学习HttpServletRequest之前,先来要搞清楚http请求中GET请求和POST请求的区别。

    GET请求与POST请求区别

    1、GET请求方式,请求参数会跟在URI后面;POST请求方式,请求参数不会跟在URI后面,而是放在在实体内容里。

    2、GET请求方式,提交参数数据有大小限制,不超过1KB;POST请求参数没有大小限制。

    3、GET请求方式,不适合提交敏感数据;POST请求方式可以用来提交敏感数据。

    默认GET提交方式,只有POST请求方式才有实体内容

    HttpServletRequest获取请求行、请求头、实体

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

    获取请求资源:request.getRequetURI()   / request.getRequetURL()   

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

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

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

    获取实体内容:request.getInputStream() 

    public class RequestDemo extends HttpServlet {


    /**
    * 注意:tomcat服务器首先会调用servlet的service方法,然后在service方法中再根据请求方式来分别调用对应的doXX方法
    * (例如,如果是GET请求方式,在service方法中调用doGet方法)
    * 因为最常的请求方式是GET 和POST,所以编写servlet程序,只需要覆盖doGet和doPost即可.
    * @param request
    * @param response
    * @throws ServletException
    * @throws IOException
    */
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    System.out.println("service方法被调用");
    System.out.println(request.getMethod());
    }

    /**
    * tomcat服务器接收到浏览器发送的请求数据,然后封装到HttpServletRequest对象
    * tomcat服务器调用doGet方法,把request对象传入到servlet中
    * @param request
    * @param response
    * @throws ServletException
    * @throws IOException
    */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    t1(request);

    t2(request);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    doGet(request,response);

    /**
    * 3.3 请求的实体内容
    */
    //得到实体内容
    InputStream in = request.getInputStream();
    byte[] buf = new byte[1024];
    int len = 0;
    while( (len=in.read(buf))!=-1 ){
    String str = new String(buf,0,len);
    System.out.println(str);
    }
    }

    private void t1(HttpServletRequest request) {
    /**
    * 3.1 请求行 格式:(GET /day09/hello HTTP/1.1)
    */
    System.out.println("请求方式:"+request.getMethod());
    System.out.println("URI:"+request.getRequestURI());
    System.out.println("URL:"+request.getRequestURL());
    System.out.println("http协议版本:"+request.getProtocol());
    }

    private void t2(HttpServletRequest request) {
    /**
    * 3.2 请求头
    */
    //根据头名称的到头的内容
    String host = request.getHeader("Host");
    System.out.println(host);
    //得到所有的请求头名称列表
    Enumeration<String> enums = request.getHeaderNames();
    //判断是否有下一个元素
    while(enums.hasMoreElements()){
    //取出下一个元素
    String headerName = enums.nextElement();
    String headerValue = request.getHeader(headerName);
    System.out.println(headerName+":"+headerValue);
    }
    }

    }

    HttpServletRequest获取请求参数

    获取GET方式参数:request.getQueryString();

    获取POST方式参数:request.getInputStream();

    上面两种方法我们可以分别获取到GET和POST方式提交的请求参数,但是这样不是很统一,而且获取到的参数还需要进一步地解析。

    request.getParameterValues(String name)是获得如checkbox类(名字相同,但值有多个)的数据。接收数组变量,如checkobx类型 

    request.getParameter(String name)是获得相应名的数据,如果有重复的名,则返回第一个的值.。接收一般变量,如 text类型

    request.getParameterNames() 获取所有参数名称列表:   

    public class RequestParamServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    /**
    * 设置参数查询的编码
    * 该方法只能对请求实体内容的数据编码起作用。POST提交的数据在实体内容中,所以该方法对POST方法有效!
    * GET方法的参数放在URI后面,所以对GET方式无效。
    */
    request.setCharacterEncoding("utf-8");

    /*System.out.println("GET方式");
    //接收GET方式提交的参数
    String value = request.getQueryString();
    System.out.println(value);*/

    /**
    * 统一方便地获取请求参数的方法
    */
    //根据参数名得到参数值
    String name = request.getParameter("name");
    /**
    * 手动重新解码(iso-8859-1 字符串-> utf-8 字符串)
    */
    if("GET".equals(request.getMethod())){
    name = new String(name.getBytes("iso-8859-1"),"utf-8");
    }
    System.out.println("name:"+name);

    String password = request.getParameter("password");
    System.out.println("password:"+password);

    System.out.println("=============================");
    Enumeration<String> enums = request.getParameterNames();
    while( enums.hasMoreElements() ){
    String paramName = enums.nextElement();
    String paramValue = request.getParameter(paramName);
    System.out.println(paramName+":"+paramValue);
    }

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    /*System.out.println("POST方式");
    InputStream in = request.getInputStream();
    byte[] buf = new byte[1024];
    int len = 0;
    while((len=in.read(buf))!=-1 ){
    System.out.println(new String(buf,0,len));
    }*/

    doGet(request,response);

    }

    }
  • 相关阅读:
    百度编辑器图片在线流量返回url改动
    谋哥:悟马道长第一句话之“不要赚屌丝的钱”
    HDOJ 题目3518 Boring counting(后缀数组,求不重叠反复次数最少为2的子串种类数)
    mysqlbinlog高速遍历搜索记录
    推断整数、推断邮箱、推断手机号码、推断邮政编码、推断中文
    用筛选法求100以内的素数(数组)
    【DataStructure】One of queue usage: Simulation System
    Registry Connect failed,Windows服务诊断
    Struts2 的工作原理
    vue上传图片到服务器
  • 原文地址:https://www.cnblogs.com/ysdrzp/p/9862312.html
Copyright © 2011-2022 走看看