小言_互联网的博客

JavaWeb核心技术系列教程(11)——HttpServletRequest对象详解

230人阅读  评论(0)

C语言自学完备手册(33篇)

Android多分辨率适配框架

JavaWeb核心技术系列教程

HTML5前端开发实战系列教程

MySQL数据库实操教程(35篇图文版)

推翻自己和过往——自定义View系列教程(10篇)

走出思维困境,踏上精进之路——Android开发进阶精华录

讲给Android程序员看的前端系列教程(40集免费视频教程+源码)


版权声明

  • 本文原创作者:谷哥的小弟
  • 作者博客地址:http://blog.csdn.net/lfdfhl

Servlet最核心的工作就是处理客户端请求并向客户端作出响应。为此,针对Servlet的每次HTTP请求,Web服务器在调用service (HttpServletRequest request,HttpServletResponse response)方法之前,都会创建HttpServletRequest 和HttpServletResponse。其中,HttpServletRequest用于封装HTTP请求消息,简称request对象;HttpServletResponse用于封装HTTP响应消息, 简称response对象。需要注意的是,在Web服务器运行阶段每个Servlet都只会创建一个实例对象;但是,对于每次HTTP请求Web服务器都会在调用service (HttpServletRequest request,HttpServletResponse response)方法时重新创建request对象response对象。

HttpServletRequest概述

HttpServletRequest接口继承自 ServletRequest专门用于封装HTTP请求消息。由于HTTP请求消息分为请求行、请求消息头、请求消息体(实体信息)三部分;因此,在HttpServletRequest接口中对应地定义了与请求行、请求消息头、请求消息体(实体信息)相关的方法。在此,我们分别对这些方法进行详细介绍。

HttpServletRequest中与请求行相关的方法

客户端访问Servlet时会在请求消息的请求行中包含请求方法、请求资源名,请求路径 等信息。在此,介绍HttpServletRequest接口中与请求行相关的常见方法。

public String getMethod( )

该方法用于获取HTTP请求消息中的请求方式(如GET、POST等)

public StringBuffer getRequestURL( )

该方法用于获取请求的完整路径

public String getRequestURI( )

该方法用于获取请求行中资源名称部分,即位于URL的主机和端口之后、参数之前的部分

public String getQueryString( )

该方法用于获取请求行中的参数部分即资源路径中?以后的内容

public String getProtocol( )

该方法用于获取请求行中的协议名和版本。例如:HTTP 1.0、HTTP 1.1

public String getContextPath( )

该方法用于获取请求路径中属于Web应用程序的路径,该路径以/开头表示相对于整个Web站点的根目录。

public String getServerName( )

获取服务器名称。

public String getServletPath( )

该方法用于获取Servlet的名称或者Servlet映射路径。

public String getParameter(String name)

该方法用于获取请求参数对应的值。

public Enumeration< String > getParameterNames( )

该方法用于获取请求参数对应的值的集合。HTTP请求消息中可能有多个相同名称的参数,但值却不一样。例如:form表单中通常存在多个同名的参数。

public Enumeration< String > getParameterNames( )

该方法用于返回请求消息中的所有参数名。

public Map< String, String[ ] > getParameterMap( )

该方法用于按照键值对的形式返回请求消息中的所有参数名及其对应的。

请看如下示例

idex.html如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Hello Servlet</title>
	</head>
	<body>
		<h1>本文作者:谷哥的小弟</h1>
		<h1>博客地址:http://blog.csdn.net/lfdfhl</h1>
	</body>
</html>

页面如下:

TestServletRequest如下:

package cn.com;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * HttpServletRequest示例
 * 获取请求行、请求头
 */
