Servlet容器管理之ServletRequest源码分析
ServletRequest由Servlet容器来管理,当客户请求到来时,容器创建一个ServletRequest对象,封装请求数据,同时创建一个ServletResponse对象,封装响应数据。这两个对象将被容器作为service()方法的参数传递给Servlet,Servlet利用ServletRequest对象获取客户端发来的请求数据,利用ServletResponse对象发送响应数据。
ServletRequest
ServletRequest主要用于请求的封装,提供了很多请求相关操作,具体API如下:
package javax.servlet; import java.io.BufferedReader; import java.io.IOException; import java.util.Enumeration; import java.util.Locale; import java.util.Map; /**
* 定义一个对象以向servlet提供客户端请求信息.
* servlet容器创建一个ServletRequest对象,并将其作为参数传递给servlet的service方法.
*/ public interface ServletRequest { /**
* 返回请求中指定属性的值,如果这个属性不存在,就返回一个空值.
* 这个方法允许访问一些不提供给这个接口中其他方法的请求信息以及其他Servlet放置在这个请求对象内的数据.
* @param name 属性名.
* @return 属性值.
*/ public Object getAttribute(String name); /**
* 返回包含在这个请求中的所有属性名的列表.
* @return 属性名列表.
*/ public Enumeration getAttributeNames(); /**
* 返回请求中输入内容的字符编码类型,如果没有定义字符编码类型就返回空值.
* @return 字符编码.
*/ public String getCharacterEncoding(); /**
* 设置输入内容的字符编码类型.
* @param env 字符编码类型.
* @throws java.io.UnsupportedEncodingException .
*/ public void setCharacterEncoding(String env) throws java.io.UnsupportedEncodingException; /**
* 请求内容的长度,如果长度未知就返回-1.
* @return 请求内容长度.
*/ public int getContentLength(); /**
* 返回请求数据体的MIME类型CONTENT-TYPE,如果类型未知返回空值.
* @return
*/ public String getContentType(); /**
* 返回一个输入流,使用该输入流以二进制方式读取请求正文的内容.
* javax.servlet.ServletInputStream是一个抽象类,继承自InputStream.
* @return .
* @throws IOException .
*/ public ServletInputStream getInputStream() throws IOException; /**
* 根据指定参数名获取参数值.
* @param name 参数名.
* @return 参数值.
*/ public String getParameter(String name); /**
* 获取所有参数名的枚举.
* @return 参数名枚举.
*/ public Enumeration getParameterNames(); /**
* 根据指定属性名获取参数值数组.
* @param name 参数名.
* @return 参数值数组.
*/ public String[] getParameterValues(String name); /**
* 获取参数的Map形式,包括所有参数.
* @return 参数Map.
*/ public Map getParameterMap(); /**
* 返回请求使用的协议信息.格式为:协议/主版本号.次版本号.例如:http/1.0.
* @return
*/ public String getProtocol(); /**
* 返回请求所使用的URL的模式.若http、https等.
* @return 模式.
*/ public String getScheme(); /**
* 返回请求发送到的服务器的主机名.
* @return 主机名.
*/ public String getServerName(); /**
* 返回请求发送到的服务器的端口号.
* @return 端口号.
*/ public int getServerPort(); /**
* 返回BufferedReader对象,以字节数据方式读取请求正文.
* @return .
* @throws IOException .
*/ public BufferedReader getReader() throws IOException; /**
* 返回发送请求的客户端或最后一个代理服务器的IP地址.
* @return IP地址.
*/ public String getRemoteAddr(); /**
* 返回发送请求的客户端或最后一个代理服务器的主机名.
* @return 主机名.
*/ public String getRemoteHost(); /**
* 根据传递的属性名和属性值设置Request属性.
* @param name 属性名.
* @param o 属性值.
*/ public void setAttribute(String name, Object o); /**
* 从Request中删除指定的属性名对应的值.一般使用此方法.
* @param name 属性名.
*/ public void removeAttribute(String name); /**
* 根据客户端传递的Accept-Language对应的区域设置.
* 若客户端未指定Accept-Language,则返回服务器默认语言环境.
* @return
*/ public Locale getLocale(); /**
* 返回Locale对象的枚举,从首选区域开始按降序返回基于Accept-Language头的客户端可接受的区域.
* 如果客户机请求不提供Accept-Language头,此方法返回包含一个Locale的枚举,即是服务器默认语言环境对应的Locale.
* @return
*/ public Enumeration getLocales(); /**
* 指示是否使用安全通道(如HTTPS)发出此请求.
*/ public boolean isSecure(); /**
* 返回RequestDispatcher对象,作为path所定位的资源的封装.
* RequestDispatcher用于服务器请求转发.
* @param path 相对路径或绝对路径.
* @return RequestDispatcher.
*/ public RequestDispatcher getRequestDispatcher(String path); /**
* @deprecated
* Servlet API 2.1开始已不推荐使用此API.
* 取得文件在服务器上的绝对路径.
* @param path 相对路径.
* @return 绝对路径.
*/ public String getRealPath(String path); /**
* 返回发送请求的客户端或者最后一个代理服务器的IP源端口, 这个方法是在Servlet 2.4规范中新增的方法.
* @return 端口号.
*/ public int getRemotePort(); /**
* 返回接收到请求的IP接口的主机名,这个方法是在Servlet 2.4规范中新增的方法.
* @return 主机名.
*/ public String getLocalName(); /**
* 返回接收到请求的网络接口的IP地址,这个方法是在Servlet 2.4规范中新增的方法.
* @return IP地址.
*/ public String getLocalAddr(); /**
* 返回接收到请求的网络接口的IP端口号,这个方法是在Servlet 2.4规范中新增的方法.
* @return 端口号.
*/ public int getLocalPort(); }
ServletRequestListener
ServletRequestListener主要负责监听ServletRequest的初始化和销毁,实现ServletRequestListener可以接收此事件。
package javax.servlet; import java.util.EventListener; /**
* ServletRequest生命周期事件监听.
*/ public interface ServletRequestListener extends EventListener { /**
* 应用中ServletRequest结束生命周期.
* @param sre 事件.
*/ public void requestDestroyed ( ServletRequestEvent sre ); /**
* 应用中ServletRequest开始生命周期.
* @param sre 事件.
*/ public void requestInitialized ( ServletRequestEvent sre ); }
ServletRequestEvent
ServletRequestEvent是为ServletRequestListener提供的事件对象,主要是继承EventObject,同时保存了ServletRequest实例。
package javax.servlet; /**
* ServletRequest生命周期事件.
*/ public class ServletRequestEvent extends java.util.EventObject { /**
* ServletRequest实例.
*/ private ServletRequest request; /**
* Construct.
* @param sc ServletContext实例.
* @param request ServletRequest实例.
*/ public ServletRequestEvent(ServletContext sc, ServletRequest request) { super(sc); this.request = request; } /**
* ServletRequest实例 getter.
*/ public ServletRequest getServletRequest () { return this.request; } /**
* ServletRequest实例 setter.
*/ public ServletContext getServletContext () { return (ServletContext) super.getSource(); } }
ServletRequestAttributeListener
ServletRequestAttributeListener主要负责监听ServletRequest属性的变化,实现ServletRequestAttributeListener可以接收此事件。
package javax.servlet; import java.util.EventListener; /**
* ServletRequest属性监听器.
* 可以监控ServletRequest生命周期过程中其属性的变化.
*/ public interface ServletRequestAttributeListener extends EventListener { /**
* ServletRequest新增属性事件.在属性新增后调用.
* @param srae事件.
*/ public void attributeAdded(ServletRequestAttributeEvent srae); /**
* ServletRequest删除属性事件.在属性删除后调用.
* @param srae事件.
*/ public void attributeRemoved(ServletRequestAttributeEvent srae); /**
* ServletRequest更改属性事件.在属性更改后调用.
* @param srae事件.
*/ public void attributeReplaced(ServletRequestAttributeEvent srae); }
ServletRequestAttributeEvent
ServletRequestAttributeEvent是为ServletRequestAttributeListener提供的事件对象,主要继承了ServletRequestEvent,即ServletRequestListener的事件对象,其中保存了ServletContext对象、ServletRequest对象以及修改的属性名和属性值。
package javax.servlet; /**
* 用于通知应用程序中servlet请求属性更改的事件类.
*/ public class ServletRequestAttributeEvent extends ServletRequestEvent { /**
* 属性名.
*/ private String name; /**
* 属性值.
*/ private Object value; /**
* Construct.
*/ public ServletRequestAttributeEvent(ServletContext sc, ServletRequest request, String name, Object value) { super(sc, request); this.name = name; this.value = value; } /**
* 获取被更改属性名.
*/ public String getName() { return this.name; } /**
* 获取被更改属性值.
*/ public Object getValue() { return this.value; } }
若文中存在错误和不足,欢迎指正!
本文地址:https://blog.csdn.net/securitit/article/details/108031730
推荐阅读
-
SpringBoot 源码解析 (六)----- Spring Boot的核心能力 - 内置Servlet容器源码分析(Tomcat)
-
Spring源码分析之IoC容器初始化
-
Servlet规范系列 之 ServletConfig源码分析
-
Java容器之HashMap源码分析(妈妈再也不用担心我不懂HashMap了)
-
Java容器类源码分析之Iterator与ListIterator迭代器(基于JDK8)
-
SpringBoot 源码解析 (六)----- Spring Boot的核心能力 - 内置Servlet容器源码分析(Tomcat)
-
Servlet容器管理之ServletRequest源码分析
-
Spring源码分析之IoC容器初始化
-
Servlet规范系列 之 ServletConfig源码分析
-
MySQL系列:innodb源码分析之表空间管理_MySQL