Servlet源码解析:Session、Request以及Response

首先我们来看看ServletRequest的源码:

public interface ServletRequest {

    //获取request的属性(注意不是请求参数)
    public Object getAttribute(String name);

    //获取request的所有属性的名字
    public Enumeration<String> getAttributeNames();
    //获取request编码
    public String getCharacterEncoding();
    //设置request编码
    public void setCharacterEncoding(String env)
            throws java.io.UnsupportedEncodingException;
    //获取内容长度(http报文的body字段)
    public int getContentLength();
    //获取内容长度
    public long getContentLengthLong();
    //获取Content-Type
    public String getContentType();
    //获取输入流
    public ServletInputStream getInputStream() throws IOException;
    //获取请求参数name对应的键值
    public String getParameter(String name);
    //获取所有请求参数名
    public Enumeration<String> getParameterNames();
    //获取所有请求参数键值
    public String[] getParameterValues(String name);
    //获取所有请求参数
    public Map<String, String[]> getParameterMap();
    //获取请求协议(完整名)scheme/version
    public String getProtocol();
    //获取协议名
    public String getScheme();
    //获取域名
    public String getServerName();
    //获取服务器http端口
    public int getServerPort();
    //获取reader用于读取body字段
    public BufferedReader getReader() throws IOException;
    //获取IP地址或最后的代理IP地址
    public String getRemoteAddr();
    //如果servlet不行或者不想处理域名则这个函数返回ip
    public String getRemoteHost();
    //设置request属性
    public void setAttribute(String name, Object o);
    //移除属性
    public void removeAttribute(String name);
    //根据Accept-Language获取国际化资源,如果浏览器没提供这个字段则使用默认Locale
    public Locale getLocale();
    //Accept-Language可以是多个资源
    public Enumeration<Locale> getLocales();
    //该request是不是使用HTTPS
    public boolean isSecure();
    //获取Request分发器,它能继续访问下一个servlet再返回结果给客户端,它有
    //include和forward两种方式
    public RequestDispatcher getRequestDispatcher(String path);
    //获取实际路径
    public String getRealPath(String path);
    //获取浏览器端口
    public int getRemotePort();
    //获取服务器域名
    public String getLocalName();
    //获取服务器IP地址
    public String getLocalAddr();
    //获取服务器端口
    public int getLocalPort();
    //获取Servlet应用上下文
    public ServletContext getServletContext();
    //servlet3开始支持异步任务
    public AsyncContext startAsync() throws IllegalStateException;
    //开始异步任务
    public AsyncContext startAsync(ServletRequest servletRequest,
            ServletResponse servletResponse) throws IllegalStateException;
    //异步任务是否开始
    public boolean isAsyncStarted();
    //是否支持异步任务
    public boolean isAsyncSupported();
    //获取异步上下文
    public AsyncContext getAsyncContext();
    //servlet3开始新增的类型对象,包括REQUEST,FORWARD,INCLUDE,ASYNC,ERROR几种类型
    public DispatcherType getDispatcherType();
}

ServletRequest有个子接口叫HttpServletRequest,它只是在ServletRequest的基础上增加了一些获取Cookies、Session、http报文头、认证相关(Servlet3)的方法这里不做详细介绍了。

我们再来看看ServletResponse的源码:

public interface ServletResponse {

    //获取编码信息
    public String getCharacterEncoding();
    //获取Content-Type
    public String getContentType();
    //获取输出流
    public ServletOutputStream getOutputStream() throws IOException;
    //获取字符输出流
    public PrintWriter getWriter() throws IOException;
    //设置编码信息
    public void setCharacterEncoding(String charset);
    //设置内容长度信息
    public void setContentLength(int len);
    public void setContentLengthLong(long length);
    public void setContentType(String type);
    //设置buffer的大小直接影响被加载入内存的时间和servlet执行效率,buffer缓存将要输出的内容
    public void setBufferSize(int size);
    public int getBufferSize();
    //向客户端提交response的内容
    public void flushBuffer() throws IOException;
    //仅仅清除buffer的内容不包括header和状态
    public void resetBuffer();
    //response是否已经提交内容
    public boolean isCommitted();
    //清除buffer的所有内容
    public void reset();
    public void setLocale(Locale loc);
    public Locale getLocale();
}

和前面ServletRequest的情况一样,不再详细介绍ServletResponse的子接口HttpServletResponse。

接下来我们再看看HttpSession这个接口:

public interface HttpSession {
    //获取创建时间
    public long getCreationTime();
    //获取session id
    public String getId();
    //获取最后一次客户端连接时间
    public long getLastAccessedTime();
    public ServletContext getServletContext();
    //设置session的失效timeout,0或-1表示永久有效
    public void setMaxInactiveInterval(int interval);
    public int getMaxInactiveInterval();
    //将被移除方法,没有替代方法
    public HttpSessionContext getSessionContext();
    //获取属性
    public Object getAttribute(String name);
    //将被废弃方法,用getAttribute方法代替
    public Object getValue(String name);
    //获取所有属性名
    public Enumeration<String> getAttributeNames();
    //将被废弃方法
    public String[] getValueNames();
    public void setAttribute(String name, Object value);
    //将被废弃方法
    public void putValue(String name, Object value);
    public void removeAttribute(String name);
    //将被废弃方法
    public void removeValue(String name);
    //使session失效
    public void invalidate();
    //是否是新创建的session,客户端第二次访问同一个session时它返回false
    public boolean isNew();
}

