1.1 Servlet
Servlet是一种用Java写的Web组件,它的目的是产生动态内容。它位于应用服务器端,由Web容器管理它的执行和生命周期。在此所讨论的应用服务器通常指的是Kingdee Apusic应用服务器。
1.1.1 Lifecycle Phase(生命周期)
Servlet使用HTTP Request-Response协议间接地通过容器与Web用户进行交互。在Servlet的体系结构中,Web服务器向应用服务器传递请求。应用服务器使用JVM(Java Virtual Machine,Java虚拟机)执行Servlet,在并发处理多个请求时启动多个独立的轻量级线程就可以满足,对于Servlet的加载与初始化只有一次,大大降低了系统开销。当请求结束时,应用服务器在内存中保留Servlet,等待新的请求。说明了一个Servlet生命周期
实例化:默认构造函数-->初始化:init()-->服务调用:service()-->销毁:destroy()
图表 1‑1
init()
public void init(ServletConfig config) throws ServletException
每一次Servlet时,会调用init方法,它仅被调用一次,以通知servlet其已经被装入服务中,可以重写此方法,为其提供只需执行一次的初始化代码,比如初始化某些值、装入数据库驱动程序等。
service()
public abstract void service(ServletRequest servletrequest,
ServletResponse servletresponse) throws ServletException,
IOException;
每次调用servlet时,servlet容器就会调用相应servlet的service方法。对于每个HTTP请求,servlet容器都会创建一个请求对象和一个响应对象,请求对象实现了javax.servlet.ServletRequest或javax.servlet.http.HttpServletRequest接口,而响应对象实现了javax.servlet.ServletResponse或javax.servlet.http.HttpServletResponser接口,并将它们传给service方法。请求对象封装了从HTTP请求里解析出来的,并且对servlet有用的信息,比如请求的URL、请求的HEAD、cookie及请求的参数等。当请求完毕以后,servlet使用响应对象将响应发送回Web客户端。
destory
public void destroy()
在删除一个servlet实例前,servlet容器会调用其destroy方法,这种情况一般发生在servlet容器需要被关闭或释放内存时。可以使用此方法来清除占用的资源(如内存、文件句柄及线程等)或确保某些持久化数据被保存。
1.1.2 Directory(目录结构)
为了运行servlet应用,需要一个servlet容器。Apusic是可用的容器之一,本书的代码都将在Apusic 5.0测试通过,但是也可以在其他支持Servlet 2.5规范的servlet容器来运行。
Servlet需要按照J2EE规范定义的目录结构打包后才可以部署到应用服务器上运行。打包有两种格式:EAR和WAR,EAR是标准的J2EE应用格式,WAR是一个Web打包文件。无论哪种打包方式,都会包括META-INF目录,是应用程序配置文件所在目录,具体说明可以参考《Apusic 5.0安装参考手册》;还会有WEB-INF目录,是Web应用配置文件所在目录。
在WEB-INF目录下包括两个子目录classes和lib,classes目录包括Web应用中用到的所有Java类(Servlet类也属于Java类一种),目录结构反映了Java包的名称;lib目录包括了Web应用中所引用的所有库文件。
所有与网页展现相关的文件(JSP文件是动态的网页展现)都直接存放在WAR根目录下。为了更好地组织这些文件,可以在WAR中直接建立子目录。例如:所有的JSP文件都放在jsp子目录中,所有的图片文件都放在images子目录中。除了WEB-INF目录以外,Web客户端可以直接访问WAR中的所有文件。
一般情况下,一个Web应用会有一个部署描述符,文件名称是web.xml的XML文件,其中包含了应用的完整描述,此文件也放在WEB-INF目录下。
1.1.3 Deploy Description(部署描述符)
web.xml(部署描述符)是XML文件,可以使用文本编辑器来编辑它。符合servlet 2.5规范的应用部署描述符格式如下:
<?xml version="1.0" encoding="UTF-8"?><o:p></o:p>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"><o:p></o:p>
</web-app><o:p></o:p>
这个XML头指明了该部署描述符的XML模式(XML Schema Description)可以从http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd下载。如果打开这个文件,可以了解到里面有许多元素,但是这些元素都是可选的,不强制使用任何一个。<o:p></o:p>
提示 1‑1所有的元素都插入到<web-app>与</web-app>之间。<o:p></o:p>
定义Servlet<o:p></o:p>
在Web浏览器访问servlet之前,需要先在web.xml里将其映射到一个路径。例如: 程序清单 1‑1将一个叫做MyServlet的servlet文件映射到/MyURL路径上。<o:p></o:p>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>ch01.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyURL</url-pattern>
</servlet-mapping>
程序清单 1‑1 web.xml中的servlet映射<o:p></o:p>
这样用户就可以通过http://localhost:6888/appName/MyURL来访问该servlet。
提示 1‑2修改了web.xml后,需要重新启动应用才能生效。<o:p></o:p>
定义Context<o:p></o:p>
在web.xml中还可以定义初始化用的上下文参数,这些参数可以应用于所有的servlet/JSP页面中,从而避免将这些信息硬编码在servlet的代码里。例如:程序清单 1‑2将userName/zhuyuanxiang和password/apusic进行了注入。<o:p></o:p>
<context-param>
<param-name>userName</param-name>
<param-value>zhuyuanxiang</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>apusic</param-value>
</context-param><o:p></o:p>
程序清单 1‑2 web.xml中context的定义<o:p></o:p>
1.1.4 Context Parameter(上下文参数)<o:p></o:p>
为了获取web.xml中定义的上下文参数,首先需要获得实现ServletContext接口对象,然后再调用接口的两个方法:<o:p></o:p>
l getInitParametersName()。不需要传入参数,返回包含所有context参数名的java.util.Enumeration。<o:p></o:p>
l getInitParameter()。需要传入一个String类型参数,参数是上下文名字,返回包含上下文定义的值。<o:p></o:p>
<o:p> </o:p>