关于HttpServletRequest对象

深入体验的JavaWeb开发内幕 - 关于HttpServletRequest对象

HttpServletRequest的对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的相关方法,即可以获得客户的这些信息。

一,通过请求常用方法获得相关信息:

如图1所示,通过请求常用方法获得客户机信息

  •     getRequestURL方法返回客户端发出请求时的完整URL。
  • getRequestURI方法返回请求行中的资源名部分。
  • getQueryString方法返回请求行中的参数部分。
  • 的getRemoteAddr方法返回发出请求的客户机的IP地址
  • getRemoteHost方法返回发出请求的客户机的完整主机名
  • getRemotePort方法返回客户机所使用的网络端口号
  • getLocalAddr方法返回WEB服务器的IP地址。
  • 号·getLocalName方法返回WEB服务器的主机名
  • getMethod得到客户机请求方式

例如在请求。的Java中加入如下代码:

[java]  查看纯 文本  
  1. //返回相关请求的信息  
  2.            String uri = request.getRequestURI();  
  3.               Stringrad = request.getRemoteAddr();  
  4.               Stringrh = request.getRemoteHost();  
  5.               Stringru = request.getRemoteUser();  
  6.               intrp = request.getRemotePort();  
  7.               Stringcp = request.getContextPath();  
  8.               Stringla = request.getLocalAddr();  
  9.               Stringce = request.getCharacterEncoding();  
  10.               Stringgm = request.getMethod();  
  11.               Stringqs = request.getQueryString();  
  12.    
  13.               的System.out.println(URI);  
  14.               的System.out.println(弧度);  
  15.               的System.out.println(RH);  
  16.               的System.out.println(RU);  
  17.               的System.out.println(RP);  
  18.               的System.out.println(CP);  
  19.               的System.out.println(LA);  
  20.               的System.out.println(CE);  
  21.               的System.out.println(克);  
  22.               的System.out.println(适量);  

  即可获取相关信息。

2,通过请求常用方法获得客户机请求头信息

  •   getHead(名称)方法
  •   getHeaders(String name)方法
  •   getHeaderNames方法 

如:

[java]  查看纯 文本  
  1. private void  getRequestValue(HttpServletRequest request){   
  2.         //获得客户机请求头及请求头的值  
  3.         System.out.println(request.getHeader(“method” ));  
  4.         枚举e = request.getHeaderNames();  
  5.         while (e.hasMoreElements()){  
  6.             String name =(String)e.nextElement();  
  7.             String value = request.getHeader(name);  
  8.             System.out.println(name + “:” + value);  
  9.         }  
  10.     }  


3.获得客户机请求参数(客户端提交的数据)

  •   的getParameter(名称):获取指定名称的参数值这是最为常用的方法之一。
  •   getParameterValues(String name):获取指定名称参数的所有值数组。它适用于一个参数名对应多个值的情况。如页面表单中的复选框,多选列表提交的值。
  •   getParameterNames():返回一个包含请求消息中的所有参数名的枚举对象通过遍历这个枚举对象,就可以获取请求消息中所有的参数名
  •   getParameterMap():返回一个保存了请求消息中的所有参数名和值的地图对象.MAP对象的键是字符串类型的参数名,值是这个参数所对应的对象类型的值数组。

二,请求的常见应用

1,各种表单输入项数据的获取

如可以获取表单中的文本,密码,收音机,复选框,文件,选择,文本,隐藏,图像,按钮等组件的值进行数据库操作或其他处理操作。

来看一个具体应用:


界面代码主体部分如下:

 