Servlet规范的核心内容就在于Servlet、Response、Request、Session、Cookie、RequestDispatcher这几个核心接口或类,像jsper,el,webservice,security,filter,listener的相关实现挺简单的,可以抽空看看,这里就不再赘述了。

时间: 2024-10-07 19:15:05

Servlet源码解析:Session、Request以及Response的相关文章

volley源码解析(二)--Request&lt;T&gt;类的介绍

在上一篇文章中,我们已经提到volley的使用方式和设计的整体思路,从这篇文章开始,我就要结合具体的源码来给大家说明volley功能的具体实现. 我们第一个要介绍的类是Request<T>这个一个抽象类,我将Request称为一个请求,通过继承Request<T>来自定义request,为volley提供了更加灵活的接口. Request<T>中的泛型T,是指解析response以后的结果.在上一篇文章中我们知道,ResponseDelivery会把response分派

Servlet源码解析:Servlet接口及其重要子类

 Servlet是基于Java技术的,容器托管的,用于生成动态内容的web组件.Servlet接口是Java Servlet API的核心抽象.首先我们来看看它的源码: public interface Servlet { /** * 被servlet容器在实例化servlet后调用该方法表示该servlet已经被装载,以服务的形式提供给客户 * @param config * @throws ServletException */ public void init(ServletConfi

Okhttp3源码解析(5)-拦截器RetryAndFollowUpInterceptor

### 前言 回顾: [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析](https://www.jianshu.com/p/bf1d01b79ce7) [Okhttp3源码解析(2)-Request分析](https://www.jianshu.com/p/5a85345c8ea7) [Okhttp3源码解析(3)-Call分析(整体流程)](https://www.jian

volley源码解析(七)--最终目的之Response&lt;T&gt;

在上篇文章中,我们最终通过网络,获取到了HttpResponse对象 HttpResponse是android包里面的一个类,然后为了更高的扩展性,我们在BasicNetwork类里面看到,Volley将其包装成一个Volley自己的对象NetworkResponse 另外,在BasicNetwork类中我们也注意到,对HttpResponse包装成NetworkResponse的过程中,使用HttpResponse的Inputstream,将数据保存在一个byte[]数组中. BasicNet

源码解析Servlet和HttpServlet

在编写 Servlet 时需要用到两个用于所有 Servlet 的基本软件包:javax.servlet 和 javax.servlet.http.下面主要介绍 javax.servlet 提供的 Servlet 以及 javax.servlet.http 提供的 HttpServlet 应用编程接口. Servlet源码: package javax.servlet; public interface Servlet {     public abstract void init(Servle

Spring 源码解析之HandlerAdapter源码解析(二)

Spring 源码解析之HandlerAdapter源码解析(二) 前言 看这篇之前需要有Spring 源码解析之HandlerMapping源码解析(一)这篇的基础,这篇主要是把请求流程中的调用controller流程单独拿出来了 解决上篇文章遗留的问题 getHandler(processedRequest) 这个方法是如何查找到对应处理的HandlerExecutionChain和HandlerMapping的,比如说静态资源的处理和请求的处理肯定是不同的HandlerMapping ge

Spring 源码解析之ViewResolver源码解析(四)

Spring 源码解析之ViewResolver源码解析(四) 1 ViewResolver类功能解析 1.1 ViewResolver Interface to be implemented by objects that can resolve views by name. View state doesn't change during the running of the application, so implementations are free to cache views. I

spring mvc源码解析

1.从DispatcherServlet开始     与很多使用广泛的MVC框架一样,SpringMVC使用的是FrontController模式,所有的设计都围绕DispatcherServlet 为中心来展开的.见下图,所有请求从DispatcherServlet进入,DispatcherServlet根据配置好的映射策略确定处理的 Controller,Controller处理完成返回ModelAndView,DispatcherServlet根据配置好的视图策略确定处理的 View,由V

Tomcat请求处理过程(Tomcat源码解析五)

前面已经分析完了Tomcat的启动和关闭过程,本篇就来接着分析一下Tomcat中请求的处理过程. 在开始本文之前,咋们首先来看看一个Http请求处理的过程,一般情况下是浏览器发送http请求->建立Socket连接->通过Socket读取数据->根据http协议解析数据->调用后台服务完成响应,详细的流程图如上图所示,等读者读完本篇,应该就清楚了上图所表达的意思.Tomcat既是一个HttpServer也是一个Servlet 容器,那么这里必然也涉及到如上过程,首先根据HTTP协议