HttpServletRequest对象方法的用法小结

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

一、通过request常用方法获得相关信息:

1、通过request常用方法获得客户机信息

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

例如在Request.Java中加入如下代码:

//返回相关请求的信息
 String uri=request.getRequestURI();
 Stringrad = request.getRemoteAddr();
 Stringrh = request.getRemoteHost();
 Stringru = request.getRemoteUser();
 intrp = request.getRemotePort();
 Stringcp = request.getContextPath();
 Stringla = request.getLocalAddr();
 Stringce = request.getCharacterEncoding();
 Stringgm = request.getMethod();
 Stringqs = request.getQueryString(); 

 System.out.println(uri);
 System.out.println(rad);
 System.out.println(rh);
 System.out.println(ru);
 System.out.println(rp);
 System.out.println(cp);
 System.out.println(la);
 System.out.println(ce);
 System.out.println(gm);
 System.out.println(qs); 

即可获取相关信息。

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

getHead(name)方法
getHeaders(String name)方法
getHeaderNames方法
如:

private void getRequestValue(HttpServletRequest request) {
    //获得客户机请求头及请求头的值
    System.out.println(request.getHeader("method"));
    Enumeration e = request.getHeaderNames();
    while(e.hasMoreElements()){
      String name = (String)e.nextElement();
      String value = request.getHeader(name);
      System.out.println(name+":"+value);
    }
  } 

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

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

二、request的常见应用

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

如可以获取form表单中的text、password、radio、checkbox、 file、select、textarea、 hidden、image、button等组件的值进行数据库操作或其他处理操作。

来看一个具体应用:

界面代码主体部分如下:

Register.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">
<html>
 <head>
  <title>Register.html</title> 

  <metahttp-equivmetahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
  <metahttp-equivmetahttp-equiv="description" content="this is my page">
  <meta http-equiv="content-type" content="text/html;charset=UTF-8"> 

  <!--<link rel="stylesheet" type="text/css"href="./styles.css" rel="external nofollow" >--> 

 </head> 

 <body>
 <form action ="RequestLogin" method ="post">
  用户名:<input type="text"name = "username" ><br/>
  密码: <inputtypeinputtype="password" name = "password"><br/>
 性别:<input type="radio"name = "sex" value ="male">男
   <input type="radio" name = "sex" value="female">女<br/>
 籍贯: <select name="city">
    <option value ="HeBei">河北</option>
    <opton value ="HuBei">湖北</opton>
    <option value ="ShanXi">山西</option>
   </select><br/>
简历:<br/>
 &nsp;<textarea rows="5" cols="20" name="intro"></textarea>
<br/>
爱好:<br/>
<input type="checkbox" name="hobbies" value ="sing"/>唱歌
<input type="checkbox" name="hobbies" value ="dance"/>跳舞
<input type="checkbox" name="hobbies" value ="readbook"/>读书
<input type="checkbox" name="hobbies" value ="readnewspaper"/>看报<br/>
上传头像:<br/>
<input type="file" value="image" name ="browser"><br/>
<input type="submit" value="提交"/>
 </form> 

 </body>
</html> 

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

如调用自定义方法:

private void getInformation(HttpServletRequest request)
throws UnsupportedEncodingException {
//取出参数值
String name = request.getParameter("username");
String pass = request.getParameter("password");
String sex = request.getParameter("sex");
String city = request.getParameter("city");
String intro = request.getParameter("intro");
String [] hobbies = request.getParameterValues("hobbies");
String hobby ="";
//hobbies!=null对所取值为空时进行设置
for(int i=0;hobbies!=null&&i<hobbies.length;i++)
{ String hovalue = hobbies[i]; hobby += hovalue; }
//获取头像信息 // String image = request.getParameter("image");
System.out.println("username:"+name);
System.out.println("password:"+pass);
System.out.println("sex:"+sex); System.out.println("city:"+city);
System.out.println("intro:"+intro); System.out.println("hobby:"+hobby);} 

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

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

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

下面来看具体的例子:

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

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

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

则在服务端输出如下:

此时输出结果出现乱码。

客户端主体代码同上:

Register.html
 <body>
 <form action ="RequestLogin" method ="post">
  用户名:<input type="text" name = "username" ><br/>
  密码: <input type="password" name = "password"><br/>
 性别:<input type="radio" name = "sex" value ="male">男
   <input type="radio" name = "sex" value ="female">女<br/>
 籍贯: <select name ="city">
    <option value ="HeBei">河北</option>
    <opton value ="HuBei">湖北</opton>
    <option value ="ShanXi">山西</option>
   </select><br/>
简历:<br/>
  &nsp;<textarea rows="5" cols="20" name ="intro"></textarea>
<br/>
爱好:<br/>
<input type="checkbox" name ="hobbies" value ="sing"/>唱歌
<input type="checkbox" name ="hobbies" value ="dance"/>跳舞
<input type="checkbox" name ="hobbies" value ="readbook"/>读书
<input type="checkbox" name ="hobbies" value ="readnewspaper"/>看报<br/>
上传头像:<br/>
<input type="file" value ="image" name ="browser"><br/>
<input type="submit" value ="提交"/>
 </form>
 </body> 