[html]  查看纯 文本  
  1.  Register.html  
  2. <!DOCTYPE HTML PUBLIC“ - // W3C // DTD HTML 4.01Transitional // EN” >  
  3. html >  
  4.  head >  
  5.    title Register.html </ title >  
  6.         
  7.     metahttp-equiv metahttp-equiv =“keywords” content =“keyword1,keyword2,keyword3” >  
  8.     metahttp-equiv metahttp-equiv “description” content “这是我的页面” >   
  9.    meta http-equiv “content-type” content “text / html; charset = UTF-8” >    
  10.      
  11.    <! - <link rel =“stylesheet”type =“text / css”href =“./ styles.css”> - >  
  12.    
  13.  </ head >  
  14.    
  15.  body >  
  16.  form action  = “RequestLogin” method  = “post” >    
  17.     用户名:输入类型= “文本” 名称 = “用户名”  BR />   
  18.     密码:   的inputType 的inputType “密码” 名称 =  “密码” BR />   
  19.   性别:input type =“radio” name  =“sex”  value  = “male” 男   
  20.      输入类型“无线电” 名称 =  “性别” 的值“女” BR />     
  21.   籍贯:  select name “city” >   
  22.        option value  = “HeBei” 河北</ option >   
  23.        opton value  = “HuBei” 湖北</ opton >   
  24.        option value  = “ShanXi” 山西</ option >   
  25.      </ 选择BR />  
  26. 简历:BR />  
  27.   &NSP; textarea rows “5” cols “20” name “intro” </ textarea >     
  28. BR />  
  29. 爱好:BR />  
  30. input type “checkbox” name “hobbies” value  = “sing” /> 唱歌     
  31. input type “checkbox” name “hobbies” value  = “dance” /> 跳舞     
  32. input type “checkbox” name “hobbies” value  = “readbook” /> 读书     
  33. 输入类型“复选框” 名称“爱好”  = “readnewspaper” /> 看报BR />     
  34. 上传头像:BR />  
  35. 输入类型“文件” “图像” 名称 = “浏览器” BR />     
  36. input type “submit” value “提交” />    
  37.  </ form >  
  38.    
  39.  </ body >  
  40. </ html >  

然后,定义一个RequestLogin.java类通过请求对象获取表单中组件的值:

如调用自定义方法:

[java]  查看纯 文本  
  1. private void  getInformation(HttpServletRequest request)   
  2. 抛出 UnsupportedEncodingException {  
  3. //取出参数值   
  4. String name = request.getParameter(“username” );   
  5. String pass = request.getParameter(“password” );   
  6. String sex = request.getParameter(“sex” );   
  7. String city = request.getParameter(“city” );   
  8. String intro = request.getParameter(“intro” );   
  9. String [] hobbies = request.getParameterValues(“hobbies” );   
  10. 字符串hobby = “” ;   
  11. //爱好!= NULL对所取值为空时进行设置   
  12. for int  i = ; hobbies!= null && i <hobbies.length; i ++)  
  13. {String hovalue = hobbies [i]; 爱好+ = hovalue; }   
  14. //获取头像信息// String image = request.getParameter(“image”);   
  15. System.out.println(“username:” + name);   
  16. System.out.println(“password:” + pass);   
  17. System.out.println(“sex:” + sex); System.out.println(“city:” + city);   
  18. System.out.println(“intro:” + intro); System.out.println(“hobby:” + hobby);}  

即可获取表单中组件的值。

 

2,请求参数的中文乱码问题

前面我们提到了响应对象中出现乱码问题及相应的解决措施,那么在申请中如何解决编码问题呢?

下面来看具体的例子:

例如我想将一个形成表单中的信息提取到并在控制台输出如图:

 

假设在服务端并未请求对象给指定编码时即服务器端接收请求的字符编码为ISO8859-1,这时你在客户端添加信息如:


当填入的信息有中文时,假设设置表单的提交方式为邮寄方式提交

则在服务端输出如下:


此时输出结果出现乱码。

客户端主体代码同上:

[html]  查看纯 文本  
  1. Register.html  
  2.   body >  
  3.   form action  = “RequestLogin” method  = “post” >    
  4.     用户名:输入类型“文本” 名称 =  “用户名” BR />     
  5.     密码:   输入类型“密码” 名称 =  “密码” BR />    
  6.   性别:input type “radio” name  =  “sex” value  = “male” 男     
  7.       输入类型“无线电” 名称 =  “性别” 的值 = “女” BR />     
  8.   籍贯:  select name  = “city” >   
  9.         option value  = “HeBei” 河北</ option >   
  10.         opton value  = “HuBei” 湖北</ opton >   
  11.         option value  = “ShanXi” 山西</ option >   
  12.       </ 选择BR />  
  13. 简历:BR />  
  14.    &NSP; textarea rows “5” cols “20” name  = “intro” </ textarea >     
  15. BR />  
  16. 爱好:BR />  
  17. input type “checkbox” name  = “hobbies” value  = “sing” /> 唱歌     
  18. input type “checkbox” name  = “hobbies” value  = “dance” /> 跳舞     
  19. input type “checkbox” name  = “hobbies” value  = “readbook” /> 读书     
  20. 输入类型“复选框” 名称 = “爱好”  = “readnewspaper” /> 看报BR />     
  21. 上传头像:BR />  
  22. 输入类型“文件”  = “图像” 名称 = “浏览器” BR />     
  23. input type “submit” value  = “提交” />    
  24.   </ form >  
  25.   </ body >  