public class TestServletRequest extends HttpServlet{
	private static final long serialVersionUID = 1L;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		getRequestInfo(request,response);
		getRequestHeader(request,response);
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}
	
	//获取与请求行相关的信息
	public void getRequestInfo(HttpServletRequest request, HttpServletResponse response) throws IOException{
        PrintWriter writer = response.getWriter();
        String method=request.getMethod();
        String httpVersion=request.getProtocol();
        StringBuffer requestURL = request.getRequestURL();
        String requestURI = request.getRequestURI();
        String queryString = request.getQueryString();
        String contextPath = request.getContextPath();
        String servletPath = request.getServletPath();
        String remoteAddress = request.getRemoteAddr();
        String remoteHost = request.getRemoteHost();
        int remotePort = request.getRemotePort();
        writer.write("<!DOCTYPE html>");
		writer.write("<html>");
		writer.write("<head>");
		writer.write("<meta charset=\"UTF-8\">");
		writer.write("<title>Servlet</title>");
		writer.write("</head>");
		writer.write("<body>");
        writer.write("method="+method+"</br>");
        writer.write("httpVersion="+httpVersion+"</br>");
        writer.write("requestURL="+requestURL+"</br>");
        writer.write("requestURI="+requestURI+"</br>");
        writer.write("queryString="+queryString+"</br>");  
        writer.write("contextPath="+contextPath+"</br>");
        writer.write("servletPath="+servletPath+"</br>");
        Map<String, String[]> parameterMap = request.getParameterMap();
        Set<String> parameterMapKeySet = parameterMap.keySet();
        Iterator<String> iterator = parameterMapKeySet.iterator();
        while(iterator.hasNext()) {
        	String parameter = iterator.next();
        	String[] values = parameterMap.get(parameter);
        	for(int i=0;i<values.length;i++) {
        		String value=values[i];
        		writer.write(parameter+"="+value+"</br>");
        	}
        }
        writer.write("remoteAddress="+remoteAddress+"</br>");
        writer.write("remoteHost="+remoteHost+"</br>");
        writer.write("remotePort="+remotePort+"</br>");
        writer.write("-----------------------------"+"</br>");
        writer.write("</body>");
		writer.write("</html>");
    }
  
}

请求地址:

http://localhost:8080/ServletRequest01/testServletRequest?username=lucy&city=chengdu

结果如下:

HttpServletRequest中与请求消息头相关的方法

当网络请求时可通过请求头向服务器传递附加信息。例如,客户端浏览器可以接受 的数据类型、压缩方式、语言等。在此,介绍HttpServletRequest接口中与消息请求头相关的方法。

public String getHeader(String name)

该方法用于获取指定头字段的值。

public Enumeration< String > getHeaders(String name)

该方法用于获取指定头字段的值的集合,它是一个Enumeration集合对象。

public Enumeration< String > getHeaderNames( )

该方法用于获取所有请求头字段的集合,它是一个Enumeration集合对象。

public int getIntHeader(String name)

该方法用于获取指定名称的头字段,并且将其值转为int类型。

public long getDateHeader(String name)

该方法用于获取指定头字段的值,该至为自1970年1月1日0点0分0秒算起的以毫秒值

public String getContentType( )

该方法用于获取Content-Type头字段的值

public int getContentLength( )

该方法用于获取Content-Length头字段的值

public String getCharacterEncoding( )

该方法用于获取请求消息的实体部分的字符集编码,通常从Content-Type头字段中进行提取。

请看如下示例

idex.html如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Hello Servlet</title>
	</head>
	<body>
		<h1>本文作者:谷哥的小弟</h1>
		<h1>博客地址:http://blog.csdn.net/lfdfhl</h1>
	</body>
</html>

页面如下:

TestServletRequest如下:

package cn.com;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * HttpServletRequest示例
 * 获取请求行、请求头
 */
public class TestServletRequest extends HttpServlet{
	private static final long serialVersionUID = 1L;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//getRequestInfo(request,response);
		getRequestHeader(request,response);
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}
    
    //获取请求头相关信息
	//http://localhost:8080/ServletRequest01/testServletRequest?username=lucy&city=chengdu
	public void getRequestHeader(HttpServletRequest request, HttpServletResponse response) throws IOException{
		PrintWriter writer = response.getWriter();
		writer.write("<!DOCTYPE html>");
		writer.write("<html>");
		writer.write("<head>");
		writer.write("<meta charset=\"UTF-8\">");
		writer.write("<title>Servlet</title>");
		writer.write("</head>");
		writer.write("<body>");
		//获取所有头字段及其对应的值
        Enumeration<String> headerNames = request.getHeaderNames();
        while(headerNames.hasMoreElements()){
            String headKey=headerNames.nextElement();
            String headValue=request.getHeader(headKey);
            System.out.println(headKey+":"+headValue);
            writer.write(headKey+"="+headValue+"<br/>");
        }
        writer.write("</body>");
		writer.write("</html>");
    }

}