服务端主体代码如下:

RequestLogin.java
package net.csdn.request;
import java.io.IOException;
import java.io.PrintWriter;
importjava.io.UnsupportedEncodingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
public class RequestLogin extendsHttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException
{
getInformation(request);
}
private voidgetParameter(HttpServletRequest request)
throws UnsupportedEncodingException
{
private voidgetInformation(HttpServletRequest request)
throws UnsupportedEncodingException {
//取出参数值
String name =request.getParameter("username");
String pass =request.getParameter("password");
String sex =request.getParameter("sex");
String city =request.getParameter("city");
String intro = request.getParameter("intro");
String [] hobbies =request.getParameterValues("hobbies");
String hobby ="";
//hobbies!=null对所取值为空时进行设置
for(inti=0;hobbies!=null&&i<hobbies.length;i++)
{ String hovalue = hobbies[i]; hobby +=hovalue; }
//获取头像信息 // String image = request.getParameter("image");
System.out.println("username:"+name);
System.out.println("password:"+pass);
System.out.println("sex:"+sex);System.out.println("city:"+city);
System.out.println("intro:"+intro);System.out.println("hobby:"+hobby);}
public void doPost(HttpServletRequestrequest, HttpServletResponse response)
throws ServletException, IOException{doGet(request, response);}} 

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

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

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

这时就需要在
RequestLogin.java
中含有中文的地方进行如下设置了即在doGet方法中加入如下代码:

String username = new String(name.getBytes("iso8859-1"),"utf-8");
     String introduction = new String(intro.getBytes("iso8859-1"),"utf-8");
 System.out.println("username:"+username);
      System.out.println("password:"+introduction); 

此时再度测试时就OK了!如图

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

3、防盗链

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

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

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

Rquest.java

public class Request extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {getDoorChain(request, response);}
  private void getDoorChain(HttpServletRequest request,
      HttpServletResponse response) throws IOException {
//通过request获取请求头参数
 String referer = request.getHeader("referer");
    if(referer==null || !referer.endsWith("http://localhost:8080/Request/index.jsp")){
  response.sendRedirect("http://localhost:8080/Request/index.jsp");
      return;
    }
    response.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset =utf-8");
    PrintWriter pw = response.getWriter();
    pw.write("喜剧片《东成西就》");
  }
public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    doGet(request, response);
  }
} 

index.jsp部分的主体代码:

<body>
 这里是防盗链技术的应用检测! <br>
 <a href ="/Request/Request" >喜剧片 </a>
 </body>
</html> 

效果如图:

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

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

好了赶快自己动手试一试吧!
4、request对象实现请求转发:
 Servlet API中定义了一个RequestDispatcher接口,俗称请求分派器。它定义了如下两个方法: public void forward(ServletRequest request, ServletResponseresponse) 、public void include(ServletRequest request,ServletResponse response) ,
获取RequestDispatcher实例的方式主要有两种:

调用ServletContext接口提供的getRequestDispatcher(Stringurl)方法。
调用ServletRequest接口提供的getRequestDispatcher(Stringurl)方法。
RequestDispatcher:

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

例:

request.getRequestDispatcher("./Welcome.jsp").forward(request,response);即可从当前应用跳转到相应的"./Welcome.jsp"页面。
request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。

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

setAttribute方法 ;
getAttribute方法  ;
removeAttribute方法;
getAttributeNames方法;

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

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

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

一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发。
一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源,称之为请求重定向。

注意:

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

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

(0)