服务端主体代码如下:

[java]  查看纯 文本  
  1. RequestLogin.java  
  2.  net.csdn.request;  
  3. import  java.io.IOException;  
  4. import  java.io.PrintWriter;  
  5. importjava.io.UnsupportedEncodingException;  
  6. import  javax.servlet.ServletException;  
  7. import  javax.servlet.http.HttpServlet;  
  8. importjavax.servlet.http.HttpServletRequest;  
  9. importjavax.servlet.http.HttpServletResponse;  
  10. public class  RequestLogin extendsHttpServlet   
  11. {  
  12. public void  doGet(HttpServletRequest request,HttpServletResponse response)   
  13. 抛出 ServletException,IOException  
  14. {  
  15. getInformation(请求);  
  16. }  
  17. private  voidgetParameter(HttpServletRequest request)  
  18. 抛出 UnsupportedEncodingException  
  19. {  
  20. private  voidgetInformation(HttpServletRequest请求)  
  21. 抛出 UnsupportedEncodingException {  
  22. //取出参数值  
  23. String name = request.getParameter(“username” );  
  24. String pass = request.getParameter(“password” );  
  25. String sex = request.getParameter(“sex” );  
  26. String city = request.getParameter(“city” );  
  27. String intro = request.getParameter(“intro” );  
  28. String [] hobbies = request.getParameterValues(“hobbies” );  
  29. 字符串hobby = “” ;  
  30. //爱好!= NULL对所取值为空时进行设置  
  31. for (inti = ; hobbies!= null && i <hobbies.length; i ++)  
  32. {String hovalue = hobbies [i]; 爱好+ = hovalue; }  
  33. //获取头像信息// String image = request.getParameter(“image”);  
  34. System.out.println(“username:” + name);  
  35. System.out.println(“password:” + pass);  
  36. System.out.println(“sex:” + sex); System.out.println(“city:” + city);  
  37. System.out.println(“intro:” + intro); System.out.println(“hobby:” + hobby);}  
  38. public void  doPost(HttpServletRequestrequest,HttpServletResponse响应)   
  39. 抛出 ServletException,IOException {doGet(request,response);}}  

这里会出现乱码问题,是因为你在RegisterLogin.java中并没有给请求对象设置编码集,而请求对象的默认编码集是ISO8859-1是不支持汉字的,所以你只需要在此类中为其指示相应的编码即可:
改正:在doGet方法中加入如下代码指明接收请求的编码方式:
  request.setCharacterEncoding(“utf-8”); 
即可输出:

但是这种修改方式只在提交方式为后时才有效。当提交方式为get时是不起作用的。
即; 
<form action =“RequestLogin”method =“get”> 
时即便在

RequestLogin.java 
中再设置
  request.setCharacterEncoding( “UTF-8”); 
也不会起任何作用了程序还会输出如图所示信息:


就这时需要在
RequestLogin.java 
中含有中文English的地方进行如下设置了即在的doGet方法中加入如下代码:
[java]  查看纯 文本  
  1. String username =  new  String(name.getBytes(“iso8859-1” ),“utf-8” );  
  2.          String introduction =  new  String(intro.getBytes(“iso8859-1” ),“utf-8” );  
  3.  System.out.println(“username:” + username);  
  4.            System.out.println(“password:” + introduction);  
此时再度测试时就OK了!如图

好了到这里,你大概已经知道该如何对响应和请求对象中的乱码问题进行操作了吧!

3,防盗链

      所谓的防盗链就是当你以一个非正常渠道去访问某一个网站资源的时候,服务器会将你的请求忽略并且将你的当前请求变为按正常渠道访问时的请求并返回到相应的页面,用户只有通过该页面中的相关操作去访问想要请求的最终资源。

        例如,你有一个访问某资源的网址,但是你事先不知道这个网址是有防盗链的,那么当你输入该网址时你可能会发现,并没有马上跳转到你想要的资源页面而是一些无关的信息页面,但是就是在这些信息页面中你发现有一个超链接或是其他操作可以跳转到你所访问的最终资源页面。

      这就是防盗链技术了,好了来看一个具体应用:

Rquest.java

[java]  查看纯 文本  
  1. public class  Request  扩展 HttpServlet {   
  2. public void  doGet(HttpServletRequest request,HttpServletResponse response)   
  3. 抛出 ServletException,IOException {getDoorChain(request,response);}  
  4.     private void  getDoorChain(HttpServletRequest request,   
  5.             HttpServletResponse响应)  throws  IOException {  
  6. //通过请求获取请求头参数         
  7.  String referer = request.getHeader(“referer” );  
  8.         if (referer == null  ||!referer.endsWith(“http:// localhost:8080 / Request / index.jsp” )){  
  9.     response.sendRedirect(“http:// localhost:8080 / Request / index.jsp” );  
  10.             返回;  
  11.         }  
  12.         response.setCharacterEncoding(“utf-8” );  
  13.         response.setContentType(“text / html; charset = utf-8” );  
  14.         PrintWriter pw = response.getWriter();  
  15.         pw.write(“喜剧片”东成西就“” );  
  16.     }  
  17. public void  doPost(HttpServletRequest请求,HttpServletResponse响应)   
  18.             抛出 ServletException,IOException {  
  19.         doGet(请求,响应);  
  20.     }  
  21. }  

 index.jsp的部分的主体代码:

[html]  查看纯 文本  
  1. body >  
  2.   这里是防盗链技术的应用检测!  BR >  
  3.   一个HREF  = “/请求/请求” 喜剧片  </ >    
  4.   </ body >  
  5. </ html >  

效果如图:


例如我最终想要通过http:// lcoalhost:8080 /请求/请求这个网址获取到我想要的“东成西就” 
的资源可当当我真正的输入这个网址时,却转到了:
http: /localhost:8080/Request/index.jsp这个页面

 

只有当你点击“喜剧片”这个超链接时才会真正的得到你想要的资源页面即:

 


好了赶快自己动手试一试吧!

4,请求对象实现请求转发:

 servlet API中定义了一个RequestDispatcher接口,俗称请求分派器。它定义了如下两个方法:public void forward(ServletRequest request,ServletResponseresponse),public void include(ServletRequest request,ServletResponse response)

获取RequestDispatcher的实例的方式主要有两种:

  1.  调用ServletContext的接口提供的的getRequestDispatcher(Stringurl)方法。
  2. 调用的ServletRequest接口提供的的getRequestDispatcher(Stringurl)方法。

RequestDispatcher的:

  被包含的的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略。

 例:

的request.getRequestDispatcher( “./ Welcome.jsp中 ”)向前(请求,响应);即可从当前应用跳转到相应的“ ./Welcome.jsp” 页面。

请求对象提供了一个的getRequestDispatcher方法,该方法返回一个RequestDispatcher的对象,调用这个对象的前进方法可以实现请求转发。 

请求对象同时也是一个域对象,开发人员通过请求对象在实现转发时,把数据通过请求对象带给其它网络资源处理。

可通过如下方法对请求中的数据对象进行操作:

  • setAttribute方法;
  • getAttribute方法
  • 方法的removeAttribute;
  • getAttributeNames方法;

三,关于请求转发的一些细节

  1. 转发方法用于将请求转发到RequestDispatcher的对象封装的资源。
  2. 如果在调用转发方法之前,在Servlet的程序中写入的部分内容已经被真正地传送到了客户端,向前方法将抛出IllegalStateException异常异常。
  3. 如果在调用前向方法之前向Servlet引擎的缓冲区(响应)中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效。

四,请求重定向和请求转发的区别

    一个网络资源收到客户端请求后,通知服务器去调用另外一个网络资源进行处理,称之为请求转发。

   一个网络资源收到客户端请求后,通知浏览器去访问另外一个网页资源,称之为请求重定向。

注意:

  1. RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。如果传递HttpServletResponse.sendRedirect方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前的WEB应用程序的根目录。
  2. 调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
  3. HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另一个URL的访问请求; RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
  4. RequestDispatcher.forward方法的调用者与被调用者之间共享相同的请求对象和响应对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的请求对象和响应对象,它们属于两个独立的访问请求和响应过程。

         关于请求消息头我们在以后的学习中还会经常用到请求对象是我们目前在的JavaWeb开发中学到的三个作用域即ServletContext中,请求和会话域之一,是非常重要的一个请求对象,希望以上的相关介绍对能你有所帮助!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值