目录
一、获取请求行消息
二、获取请求头参数
三、获取请求参数
四、Request域参数操作
五、RequestDispatcher对象的应用
5.1 RequestDispatcher接口
5.2 请求转发
5.3 请求包含
HttpServletRequest所封装TTP请求信息里面的信息
HttpServletRequest表示HTTP环境中的Servlet请求。它继承了Javax.servlet.ServletRequest接口,定义了一系列获取请求参数的方法,下面列出几种类型中常用的方法
一、获取请求行消息
方法 |
功能描述 |
String getMethod() |
获取HTTP请求方式(如GET\POST等) |
String getServletPath() |
返回所访问URI中的Servlet的当前目录 |
String getContextPath() |
返回所访问URI中的项目根目录 |
String getRequestURI() |
返回请求的URI资源路径 |
String getRequestURL() |
返回请求的URL路径 |
* 案例代码如下所示:
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();String method = request.getMethod();
String ServletPath = request.getServletPath();
String ContextPath = request.getContextPath();
String RequestURI = request.getRequestURI();
StringBuffer RequestURL = request.getRequestURL();
writer.print(method+"<br>"+ServletPath+"<br>"+ContextPath+"<br>"+RequestURI+"<br>"+RequestURL);
* 请求结果如下图所示:
二、获取请求头参数
* 请求Servlet时,需要通过请求头向服务器传递附加信息。例如,客户端可以接受的数据类型、语言等等。下面是获取HTTP请求头子段的常用方法。
方法 |
功能描述 |
String getHeader(String name) |
获取指定头字段的值。如果没有就返回null,如果有多个就返回第一个头子段的值 |
Enumeration getHeaders(String name) |
获取指定头子段的所有值 |
Enumeration getHeaderNames() |
获取所有请求头子段的Enumeration对象 |
String getContentType() |
获取Content-Type头子段的值 |
String getCharacterEncoding() |
该方法获取请求消息实体部分的字符集编码,通常是从Content-Type头子段中提取 |
* 案例代码如下所示:
//获取请求消息中的所有头子段的名称
Enumeration headerNames = request.getHeaderNames();
//遍历所有请求头,通过getHeader()传获取指定头子段
while(headerNames.hasMoreElements()){String headName = (String)headerNames.nextElement();String value = request.getHeader(headName);writer.print( headName + ":" + value);
}
* 请求结果如下图所示(Ps:结果经过处理,上诉代码没有加入)
三、获取请求参数
在实际开发中,经常需要用户用户所提交的数据信息,例如:用户名、密码等。在HttpServletReqeust接口中,定义了一系列获取请求参数的方法,常见的三种方法如下表所示。
方法 |
功能描述 |
String getParameter(String name) |
返回URL中传递的指定名称的参数值 |
Enumeration getParameterNames() |
返回请求参数中的所有参数名 |
String[] getParameterValues(String name) |
返回请求参数中指定参数的所有参数值 |
* 案例代码如下所示
//【HTML代码】
<form action="HSRDemo" method="post"><div id="inputBox">用户名:<input type="text" name="name"/>密 码:<input type="password" name="password"/></div><div id="hobbyBox"><div class="title">爱好</div><input type="checkbox" name="hobby" value="sing" />唱歌<input type="checkbox" name="hobby" value="dance" />跳舞<input type="checkbox" name="hobby" value="football" />足球</div><div id="selectBox"><div class="title">年龄</div><select name="age"><option value="16岁">16</option><option value="17岁">17</option><option value="18岁">18</option><option value="19岁">19</option></select></div><input type="submit" value="提交"/>
</form>//【Servlet代码】
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
//获取用户名和密码
String name = request.getParameter("name");
String password = request.getParameter("password");
String age = request.getParameter("age");
writer.print("用户名:"+name+",密码:"+password+"<br/>");
writer.print("年龄:"+age+"<br/>");
//获取所有的爱好
String[] hobbys = request.getParameterValues("hobby");
writer.print( "爱好有:");
for(int i=0;i<hobbys.length;i++){writer.print(hobbys[i] + " ");
}
writer.print( "<br/><br/>");
//获取所有的请求参数
Enumeration parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){String paraName = (String)parameterNames.nextElement();String value = request.getParameter(paraName);writer.print(paraName + " : " + value + "<br/>");
}
* 请求结果如下图所示
四、Request域参数操作
Request对象不仅可以获取传递过来数据,还可以对新的数据执行增、删、改、差这一系列的操作属性的方法。具体如下
方法 |
功能描述 |
setAttribute(String name,Object value) |
将一个对象与一个名称关联后添加到ServletRequest对象或修改ServletRequest对象中指定属性的值。 |
getAttribute(String name) |
从ServletRequest对象中获取指定参数 |
removeAttribute(String name) |
从ServletRequest对象中删除指定参数 |
getAttributeNames() |
返回ServletRequest对象中所有参数的Enumeration对象 |
* 案例代码如下所示
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
//【添加新参数】
request.setAttribute("name", "张三");
request.setAttribute("sex", "男");
//【获取参数】
String val = (String) request.getAttribute("val");
String name = (String) request.getAttribute("name");
String sex = (String) request.getAttribute("sex");
writer.print("【修改前】");
writer.print(val + " " + name + " " + sex);
//【修改参数】
request.setAttribute("name", "李四");
request.setAttribute("sex", "女");
name = (String) request.getAttribute("name");
sex = (String) request.getAttribute("sex");
writer.print("<br/>【修改后】");
writer.print(name + " " + sex);
//【获取所有参数,并遍历其值】
writer.print("<br/>【遍历结果】");
Enumeration attributeNames = request.getAttributeNames();
while(attributeNames.hasMoreElements()){String aName = (String)attributeNames.nextElement();String value = (String)request.getAttribute(aName);writer.print(aName + ":" + value + " ");
}
//【删除参数】
request.setAttribute("name", null);
request.removeAttribute("sex");
name = (String) request.getAttribute("name");
sex = (String) request.getAttribute("sex");
writer.print("<br/>【删除后】");
writer.print(name + " " + sex);
* 请求处理结果如下图所示
需要注意的是,如果Servlet对象中已经存在指定名称的属性,setAttribute()方法会删除原来的属性,然后再添加新的属性。如果传递给setAttribute()方法的属性对象的值为null,则删除指定名称的属性,这时的效果等同于removeAttribute()方法。再次需要注意的是,setAttribute对象通过创建一个对象进行操作,所以并不会修改其值,只会替换掉原来的对象。
五、RequestDispatcher对象的应用
5.1 RequestDispatcheR接口
当一个Servlet收到客户端的请求之后,如果希望服务器通知另外一个资源去处理请求时。除了使用Reponse的sendRedirect()方法实现请求重定向外,还可以通过RequestDispatcher接口的实例对象的方法来实现。
(1) 获取RequestDispatcher对象
getRequestDispatcher(String path),该方法返回封装了某个路径所指定资源的RequestDispatcher对象,参数必须以”/”开头,表示当前Web应用程序的根目录。
(2) RequestDispatcher接口方法
获取到RequestDispatcher对象之后,最重要的工作就是通知其他Web资源处理当前的Servlet请求。请求处理的方法有两种,第一种是“请求转发”;第二种是“请求包含”,调用方法如下:
* forward(ServletRequest request,ServletResponse response)
请求转发方法用于将请求传递给另外一个Servlet进行处理。需要注意的是,请求转发必须在响应提交给客户端之前被调用,不然程序会报错;另外,请求转发到另外一个Servlet时,还会将本次请求的资源信息一并转发过去。
* include(ServletRequest request,ServletResponse response)
请求包含方法用于将其他的资源作为当前响应内容包含进来。
5.2 请求转发
如果当前Servlet不能处理传递给它的Http请求,可以通过forward()方法将当前请求传递给可以处理它的Servlet进行处理,这种方式称为请求转发。下图是它的转发原理。
* 案例代码如下所示
//forward1.java
request.setAttribute("sex", "男");
request.setAttribute("age", "18");
request.getRequestDispatcher("/forward2").forward(request, response);
//forward2.java
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
String name = request.getParameter("name");
String sex = (String) request.getAttribute("sex");
String age = (String) request.getAttribute("age");
writer.print("name:" + name + "<br/>");
writer.print("sex:" + sex + "<br/>");
writer.print("age:" + age + "<br/>");
* 请求处理结果如下图所示
需要注意的是:请求转发会将当前请求中的所有资源传递到forward2中,所以forward2不但能够获取当当前URL所传递过来的请求参数,还可以获取到forward1在当前Request域中所创建的参数。
另外,存储Request对象中的数据只对当前请求有效,而对其他请求无效。如果直接通过HTTP请求访问forward2,那么sex和age的参数值为null。
5.3 请求包含
请求包含通过include()方法将HTTP请求转发给其他Servlet进行处理,但与请求转发forward不同的是:请求转发是全盘交给转发后的Servlet处理,处理过程和处理结果与被转发的Servlet毫无关系;而请求包含最终返回的响应消息中,既包含当前请求Servlet的响应消息,也包含其他Web资源所作出的响应消息。下图是请求包含的原理:
* 案例代码如下所示
//include1.java
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
int x = 10,y = 10;
int sum = x+y;
request.setAttribute("x", x);
request.setAttribute("y", y);
request.setAttribute("name", "Laoye");
request.getRequestDispatcher("/include2").include(request, response);
PrintWriter writer = response.getWriter();
writer.print("x + y = " + sum + "<br/>");
//include2.java
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
int x = (int) request.getAttribute("x");
int y = (int) request.getAttribute("y");
String name = (String) request.getAttribute("name");
int pro = x*y;
PrintWriter writer = response.getWriter();
writer.print("x * y = " + pro+ "<br/>");
writer.print("name:" + name + "<br/>");
* 请求处理结果如下图所示
需要注意的是,和请求跳转一样,使用include()方法实现请求包含后,浏览器显示的URL地址是不会发生该变的。
另外,和请求跳转一样,当前请求的页面和转发包含的页面共享请求数据。