Servlet
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet相关的知识,希望对你有一定的参考价值。
姓名:陈柳静 班级:软件151
Servlet也是JavaEE的一种规范,位于javax.servlet下,Servlet规范还包含Filter。该包下分为两部分:servlet有关和http有关。
客户端(常见的是浏览器)向Servlet容器发出Http请求
Servlet容器接收客户端请求
Servlet容器创建一个HttpRequest对象,将请求信息封装
Servlet容器创建一个HttpResponse对象,将响应信息封装
Servlet容器调用HttpServlet对象的service方法,以HttpRequest对象与HttpResponse对象为参数
HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息、HttpServlet调用HttpResponse对象的有关方法,生成响应数据
Servlet容器把HttpServlet的响应结果传给客户端
实际上关注Servlet更应该关注的是Servlet容器,这点在关于Tomcat的博客中再细说。
Session
HTTP协议里请求响应是无状态的,Session就是根据HTTP协议这种特点而产生的,实现无非就是在服务器产生一个哈希表,Key就是传递给浏览器的名为jsessionid的Cookie值。当需要将某个值保存到 session 时,容器会执行如下几步:
获取jsessionid值,如果没有使用request.getSession()产生
得到HttpSession对象实例哈希表,存放数据(setAttribute)
可以通过 getAttribute 来获取某个值
而这个名为jsessionid的Cookie在浏览器关闭时会自动删除。当把Cookie的MaxAge值设为-1时,浏览器关闭即自动删除。
Request Response
HttpServletRequest和HttpServletResponse实际上就是对HTTP协议做面向对象的封装,HTTP协议中的请求和响应就是对应了HttpServletRequest和HttpServletResponse这两个接口。
HttpServletRequest作为请求,用来获取所有请求相关的信息,包括 URI、Cookie、Header、请求参数等等;HttpServletResponse接口是用来生产 HTTP 回应,包含 Cookie、Header 以及回应的内容等等。
而各种V层框架仅仅是对这两个类的进一步封装,再怎么操作,最终还是操作的HttpServletRequest和HttpServletResponse
javax.servlet 和 javax.servlet.http 这两个包总共加起来也不过是42个类文件,按照所需,分析源码也并非不可能:
核心内容
如果条件允许,全看这42个源码文件也没问题,如果有限,最少以下核心的类要仔细分析一下:
HttpServlet
ServetConfig
ServletContext
Filter
FilterConfig
FilterChain
RequestDispatcher
HttpServletRequest
HttpServletResponse
HttpSession
Listenser
接下来我们来看一下HttpServlet,因为继承(实现)关系为HttpServlet→GenericServlet→Servlet,所以先来看一下Servlet:
Servlet
public interface Servlet
{
public abstract void init(ServletConfig servletconfig)
throws ServletException;
public abstract ServletConfig getServletConfig();
public abstract void service(ServletRequest servletrequest, ServletResponse servletresponse)
throws ServletException, IOException;
public abstract String getServletInfo();
public abstract void destroy();
}
Servlet定义了生命周期有关的和读取配置的接口,它的作用就是规定声明周期管理、接受ServletRequest和ServletResponse。
GenericServlet
再来看一下GenericServlet:
package javax.servlet;
import java.io.IOException;
import java.io.Serializable;
import java.util.Enumeration;
import java.util.ResourceBundle;
// Referenced classes of package javax.servlet:
// Servlet, ServletConfig, ServletException, ServletContext,
// ServletRequest, ServletResponse
public abstract class GenericServlet
implements Servlet, ServletConfig, Serializable
{
public void destroy()
{
}
public void init(ServletConfig config)
throws ServletException
{
this.config = config;
init();
}
public void init()
throws ServletException
{
}
//省略其他函数
}
可以看到,GenericServlet实现了Servlet、ServletConfig、Serializable三个接口类,所以GenernicServlet除了实现和预留未实现的Servelt接口,还实现了ServletConfig有关获取parameter(参数)和配置(config)的接口,同时新增与log日志有关的方法;javva.io.Serializable实际上是一个空接口类,没有可供实现的接口。
GenericServlet在实现Servlet的init()方法时,也调用了另一个无参数的init()方法,在实现Servlet时,如果有一些初始化所要执行的操作,可以重新定义这个无参数的init()方法,不要直接重新定义有参数的init()方法。
总的来说GenericServlet主要的目的,就是将Servlet调用init()方法所传入的的ServletConfig封装起來。
总结
总的来说,Servlet是JavaEE的一种标准,而servlet.http是基于HTTP协议的Servlet扩展,读完Servlet相关内容后,我们可以再进一步,关注Servlet容器。
以上是关于Servlet的主要内容,如果未能解决你的问题,请参考以下文章