Servlet和Servlet容器:
我们通过浏览器访问一个网页的过程,实际上是浏览器通过HTTP协议和WEB服务器进行
交互的过程。也就是说,用户要访问网络资源,首先需要在网络上架设Web服务器来为
用户提供 内容服务,所有的内容都存在与服务器端,客户端发出请求,服务器端对对
请求作出响应,将用户请求的资源发送到客户端。
开发WEB应用程序一般是利用已经实现了HTTP协议的服务器端软件,这些软件为我们提
供了扩展的接口,我们只需要按照一定的规则去提供相应的扩展功能。当这类Web服务
器接受到客户请求后,判断请求是否访问我们提供的扩展功能,如果是,就将请求交由
我们所编写的程序去处理。当处理完成后,程序将处理结果交给Web服务器软件,web服
务器再将结果作为相应信息返回给客户端。
在Java中,给我们提供了编写扩展功能的技术——Servlet。Java Servlet(Java服务
器小程序)是一个基于Java技术的Web组件,运行在服务器端,由Servlet容器所管理,
用于生成动态的内容。Servlet是平台独立的Java类,编写一个Servlet,实际上就是按
照Servlet规范写一个Java类。Servlet被编译为平台中立的字节码,可以被动态加载到
支持Java技术的Web服务器中运行。
Servlet容器有时也叫Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在
发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化基于MIME的响应。
Servlet容器在Servlet的生命周内包容和管理Servlet。
Servlet容器根据工作模式的不同,分三类:
1、独立的Servlet容器;
2、进程内的Servlet容器;
3、进程外的Servlet容器。
注:
Catalina :Tomcat 源于 Apache Jakarta 的开放源代码项目。Tomcat 是一种 Web 容
器,其中包括 servlet 和 JSP 容器(引擎)。从Tomcat4.0x中采用了新的Servlet容
器catalina。
Servlet接口:
接口提供了5个方法:
1、public void init(ServletConfig config)throws ServletException
init():在Servlet实例化之后,Servlet容器会调用init()方法,来初始化该对象,
主要是为了让Servlet对象在处理客户请求前完成一些初始化工作,例如:建立数据库
的连接,获取配置信息等。对于每个Servlet实例,init()方法只能被调用一次。
servlet容器通过参数config向Servlet传递配置信息。Servlet使用ServletConfig对象
从Web应用程序的配置信息中获取以名-值对形式提供的初始化参数。另外,在Serlet
中,还可以通过ServletConfig对象获取描述Servlet运行环境的ServletContext对象,
使用该对象,Servlet可以和它的容器进行通信。
2、public vlid service(ServletRequest req,ServletResponse res)throws
ServletExcepton,java.io.IOException
service():容器调用service()方法来处理客户端的请求。要注意的是,在service
()方法被容器调用之前,必须确保init()方法正确完成。容器会构造一个表示客户端请
求信息的请求对象(类型为ServletRequest)和一个用于响应的响应对象
(ServletReponse)作为参数传递给service()。
3、public void destory()
当容器检测到一个Servlet对象应该从服务中被移出的时候,容器会调用该对象的
destory()方法,以便让Servlet对象可以释放所使用的资源,以保存到持久存储设备中
。例如:将内容中的数据保存到数据中,关闭数据库连接等。
4、public ServletConfig getServletConfig()
getServletConfig():该方法返回容器调用init()方法时传递给Servlet对象的
ServletConfig对象,ServletConfig对象包含了Servlet的初始化参数。
5、public java.lang.String.getServletInfo()
getServletInfo():返回一个String类型的字符串,其中包括了关于Servlet的信息
,例如作者、版本和版权。
GenericServleta:
如果我们直接通过实现Servlet接口来编写一个Servlet类,就需要实现Servlet接口中定义的5中方法,为了简化Servlet的编写,在javax.servlet包中,给我们提供了一个抽象的类GenericServlet,它提供了除service()方法外的其他4种方法的简单实现。GenericServlet类定义了一个通用的、不依赖于具体协议的Servlet,它实现了Servlet接口和ServletConfig接口。
如果我们要编写一个通用的Servlet,只需要从GenericServlet类继承,并实现其中的抽象方法service()。
GenericServlet类中,提供了两种重载的init()方法:
·public void init(ServletConfig config)throws ServletException
·public void init()throws ServletException
第一种init()方法是Servlet接口中init()方法的实现。这种方法中,首先将ServletConfig对象保存在一个transient实例变量中,然后调用第二种不带参数的init()方法。
通常我们在编写集成自GenericServlet的Servlet类时,只需重写第一种不带参数的init()方法就可以了。如果覆盖了第一种init()方法,那么应该在子类的该方法中,包含一句super.init(config)代码调用。
HttpServlet:
在应用中都是浏览器通过HTTP协议去访问服务器端的资源,而我们所编写的Servlet也主要应用于HTTP协议的请求和响应。Sun公司在javax.servlet.http包中给我们提供了一个抽象的类HttpServlet,它继承自GenericServlet类,用于创建适合Web站点的HTTPServlet。
HttpServlet提供了两种重载service()方法:
·public void service(ServletRequest req,ServletResponse res)throws ServletExcepton,java.io.IOException
·public void service(HttpServletRequest req,HttpServletResponse resp) throws ServletException,java.io.IOException
第一种service()方法是GenericeServlet类中的service()方法的实现。在这种方法中,首先将req和res对象转换为HttpServletRequest(继承自ServletRequest接口)和HttpServletResponse(继承自ServletResponse接口)类型,然后调用第二种service()方法,对客户请求进行处理。
针对HTTP1.1中定义的7种请求方法Get、Post、Head、Put、Delete、Trace和Options、HttpServlet分别提供了7种处理方法。
HttpServlet虽然是抽象类,但在这个类中没有抽象的方法,其中所有的方法都是已经实现的。只是在这个类中对客户请求进行处理的方法,没有真正的实现,当然也不可能真正的实现。
Servlet定义两个异常类:ServletException和UnavailableException。
ServletException类定义了一个一般的异常,可以被init()、service()、doXXX()方法抛出,这个类提供了下面4种构造方法和1种实例方法。
·public ServletException()
构造一个新的servlet异常
·public ServletException(java.lang.String.message)
message可以被写入服务器的日志中,或者显示给用户。
·public ServletException(java.lang.String.message,java.lang.Throwable rootCause)
在Servlet执行时,如果有一个异常阻碍了servlet的正常操作,那么这个异常就是根原因(rootcause)异常。
·public ServletException(java.lang.Throwable rootCause)
·public java.lang.Throwable getRootCause()
该方法返回引起这个servlet异常的异常,也就是返回根原因的异常。
UnavailableException类:
UnavailableException类是ServletException类的子类,该异常被Servlet抛出,用于向Servlet容器指示这个Servlet永久的或者暂时的不可用。提供了下面2中构造方法和3种实例方法。
·public UnavailableException(java.lang.String msg)
该方法用一个给定的消息构造一个新的异常,指示Servlet永久不可用。
·public UnavailableException(java.lang.String msg,int seconds)
暂时不可用,secondes内不可以用。
·public int getUnavailableSecondes()
该方法返回Servlet预期的暂时不可用的秒数。负数表明永久不可以用或估计不出。
·public boolean isPermanent()
该方法返回一个布尔值,返回true,表明是否永久不可以用。false表示可用或暂时不可用。
未完待续!
servlet 例子见附件。可直接导入到eclipse.