JavaWeb学习篇之----容器Request详解

xiaoxiao2021-02-28  71

前篇说到了Response容器对象,这篇我们就来看一下Request容器对象,之前也说过了,这个两个容器对象是相对应的,每次用户请求服务器的时候web容器就会给创建这对容器对象,他们是共存亡的,当然Request除了有一个容器对象的角色,他还有一个角色就是Request域,我们之前在讲解Servlet的时候,说到一个ServletContext域,这个域的范围是整个web应用,这里的Request域的范围就小了,他只是一次用户的请求内,即用户发送一个请求的时候,Request创建,当用户关闭这次请求的时候Request就会消亡的。

下面就来看一下Request的相关方法:

getContextPath():这个方法返回的是web应用映射的虚拟目录地址:如ServletDemo应用的虚拟目录是:/ServletDemo

getCookies():这个方法返回的是一个Cookies[],我们在response容器那篇文章中看一个方法是向response容器中存入一个cookie的,这个方法是从Request容器中拿取多个cookies,因为用户在请求的时候会携带很多的cookie,关于Cookie的相关知识,我们会在后面的文章中进行详解

getHeader(String name)/getIntHeader(String name)/getDateHeader(String name):这些方法是获取请求头信息的,只是针对不同的类型的,有字符串类型的,时间类型,数值类型的

getHeaderNames():这个方法是获取所有请求头的字段名称

getHeaders(String name):这个方法是获取一个请求头字段的所有值,因为有时候可能会有相同请求头字段信息,不会覆盖的

getMethod():这个方法是获取客户机的请求方法

getQueryString():这个方法是获取用户请求时的查询参数的,即url后面携带的参数,如:http://localhost:8080/ServletDemo/ServletRequest?username=jiangwei&password=123456,那么getQueryString()方法返回来的值就是username=jiangwei&password=123456

getRequestSessionId():这个方法是获取客户机在请求的时候携带的sessionid值,有关session的相关知识,后面会详解

getRequestURL():这个方法是获取客户机请求的url

getServletPath():这个方法返回的是请求的Servlet的映射路径,比如:ServletRequest映射的是是/ServletRequest

getServerName()/getServerPort():这两个方法是获取服务器的名称和端口号,比如localhost,8080

getSession()/getSession(boolean mode):这两个方法是获取一个session对象,相关之后在session篇会说到

getAttribute(String name):这个方法是从Request域中获取值

getAttributeNames():这个方法是获取Request域中获取所有的字段名称

getParameter(String name):这个方法是获取用户使用get/post方式携带的参数值

getParameterNames():这个方法是获取用户请求时携带的所有参数名称

getParameterMap():这个方法是获取用户请求时携带的参数名称和参数值,并将其组装成一个Map对象

getParameterValues():这个方法是获取用户请求携带的参数值,因为有时候一个参数名称可能对应多个值

setAttribute(String name,Object value):这个方法是设置Request域中的属性值

removeAttribute(String name):这个方法是删除Request域中的属性值

getInputStream()/getReader():这个方法是获取用户请求的时候上传的输入流,比如我们在处理用户上传文件的时候。需要用到这个输入流

setCharacterEncoding(String name):这个方法是设置Request容器的编码

getRemoteAddr()/getRemoteHost():获取客户机的IP地址和主机名

getProctocol():获取协议名称

getRequestDispatcher(String path):获取一个转发对象RequestDispatcher,进行转发操作

下面就通过实例来看一下上面方法的使用:

[java]  view plain  copy public void test1(HttpServletRequest request) throws Exception{           //有时候可能有多个name           String[] nameAry = request.getParameterValues("username");           //在获取用户的请求数据的时候先要进行判断数据的有效性,然后再去使用,提高应用的健壮性           if(nameAry != null){               System.out.println("getParameterValues方法");               System.out.println("---------------------");               System.out.println("参数名称:username");               for(int i=0;i<nameAry.length;i++){                   System.out.println(nameAry[i]+",");               }               System.out.println();           }                      System.out.println("getParameterMap方法");           System.out.println("------------------");           Map<String,String[]> map = request.getParameterMap();           if(map != null){               Set<Entry<String,String[]>> set = map.entrySet();               Iterator<Entry<String,String[]>> iterator = set.iterator();               while(iterator.hasNext()){                   Entry<String,String[]> entry = iterator.next();                   System.out.println("参数名:"+entry.getKey());                   String[] values = entry.getValue();                   if(values != null){                       for(int i=0;i<values.length;i++){                           System.out.print(values[i]+",");                       }                       System.out.println();                   }               }           }           System.out.println();                      System.out.println("getParameterNames()方法");           System.out.println("----------------------");           Enumeration names = request.getParameterNames();           if(names != null){               while(names.hasMoreElements()){                   String name = (String) names.nextElement();                   System.out.println("参数名:"+name);                   System.out.println("参数值:"+request.getParameter(name));               }           }                  }  

这里我还需要设计一个demo.jsp,在里面设计一个表单进行数据的上传:

[html]  view plain  copy <form action="/ServletDemo/ServletRequest" method="post">           用户名1:<input type="text" name="username"/><br/>           用户名2:<input type="text" name="username"/><br/>           密码:<input type="text" name="password"/><br/>           <input type="submit" value="提交"/>   </form>   我们传递了两个参数名称为:username的字段,我们在浏览器中输入:http://localhost:8080/ServletDemo/demo.jsp,然后打印结果:

getParameterValues方法 --------------------- 参数名称:username aaa, bbb, getParameterMap方法 ------------------ 参数名:username aaa,bbb, 参数名:password 123, getParameterNames()方法 ---------------------- 参数名:username 参数值:aaa 参数名:password 参数值:123

下面我们再来看一下request的乱码问题:

我们还是直接使用demo.jsp中的方式传递参数,当我们在页面文本框中输入"中国"

在控制台中打印获取到的username的值,显示的是??,这个是因为Request域中的采用的是ISO8859-1码表的,而我们的demo.jsp使用的是utf-8编码的,所以当我们点击提交的时候,浏览器会将"中国"使用utf-8码表编码,然后web容器创建一对request/response容器对象,数据传入到request容器中,因为request容器使用的是iso8859-1编码的,所以当我们在Servlet中从request容器中读取数据,使用的是iso8859-1进行解码的,所以会出现乱码了,所以我们只需要将request的容器码表设置成和我们页面显示的码表一样就可以了。这样我们在getParameter的时候得到正确的解码(utf-8)数据

[java]  view plain  copy request.setCharacterEncoding("utf-8");   String name = request.getParameter("username");   System.out.println("username:"+name);   这时候就可以了,就能够正常显示了。

但是问题还没有结束,以上说到的乱码问题是在使用post方式传递的数据,下面我们在来看一下使用get方式传递数据的乱码问题,

昨天突然发现request.setCharacterEncoding("UTF-8")这句代码失效,前后台编码统一都是UTF-8,但通过request.getParameter("name")接收到的表单数据依然乱码,后来发现原因是表单的提交方式没有设置,也就是采用了默认的 GET 方式提交。  那为什么 GET 方式会出现问题?难道request.setCharacterEncoding("UTF-8")这句代码只对POST方式提交数据才有效?  做了一些测试之后总结出了一点规律:  1、web浏览器对页面上通过 GET 方式提交的数据会进行URL编码,采用的编码方式通常由html页面上  <meta http-equiv="content-type" content="text/html; charset=UTF-8">  这个标签内的charset所指定的编码方式决定(前提是:没有自定义浏览器发送数据的编码设置)。比如现在charset="UTF-8",那么当采用get方式提交表单的时候,web浏览器默认会采用UTF-8的编码方式对数据进行编码。 所以,当请求的URL如下时:  http://localhost:8080/test/TestServlet?name=中国  其实真实内容是这样:  http://localhost:8080/test/TestServlet?name=中国  其中中国是对‘中国’二字采用了UTF-8的URL编码之后产生的字符串。  2、所以,当数据被发送到Web服务器上的时候(测试使用tomcat6),服务器要做的一件事就是解码中国这个字符串。那么如何解码这个字符串?   3、在JDK的java.net包下面有一个类叫做URLDecoder,该类即可对URL编码之后的字符串进行解码,如:  [java]  view plain  copy URLDecoder.decode("中国","UTF-8");    返回解码之后的字符串,第二个参数是指采用何种字符集解码"中国"这个字符串。打印以上代码成功显示“中国”二字,说明解码正确!  4、前面已经说过了:web服务器会自行解码中国这个字符串,但是我们通过request.getParameter("name")得到的却是乱码,所以问题一定出在web服务器在解码E4
转载请注明原文地址: https://www.6miu.com/read-80927.html

最新回复(0)