相关推荐

  • 基于HttpServletRequest 相关常用方法的应用

    Referer: public void referer(HttpServletRequest request, HttpServletResponse response)throws Exception {String referer = request.getHeader("referer");if (referer == null || !referer.startsWith("http://localhost")) {response.sendRedirec

  • HttpServletRequest对象常用功能_动力节点Java学院整理

    使用HttpServletRequest可以防止盗链行为,什么是盗链行为,比如说在一个别的网站上超链接,指向我们的网页中的某个数据,这样从他的网页上就可以直接进入到我的某个页面,无需从我的指定路口进入: 例如在一个简单的1.html文件中加入了我的[myservlet]web应用下的某个Servlet访问的超链接: 如果我的Servlet中代码仅仅为为访问输出数据,例如: response.setContentType("text/html;charset=utf-8"); Strin

  • HttpServletRequest对象简介_动力节点Java学院整理

    通过getMethod方法获得的是客户端访问该web应用的Http请求方式. 代码和结果如下: String requestMethod = request.getMethod(); System.out.println(requestMethod); 想获取客户端发来的HTTP请求头中的内容可以使用如下方法: getDateHeader() getHeader(String) getHeaderNames() getHeaders(String) getIntHeader(String); 这

  • java HttpServletRequest和HttpServletResponse详解

    java  HttpServletRequest和HttpServletResponse详解 最近由于CAS相关的JAR包的重新封装,所以想尽量做到0配置,而这个过程中大量使 用HttpServletRequest,现在整理如下,以便以后查阅.(表格为从别的地方复制的,排版渣了点,酬和看吧.) 请求与响应相关的类和接口非常多,下表是主要的与请求和接口相关的类以及接口. 主要的与请求和接口相关的类及接口 方    法 说    明 ServletInputStream Servlet的输入流 Se

  • HttpServletRequest对象方法的用法小结

    深入体验JavaWeb开发内幕--关于HttpServletRequestRequest对象 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的相关方法,即可以获得客户的这些信息. 一.通过request常用方法获得相关信息: 1.通过request常用方法获得客户机信息 getRequestURL方法返回客户端发出请求时的完整URL. getRequestURI方法返回请求行中的资

  • SpringBoot实现任意位置获取HttpServletRequest对象

    目录 任意位置获取HttpServletRequest对象 方法一 方法二 HttpServletRequest只能读取一次的解决 任意位置获取HttpServletRequest对象 方法一 //获取RequestAttributes RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); //从获取RequestAttributes中获取HttpServletRequest的信息 H

  • 创建Android库的方法及Android .aar文件用法小结

    创建 Android 库 Android 库在结构上与 Android 应用模块相同.它可以提供构建应用所需的一切内容,包括源代码.资源文件和 Android 清单.不过,Android 库将编译到您可以用作 Android 应用模块依赖项的 Android 归档 (AAR:Android Archive Resource) 文件,而不是在设备上运行的 APK.与 JAR 文件不同,AAR 文件可以包含 Android 资源和一个清单文件,这样,除了 Java 类与方法外,您还可以捆绑布局和可绘

  • PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析

    本文实例讲述了PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法.分享给大家供大家参考,具体如下: 1.对象克隆 clone PHP4面向对象功能一个很大的缺点,是将对象视为另一种数据类型,这使得很多常见的OOP方法无法使用,如设计模式.这些方法依赖于将对象作为引用传递给其他类方法,而不是作为值传递,而按值传递却是PHP的默认做法.幸好,PHP5解决了这个问题,现在所有对象在默认情况下都被视为引用.但是,由于所有对象都被视为引用而不是值,所以现在复制对象更为困难.如果尝试

  • 详解PHP中cookie和session的区别及cookie和session用法小结

    具体来说 cookie 是保存在"客户端"的,而session是保存在"服务端"的 cookie 是通过扩展http协议实现的 cookie 主要包括 :名字,值,过期时间,路径和域: 如果cookie不设置生命周期,则以浏览器关闭而关闭,这种cookie一般存储在内存而不是硬盘上.若设置了生命周期则相反,不随浏览器的关闭而消失,这些cookie仍然有效直到超过设定的过 期 时间. session 一种类似散列表的形式保存信息, 当程序需要为某个客户端的请求创建一个

  • javaScript产生随机数的用法小结

    var chars = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']; function generateMixed(n) { var res = ""; for(var i = 0; i < n ; i ++) { var id = M

  • C/C++ 中const关键字的用法小结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性. Const作用 NO. 作用 说明 参考 1 可以定义const常量 const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误 void f(const int i) { ---} //对传入的参数进行类型检查,不匹配进行提示 3 可以保护被修

  • C++语言中std::array的用法小结(神器用法)

    摘要:在这篇文章里,将从各个角度介绍下std::array的用法,希望能带来一些启发. td::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此,使得std::array有很多与其他容器不同的特殊之处,比如:std::array的元素是直接存放在实例内部,而不是在堆上分配空间:std::array的大小必须在编译期确定:std::array的构造函数.析构函数和赋值操作符都是编译器隐式声明的--这让很多用惯了std::vector这类容器的程

  • C#中AutoResetEvent控制线程用法小结

    目录 AutoResetEvent主要方法及实践 第二种方法Semaphore 第三种方法,约定每个线程只干自己的事 第四种方法 Mutex 本文主要来自一道面试题,由于之前对AutoResetEvent的概念比较模糊(即使已经使用过了).面试题题目很简洁:两个线程交替打印0~100的奇偶数.你可以先动手试试,我主要是尝试在一个方法里面完成这个任务. 注: Suspend,Resume来控制线程已经在.net framework2.0被淘汰了,原因就是挂起之后,但因为异常而没有及时恢复,如果占用

  • asp的RegExp对象正则表达式功能用法[比较全]

    RegExp对象提供简单的正则表达式支持功能. RegExp对象的用法: 复制代码 代码如下: Function RegExpTest(patrn, strng) Dim regEx, Match, Matches ' 建立变量. Set regEx = New RegExp ' 建立正则表达式. regEx.Pattern = patrn ' 设置模式. regEx.IgnoreCase = True ' 设置是否区分字符大小写. regEx.Global = True ' 设置全局可用性.

随机推荐