详解请求消息 resquest

时间:2022-07-26
本文章向大家介绍详解请求消息 resquest,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.1 简介

1.1.1 概述

   Request 对象,又称为请求对象,该对象派生自 HTTPResponse 类,是 ASP 中重要的服务器内置对象,它连接着 Web 服务器和 Web 客户端程序。Request 对象是从客户端向服务器发出请求,包括用户提交的信息以及客户端的一些信息。客户端可通过 HTML 表单或在网页地址后面提供参数的方法提交数据,然后服务器通过 Request 对象的相关方法来获取这些数据。Request 的各种方法主要用来处理客户端浏览器提交的请求中的各项参数和选项。

1.1.2 流程

   Tomcat 服务器会根据请求 URL 中的资源路径,创建对应的 ServletImpl 的对象。然后会创建 Request 对象,Request 对象中封装请求信息数据。最后将 Request 对象传递给 service 方法,并且调用 service方法。(Tomcat 利用反射创建对象并且调用 service 方法)

1.2 request 的使用

   Tomcat 为了屏蔽内部 catalina 容器的相关方法,使用户免受非 servlet 标准方法的干扰对 servlet 进行了包装,我们使用的 servlet 其实是 org.apache.catalina.connector.RequestFacade,它实现了 javax.servlet.http.HttpServletRequest 接口,而 HttpServletRequest 继承了 javax.servlet.ServletRequest。我们创建 Servlet 通常是继承 HttpServlet,所以我们一般操作 HttpServletRequest

1.2.1 方法

ServletRequest

方法

描述

Object getAttribute(String name)

将命名属性的值作为 Object 返回;如果不存在给定名称的属性,则返回 null

String getCharacterEncoding()

返回此请求中使用的字符编码

String getContentType()

返回请求正文的 MIME 类型;如果类型未知,则返回 null

ServletInputStream getInputStream()

获取字节输入流

String getLocalAddr()

获取服务器的 ip 地址

String getLocalName()

获取服务器的主机名

int getLocalPort()

获取服务器的端口号

String getParameter(String name)

以字符串形式返回请求参数的值,如果参数不存在,则返回 null

Map<String,String[]> getParameterMap()

将请求参数封入 Map 中返回

String[] getParameterValues(String name)

根据参数名称获取参数值的数组

String getProtocol()

获取协议和版本

BufferedReader getReader()

获取字符输入流

String getRemoteAddr()

返回发送请求的客户端或最后一个代理的 Internet 协议 IP 地址

String getRemoteHost()

返回客户端或发送请求的最后一个代理的名称

int getRemotePort()

返回发送请求的客户端或最后一个代理的 Internet 协议 IP 源端口

ServletContext getServletContext()

获取 servlet 上下文对象

void removeAttribute(String name)

从此请求中删除属性

void setAttribute(String name, Object o)

设置此请求中的属性

void setCharacterEncoding(String env)

设置此请求中的编码

RequestDispatcher getRequestDispatcher(String path)

获取请求转发器对象

HttpServletRequest

方法

描述

String getContextPath( )

获取虚拟目录,示例:/demo

Cookie[ ] getCookies( )

返回一个数组,其中包含客户端与此请求一起发送的所有 Cookie 对象

String getHeader(String name)

以字符串形式返回指定请求头的值

String getMethod( )

返回发出此请求的 HTTP 方法的名称,例如:GET,POST 或 PUT

String getQueryString( )

返回路径后面的请求 URL 中包含的查询字符串。即 ? 后的一串

String getRequestURI( )

获取请求地址 ,例如: /demo/servlet

StringBuffer getRequestURL()

带有协议的地址,例如:http://localhost/demo/servlet

String getServletPath()

获取Servlet路径,例如: /servlet

HttpSession getSession()

获取 session

1.2.2 请求转发

   当一个请求抵达时,接收请求的 servlet 无法处理该请求将其转发给另一个 servlet 处理,这个过程请求方是不知道的。就好比,老张打电话向老王借 ¥500,老王没有,就向领座老李借了 ¥500,然后转账给老张了。

转发步骤   ① 通过request对象获取请求转发器对象   ② 使用 RequestDispatcher 对象的 forward(ServletRequest request, ServletResponse response) 方法转发。

特点   ① 浏览器地址栏路径不发生变化   ② 只能转发到当前服务器内部资源中。   ③ 转发是一次请求

示例

public void service(ServletRequest request, ServletResponse response) throws Exception {
	request.getRequestDispatcher("/BBBservlet").forward(request, response);
}

执行流程

1.2.3 request 域

   域对象是指一个有作用范围的对象,可以在范围内共享数据。request 域是指代表一次请求的范围,一般用于请求转发的多个资源中共享数据。使用下列方法共享数据 void setAttribute(String name,Object obj):存储数据 Object getAttitude(String name):通过键获取值 void removeAttribute(String name):通过键移除键值对 请求转发正是通过 request 域来共享数据的。

示例

@WebServlet("loginServlet")
public class LoginServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// 解决乱码
		request.setCharacterEncoding("utf-8");
		
		//获取请求参数
		String userName = request.getParameter("username");
		String password  = request.getParameter("password");
		User user = new User(userName, password);
		
		// 往 request 域对象存储数据
		request.setAttribute("USER", user);
		
		// 转发
		request.getRequestDispatcher("/userServlet").forward(request, response);
	
	}
		
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws Exception {
		doGet(request, response);
	}
}
@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// 从域对象对象中取出数据
		User user = (User) request.getAttribute("USER");
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws Exception {
		doGet(request, response);
	}
}