• Servlet的学习之Request请求对象(1)


      在本篇中开始对Servlet中的HttpServletRequest请求对象进行学习,请求对象同响应对象一样,我们可以根据该对象中的方法获取例如请求行,请求头和请求实体数据的方法。

      在本篇中先对HttpServletRequest对象中的常用方法进行介绍和学习:

      通过getMethod方法获得的是客户端访问该web应用的Http请求方式。

    代码和结果如下:

    1     String requestMethod = request.getMethod();
    2     System.out.println(requestMethod);    

      

      想获取客户端发来的HTTP请求头中的内容可以使用如下方法:

    getDateHeader()

    getHeader(String)

    getHeaderNames()

    getHeaders(String)

    getIntHeader(String);

    这些方法在各个特定的情况下能有不同的用途,体现出获取客户端请求头方式的多样性。

      如通过getHeader(String)可以获取指定请求头的数据内容:

    1     String connectionState = request.getHeader("Connection");
    2     System.out.println(connectionState);

    而通过getHeaderNames()可以获取发送的所有请求头,例:

    1     Enumeration e = request.getHeaderNames();
    2     while(e.hasMoreElements()) {
    3       String headerName = (String) e.nextElement();
    4       String headerValue = request.getHeader(headerName);
    5       System.out.println(headerName+":"+headerValue);
    6     }

      

    而通过getHeaders(String)方法获取的是某个同名头的内容,适用于当某个请求头有多个内容时使用。

    介绍完获取请求行和请求头,下面介绍获取请求数据中内容的方法:

    getPatameter(String)

    getParameterNames()

    getParameterValues(String)

    getParameterMap()

    和getInputStream()

          

      使用getPatameter(String)方式可以获取请求数据中指定的数据值

    代码如下:

    1     String value = request.getParameter("username");
    2     System.out.println(value);

    通常可以在浏览器地址URL后直接写入参数数据来模拟GET方式:

      

    最终在控制台得到:

      

      通过getParameterNames()可以获取多个参数:

    1     Enumeration e = request.getParameterNames();
    2     while(e.hasMoreElements()) {
    3         String paramName = (String)e.nextElement();
    4         String paramValue = request.getParameter(paramName);
    5         System.out.println(paramName+":"+paramValue);
    6     }

      

      

      使用getParameterValues(String)有助于获取当请求数据参数名有相同时的情况:

    比如下面这种情况:

      

    代码:

    1     String[] values = request.getParameterValues("username");
    2     for(int i=0;i<values.length;i++) {
    3         System.out.println(values[i]);
    4     }

    在控制台观察:

      

    (注意:像getPatameter(String)、getParameterValues(String)等等这样的方法,都要小心空指针异常,可能的原因在于并没有这样的参数,还有一种就是在URL后没有任何参数传入,所以要特别注意,应该加入健壮性判断。这也是编程过程中会碰到传入参数都应该注意的问题。)

      使用getParameterMap()可以获取以请求数据中参数和参数值作为的键值对的Map集合。这样我们就能同时获取键值对。假设有如下情况:

      

    代码为:

    1   Map<String,String[]> map = request.getParameterMap();
    2   for(Map.Entry<String, String[]> entry :map.entrySet()) {
    3         String paramName = entry.getKey();
    4         for(int i=0;i<entry.getValue().length;i++){
    5             String paramValue = entry.getValue()[i];
    6             System.out.println(paramName+":"+paramValue);
    7         }
    8     }

    如果请求数据参数为:

      

    那么在控制台上看到的则是:

      

      以上说明了常用的获取数据的方式,还有一种属于request响应对象的getInutStream方法,而这个方法一般只用于大容量的数据获取,比如文件上传,将在之后的篇章中介绍。

    下面介绍其他常用方法

      通过getRequestURI方法和getRequestURL可以获取http请求服务器资源的URI和URL,关于URI和URL的区别可以通过获取后的字符串来查看:

    代码:

    1     String fileURI = request.getRequestURI();
    2     System.out.println("URI: "+fileURI);
    3 
    4     StringBuffer fileURL = request.getRequestURL();
    5     System.out.println("URL: "+fileURL.toString());

    访问该Servlet,得到:

      

    可以看出URI只包括在服务器中的web应用名和资源对外访问路径(虚拟目录)。

     

      通过getQueryString()方法可以获取URL上由GET方式带来的参数:

    若代码为:

    1     System.out.println(request.getQueryString());

    而我在访问这个Servlet的URL上添加:“?username=fjdingsd&password=123”:

      

    那么当访问这个Servlet之后,在MyEclipse的控制台将看到:

      

      通过getRemoteAddr方法可以获取访问该web应用的客户端IP地址。

    代码:

    1 System.out.println(request.getRemoteAddr());

      而通过getRemoteHost方法获取的是访问该web应用的客户端主机名,如果没有在DNS服务器上注册的则是获取IP地址。这里说的主机名是指在DNS上注册的,比如www.baidu.com,那么通过该方法如果从该主机上来访问,则获取到的是:baidu.com。

  • 相关阅读:
    IServiceBehavior, IOperationBehavior,IParameterInspector
    System.IO.Pipelines——高性能IO(三)
    System.IO.Pipelines——高性能IO(二)
    System.IO.Pipelines——高性能IO(一)
    背包问题 —— 四种解法解题
    波音,自动驾驶bug未修复,致346人丧生!5个月内两次坠毁!其中,包括8名中国公民
    2018年Java生态行业报告
    为什么大公司一定要使用DevOps?
    设计微服务的最佳实践
    Spring Boot面试题
  • 原文地址:https://www.cnblogs.com/fjdingsd/p/4854889.html
Copyright © 2020-2023  润新知