请求地址:

http://localhost:8080/ServletRequest01/testServletRequest?username=lucy&city=chengdu

结果如下:

温馨提示:

在本示例中采用Get方式提交数据打印了如上请求头字段;假若使用Post方式提交数据(例如:表单)则会打印出更多的请求头字段。

HttpServletRequest中与请求消息体相关的方法

假若浏览器若使用GET方式发起请求则可以在URL地址后携带少量数至服务器,在此方式下请求消息体的内容为空。在更多的情况下浏览器使用POST方式提交数据至服务器;为此,在HttpServletRequest接口中定义了两个与输人流相关的方法,具体如下:

public ServletInputStream getInputStream( ) throws IOException

该方法用于获取表示实体内容的ServletlnputStream对象。我们可利用该对象以字节流读取请求消息体。

public BufferedReader getReader( ) throws IOException

该方法用于获取表示实体内容的BufferedReader对象。我们可通过该对象以字符流读取请求体消息。请注意:在使用该BufferedReader对象时应注意编码问题;默认情况下,该BufferedReader对象采用IS08859-1编码。

注意事项

  • HttpServletRequest获取请求消息的两个方法是互斥的,即getInputStream( )和 getReader( )方法不能同时使用,否则会抛出IllegalStateException异常。

  • 当请求方式为Post时假若先利用getParameter( )等类似方法获取了参数值,那么再使用IO流读取消息体内容时返回值为空。

  • 常用getParameter( )等类似方法获取参数值,而较少使用IO流读取的方式

请看如下示例

idex.html如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>Hello Servlet</title>
	</head>
	<body>
		<h1>本文作者:谷哥的小弟</h1>
		<h1>博客地址:http://blog.csdn.net/lfdfhl</h1>
	</body>
</html>

页面如下:

login.html如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>form</title>
	</head>
	<body>
		<form action="/ServletRequest01/testServletRequest" method="post">
			用 名: <input type="text" name="username" /><br>
			密 码: <input type="password" name="password" /><br>
			<input type="submit" value="登录" />
		</form>
	</body>
</html>

表单以Post方式提交至服务器。

TestServletRequest如下:

package cn.com;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 本文作者:谷哥的小弟 
 * 博客地址:http://blog.csdn.net/lfdfhl
 * 
 * HttpServletRequest示例
 * 获取请求行、请求头、消息体
 */
public class TestServletRequest extends HttpServlet{
	private static final long serialVersionUID = 1L;
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		getRequestContent(request, response);
	}
	//获取消息体
	public void getRequestContent(HttpServletRequest request, HttpServletResponse response) throws IOException{
		ServletInputStream inputStream = request.getInputStream();
		StringBuffer stringBuffer=new StringBuffer();
		byte[] buffer=new byte[1024*1];
		int len=0;
		while((len=inputStream.read(buffer))!=-1) {
			String string=new String(buffer,0,len);
			stringBuffer.append(string);
		}
		PrintWriter writer = response.getWriter();
		writer.write(stringBuffer.toString());
	}

}

在doPost( )中以IO流的方式读取消息体的那内容。

请求地址:

http://localhost:8080/ServletRequest01/login.html

图示如下:

结果如下:

HttpServletRequest对象与数据存储及其传递

我们不仅可从HttpServletRequest中获取数据,还可使用HttpServletRequest对象传递数据。例如:在请求转发时我们可利用HttpServletRequest对象携带数据至其它Web资源。在类似的场景下,HttpServletRequest对象充当了容器的角色,我们可按照键值对的形式对数据进行存取等操作。

在此,介绍HttpServletRequest与数据存储及其传递的相关常用方法。

public void setAttribute(String name, Object o)

该方法用于向HttpServletRequest对象中存储数据。

public Object getAttribute(String name)

该方法用于从HttpServletRequest对象中获取数据。

public void removeAttribute(String name)

该方法用于HttpServletRequest对象中存储数据。

public Enumeration< String > getAttributeNames( )

该方法用于获取HttpServletRequest对象中所有属性的名称,其返回值为Enumeration类型的集合对象。

此处,我们仅初步介绍HttpServletRequest对象与数据存储及其传递的常用方法。在后续的教程中,我们将介绍其具体用法。


转载:https://blog.csdn.net/lfdfhl/article/details/101531928
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场