zoukankan      html  css  js  c++  java
  • servlet关于HttpServletRequest 对象

    常见方法的具体实现

    已经学习完了,Servlet的一些基本原理,现在开始进行实际的运用实现。
    文中web.xml 和 index.html是共用的代码
    回顾一下Servlet的作用:

    • 获取用户提交数据
    • 获取浏览器附加信息
    • 处理数据(访问数据库或调用接口)
    • 给浏览器产生一个响应
    • 在响应中添加附加信息

    获取请求头信息常见方法

    package com.hhxx.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    /**
     * 获取请求信息,使用的是HttpServletRequest
     * */
    public class DemoServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //返回客户端浏览器发出请求的完整URL,属于StringBuffer类型
            StringBuffer requestURL =req.getRequestURL();
           //返回请求行中制定的URI(除去主机端口)
            String requestURI= req.getRequestURI();
            //返回发送请求的主机IP地址
            String remoteAddr =req.getRemoteAddr();
            PrintWriter out = resp.getWriter();
            out.println("<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">");
            out.println("<HTML>");
            out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
            out.println(" <BODY>");
            out.println("requestURL:"+requestURL+"<br/>");
            out.println("requestURI:"+requestURI+"<br/>");
            out.println("remoteAddr:"+remoteAddr+"<br/>");
            out.println(" </BODY>");
            out.println("</HTML>");
            out.flush();
            out.close();
        }
    }
    
    

    输出结果:

    // requestURL:http://localhost:8080/demo//test.do
    // requestURI:/demo//test.do
    // remoteAddr:0:0:0:0:0:0:0:1
    

    获取请求数据

    由于会有单选框和多选框的形式因此在获取值得时候,方法是不一样的。有的是指,有的是键值对,有的是枚举。这里难度不在于使用这个方法,而在于如何把这个内容响应到浏览器页面,会涉及之前的容器内容
    需要注意的是,是请求数据,因此使用doPost提交方式下面代码主要反映主要的代码

    根据key获取指定的value,适合单选框

     //参数是表单当中的name=“”
     String username = req.getParameter("username");
    

    获取复选框(Checkbox)中的值,一个key,可能对应多个值

    //返回的是数组类型
            String[] userlikes =req.getParameterValues("userlike");
    //传入的内容必须是对象或者对象数组,不能是基本数据类型通过Arrays.asList()方法转为List类型
            List<String> strings =Arrays.asList(userlikes);
    

    由于String数组直接打印的话是对象的引用,因此需要进行遍历,可以转为List,而可以通过Arrays.toString(int[] )函数来输出;而因为List Set Map等集合类都实现了toString()方法,所以可以直接打印输出

    获取所提交数据的key

    Enumeration<String> parameterNames =req.getParameterNames();
            List<String> keys =new ArrayList<>();
            while(parameterNames.hasMoreElements()){
               //为了便于遍历,将放在List当中
             keys.add(parameterNames.nextElement());
            }
    

    该方法返回的是一个枚举类型,因此需要通过遍历获取,依旧采用List获取

    使用Map结构获取提交数据

    Map<String,String[]> parameterMap = req.getParameterMap();
     Iterator<Map.Entry<String,String[]>> iterator =parameterMap.entrySet().iterator();
            while (iterator.hasNext()){
                Map.Entry<String ,String[]> entry =iterator.next();
                out.println("keys:"+entry.getKey()+"Value:"+Arrays.asList(entry.getValue())+"<br/>");
            }
     //或者使用
     Set<Map.Entry<String,String[]>> entries = parameterMap.entrySet();
            for (Map.Entry<String, String[]> stringEntry : entries) {
               value是一个字符串数组,直接输出是对象的引用,使用Arrays.asList进行转换
       out.println("keys:"+stringEntry.getKey()+"Value:"+Arrays.asList(stringEntry.getValue())+"<br/>");
          }
    

    获取请求中所有的数据并存放到一个 Map 结构中,该方法返回一个 Map,其中 key 为 String 类型 value 为 String[]类型。

    以上调用,都是以字符形式进行的,而响应的获取使用即可

     PrintWriter out = resp.getWriter();
    

    设置数据编码

    请求的数据包基于字节在网络上传输,Tomcat 接收到请求的数据包后会将数据包中的 字节转换为字符。在 Tomcat 中使用的是 ISO-8859-1 的单字节编码完成字节与字符的转换, 所以数据中含有中文就会出现乱码,可以通过 req.setCharacterEncoding("utf-8")方法来对提交的数据根据指定的编码方式重新做编码处理。这个方法要写在其他请求方法之前,解决因输入中文,请求乱码的问题

     req.setCharacterEncoding("utf-8");
    

    获取请求头信息

    • 根据请求头中的 key 获取对应的 value。
    String header = req.getHeader("Accept-Language");
    
    • 获取请求头中所有的 key,该方法返回枚举类型。获得所有key之后,可以通过getHeader()获得值
     Enumeration<String> headerNames =req.getHeaderNames();
     PrintWriter out = resp.getWriter();
      while (headerNames.hasMoreElements()){
                String key =  headerNames.nextElement();
                String value = req.getHeader(key);
                out.println("key:"+key+" Value:"+value+"<br/>");
    
            }
    

    HttpServletRequest 对象的生命周期

    当有请求到达 Tomcat 时,Tomcat 会创建 HttpServletRequest 对象,并将该对象通过参数 的方式传递到我们 Servlet 的方法中,当处理请求处理完毕并产生响应后该对象生命周期结束。

    补充 请求方式get和post区别

    get

    向指定的资源发出“显示”请求。GET 请求中会将请求中传递的数据包含在 URL 中并在 浏览器的地址栏中显示。GET 请求传递数据时要求数据必须是 ASCII 字符。GET 请求可以被 浏览器缓存。
    GET - 从指定的服务器中获取数据

    post

    向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包 含在请求体中。POST 请求传递数据时,数据可以试试 ASCII 字符也可以是字节型数据,默认 为字符型。POST 请求默认情况下不会被浏览器所缓存。
    POST - 提交数据给指定的服务器处理

    区别

    • get在浏览器回退时是无害的,而post会再次提交请求(get方式不会发送请求,post的则会向url发出请求)
    • get产生的url地址可以被bookmark(添加到书签),post的不行
    • get请求会被浏览器主动缓存(cache),而post不会,除非手动
    • get请求只能进行url编码,而post支持多种编码
    • get请求参数会被完整保留在浏览器历史记录中(因为是在url中传递的,而历史记录保存的是url),而post中参数不会被保留(只会保留post请求参数,而提交数据不会保留)
    • get请求在url中传送有长度限制,而post没有。对参数的数据类型get只支持ASII字符,而post可以是字符和字节
    • post更安全,因为get参数直接暴露在url上,因此不能用来传递敏感信息
    • get参数通过url传递,post放在请求体中(request body)
    悲观者正确,乐观者成功
  • 相关阅读:
    课后作业-阅读任务-阅读提问-3
    团队-团队编程项目作业名称-项目进度
    结对-结对编项目作业名称-测试过程
    结对-英文词频检测-开发过程
    20171002-构建之法:现代软件工程-阅读笔记2
    课后作业-阅读任务-阅读提问-2
    团队-团队编程项目作业名称-代码设计规范
    结队-结队编程项目作业名称-项目进度
    课后作业-阅读任务-阅读提问-1
    结队-贪吃蛇-项目进度
  • 原文地址:https://www.cnblogs.com/freebule/p/13643001.html
Copyright © 2011-2022 走看看