Servlet
Servlet
简介
1.Java Servlet是和平台无关的的服务器组件,它运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。
2.Servlet可完成如下功能:
-创建并返回基于客户请求的动态HTML页面。
-创建可嵌入到现有HTML页面中的部分HTML页面(HTML片段)。
-(主要功能)与其他服务器资源(如数据库或基于Java的应用程序)进行通信。
API
1.Servlet的框架由两个Java包组成:
-java.servlet包:定义了所有的Servlet类都必须实现或扩展的通用接口和类。
-javax.servlet.http,定义了采用Http协议通信的HttpServlet类。
2.Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一个接口。在Servlet接口中定义了五个方法,其中有三个方法代表了Servlet的生命周期:
-init方法:负责初始化Servlet对象;
-service方法:负责相应客户的请求;
-destroy方法:当Servlet对象退出生命周期时,负责释放占用的资源。
3.ServletRequest接口:封装了客户请求信息,如客户请求方式、参数名和参数值、客户端正在使用的协议,以及发出客户请求的远程主机信息等;该接口还为Servlet提供了直接以二进制方式读取客户请求数据流的ServletInputStream;ServletRequest的子类可以为Servlet提供更多和特定协议相关的数据,例如:HttpServlrtRequest提供了读取Http Head信息的方法。
4.ServletResponse接口:为Servlet提供了返回响应结果的方法。它允许Servlet设置返回数据的长度和MIME类型,并且提供输出流ServletOutpuStream;ServletResponse子类可以为Servlet提供更多和特定协议相关的数据,例如:HttpServlrtRequest提供了读取Http Head信息的方法。
实现机制
1.每一个Servlet都必须实现Servlet接口GenericServlet是个通用的、不特定于任何协议的Servlet,它实现了Servlet接口,而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口,所以我们定义的Servlet只需要继承HttpServlet父类即可。
2.Servlet接口中定义了一个service方法,HttpServlet对该方法进行了实现,实现方式就是将ServletRequest与ServletResponse转换为HttpServletRequest与HttpServletResponse。
3.转换完毕后,会调用HttpServlet类中自己定义的service方法:
4.在该service方法中,首先得到请求的方法名,然后根据方法名调用对应的doXXX方法,比如说请求方法为GET,那么就去调用doGet方法;请求方法为POST,那么就调用doPost方法.
5.在HttpServlet类中所提供的的doGet,doPost等方法都是直接返回错误信息,所以我们需要在自己定义的Servlet类中override这些方法。
生命周期
1.三个阶段:初始化阶段(init方法),相应客户请求阶段(service),终止阶段(destroy方法)。
某些Servlet在web.xml文件中只有
定义自己的HttpServlet类的步骤
ServletContext和web应用关系
Servlet的多线程同步问题(重要)
Servlet本身是单实例的,这样当有多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例中的成员变量,如果对成员变量进行写入操作,那就会导致Servlet的多线程问题,即反映到客户端的数据不一样。
解决方案:
1.Servlet实现javax.servlet.SingleThreadModel(Servlet2.4中已经废弃该接口),此时Servlet容器将保证Servlet实例以单线程方式运行,也就是说,同一时刻,只会有一个线程执行Servlet的service方法。
2.去除成员变量,使用局部变量。(最好的方式)
3.使用同步代码块:synchronized{...}
Cookie
Cookie的英文原意是点心,它是用户访问Web服务器时,服务器在用户硬盘上存放的信息,好像是服务器送给客户的点心,服务器可以根据Cookie来跟踪用户,这对于需要区别用户的场合(如电子商务)特别有用;一个Cookie包含一对Key/Value,可用代码生成一个Cookie并将它写到用户的硬盘上:Cookie theCookie = new Cookie(“cookieName”,“cookieValue”);response.addCookie(theCookie)
Servlet和JSP比较
1.都可以生成动态网页
2.JSP的有点是擅长于网页制作,生成动态页面,比较直观,但不易跟踪和排错。
3.Servlet是纯Java语言,擅长处理流程和业务逻辑,但生成动态网页不直观。