Servlet系列学习笔记4--- HttpServletRequest

目录

一、获取请求行消息

二、获取请求头参数

三、获取请求参数

四、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地址是不会发生该变的。

       另外,和请求跳转一样,当前请求的页面和转发包含的页面共享请求数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值