[b]一、什么是Servlet[/b]
Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。 它担当
客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。
Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,
Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。
[color=red]一个servlet就是Java编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序。虽然servlet可以对任何类型的请求产生响应,但通常只用来扩展Web服务器的应用程序。Java Servlet技术为这些应用程序定义了一个特定于HTTP的 servlet类。
javax.servlet和javax.servlet.http包为编写servlet提供了接口和类。所有的servlet都必须实现Servlet接口,该接口定义了生命周期方法。
当实现一个通用的服务时,您可以使用或扩展由Java Servlet API提供的GenericServlet类。HttpServlet类提供了一些方法,诸如doGet和doPost,以用于处理特定于HTTP的服务。[/color]
[b]二、Servlet生命周期[/b]
装载Servlet。这项操作一般是动态执行的。然而,Server通常会提供一个管理的选项,用于在Server启动时
强制装载和初始化特定的Servlet。
Server创建一个Servlet的实例
Server调用Servlet的init()方法
一个客户端的请求到达Server
Server创建一个请求对象
Server创建一个响应对象
Server激活Servlet的service()方法,传递请求和响应对象作为参数
service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
service()方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其
它方法以处理请求,如doGet()或doPost()或程序员自己开发的新的方法。
对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这
两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用init()方法。一般Servlet只初始化一次
(只有一个对象),当Server不再需要Servlet时(一般当Server关闭时),Server调用Servlet的Destroy()方法
。
[b]三、Java Servlet 与 Applet 的比较[/b]
相似之处:
* 它们不是独立的应用程序,没有main()方法。
* 它们不是由用户或程序员调用,而是由另外一个应用程序(容器)调用。
* 它们都有一个生存周期,包含init()和destroy()方法。
不同之处:
* Applet具有很好的图形界面(AWT),与浏览器一起,在客户端运行。
* Servlet 则没有图形界面,运行在服务器端。
[b]四、Servlet与jsp区别[/b]
Servlet是一种在服务器端运行的Java程序,从某种意义上说,它就是服务器端的Applet。所以Servlet可以
像Applet一样作为一种插件(Plugin)嵌入到Web Server中去,提供诸如HTTP、FTP等协议服务甚至用户自已
定制的协议服务。而JSP是继Servlet后Sun公司推出的新技术,它是以Servlet为基础开发的,Servlet与JSP
区别:
(1)编程方式不同
JSP是为了解决Servlet中相对困难的编程技术而开发的技术,因此,JSP在程序的编写方面比Servlet要容易
的多,Servlet严格遵循Java语言的编程标准,而JSP则遵循脚本语言的编制标准。
(2)Servlet必须在编译以后才能执行
JSP并不需要另外进行编译,JSP Container会自动完成这一工作,而Servlet在每次修改代码之后都需要编译
完才能执行。
(3)运行速度不同
由于JSP Container将JSP程序编译成Servlet的时候需要一些时间,所以JSP的运行速度比Servlet要慢一些,
不过,如果JSP文件能毫无变化的重复使用,它在第一次以后的调用中运行速度就会和Servlet一样了,这是
因为JSP Container接到请求以后会确认传递过来的JSP是否有改动,如果没有改动的话,将直接调用JSP编译
过的Servlet类,并提供给客户端解释执行,如果JSP文件有所改变,JSP Container将重新将它编译成
Servlet,然后再提交给客户端
编译后的jsp文件
public final class costtypeshow_jsp extends HttpJspBase
其中
public interface HttpJspPageextends JspPage
public interface JspPageextends Servlet
public interface Servlet
Servlet接口中的方法如下:
void destroy()
ServletConfig getServletConfig()
java.lang.String getServletInfo()
void init(ServletConfig config)
void service(ServletRequest req, ServletResponse res)
Servlet
public class CommonServlet extends HttpServlet
public abstract class HttpServletextends GenericServlet implements java.io.Serializable
public abstract class GenericServletextends java.lang.Object implements Servlet, ServletConfig,
java.io.Serializable
public interface Servlet
[b]五、ServletConfig与ServletContext区别[/b]
首先从作用范围来说,ServletConfig作用于某个特定的Servlet,即从该Servlet实例化,那么就开始有
效,但是该Servlet之外的其他Servlet不能访问;ServletContext作用于某个web应用,即在一个web应用中
相当于一个全局对象,在Servlet容器启动时就已经加载,对于不同的web应用,有不同的ServletContext。
其次,来看一下二者参数的使用。如果一个参数为整个web应用所用,那么就配置为ServletContext参数,如
果一个参数仅为一个Servlet所用,那么就应该配置为ServletConfig参数。
具体如:
上下文参数
<context-param>
<param-name>MainPath</param-name>
<param-value>D:\dionysus\common\EBS\WebContent\</param-value>
<description></description>
</context-param>
和
<servlet>
<servlet-name>affice_add</servlet-name>
<servlet-class>servlet.Affice_add</servlet-class>
<init-param>
<param-name>filepath</param-name>
<param-value>/webContent/affice</param-value>
</init-param>
</servlet>
最后,说明一下参数的获取。访问ServletConfig参数,取得ServletConfig对象后,调用getInitParameter
()方法;访问ServletContext对象,只要调用现有的ServletConfig对象的getServletContext()即可,然后同
样调用getInitParamter()方法就能获取参数。
[b]六、使用作用域对象[/b]
几个协作的Web组件通过一些对象来共享信息,这些对象是作为四个作用域对象的属性来维护的。这些
属性可以通过表示域的类的[get|set]Attribute方法访问。表14-3列出了这个作用域对象。
表14-3 作用域对象
作用域对象 类 哪些组件可以对其进行访问
Web 上下文 [b]javax.servlet.ServletContext [/b]Web上下文中的Web组件。见访问Web上下文
会话[b] javax.servlet.http.HttpSession [/b]处理属于会话的请求的Web组件。见维护客户端状态。
请求 [b]javax.servlet.ServletRequest [/b]的子类型 处理请求的Web组件。
页 [b]javax.servlet.jsp.PageContext [/b]创建对象的JSP页。见隐式对象。
[b]七、控制对共享资源的并发访问 [/b]
在多线程的服务器中,可能出现对共享资源的并发访问。除了作用域对象属性外,共享资源还包括存储器中的数据(如实例和类变量)、外部对象(如文件)、数据库连接和网络连接。并发访问可出现在多个情况下。
· 多个Web组件访问存储在Web上下文中的对象。t
· 多个Web组件访问存储在会话中的对象。
· 一个Web组件中的多个线程访问实例变量。一个Web容器一般为每个请求创建一个线程来处理。如果用户确认一个servlet实例每次只处理一个请求,servlet就能实现SingleThreadModel 接口。如果servlet实现了这个接口,用户就能确保servlet的服务方法中不可能有两个线程并发执行。Web容器可通过同步访问一个servlet的单独实例、或者通过维护一个Web组件池为每个实例调用一个新的请求来实现。这个接口并不能防止Web组件访问共享资源(如静态类变量、外部对象)导致的同步问题
当资源可以并发访问时,使用资源也就可以用不一致的方式。为了防止这样的情况发生,用户必须使用在Java指导中的线程单元中描述的同步机制来控制访问。
[b]八、分析Servlet接口[/b]
public interface Servlet
包含方法如下:
[b]void destroy() [/b]
Called by the servlet container to indicate to a servlet that the servlet is being taken out of service.
[b]ServletConfig getServletConfig() [/b]
Returns a ServletConfig object, which contains initialization and startup parameters for this servlet.
[b]java.lang.String getServletInfo()[/b]
Returns information about the servlet, such as author, version, and copyright.
[b]void init(ServletConfig config) [/b]
Called by the servlet container to indicate to a servlet that the servlet is being placed into service.
[b]void service(ServletRequest req, ServletResponse res) [/b]
[b] 九、分析GenericServlet[/b]
public abstract class GenericServlet extends java.lang.Object implements Servlet, ServletConfig, java.io.Serializable
方法如下:
void destroy()
java.lang.String getInitParameter(java.lang.String name)
java.util.Enumeration<java.lang.String> getInitParameterNames()
ServletConfig getServletConfig()
ServletContext getServletContext()
java.lang.String getServletInfo()
java.lang.String getServletName()
void init()
void init(ServletConfig config)
void log(java.lang.String msg)
void log(java.lang.String message, java.lang.Throwable t)
abstract void service(ServletRequest req, ServletResponse res)
[b] 十、分析HttpServlet[/b]
public abstract class HttpServletextends GenericServlet implements java.io.Serializable
方法如下:
protected void doDelete(HttpServletRequest req, HttpServletResponse resp)
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
protected void doHead(HttpServletRequest req, HttpServletResponse resp)
protected void doOptions(HttpServletRequest req, HttpServletResponse resp)
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
protected void doPut(HttpServletRequest req, HttpServletResponse resp)
protected void doTrace(HttpServletRequest req, HttpServletResponse resp)
protected long getLastModified(HttpServletRequest req)
protected void service(HttpServletRequest req, HttpServletResponse resp)
void service(ServletRequest req, ServletResponse res)
Dispatches client requests to the protected service method.
从上面可以看出只要继承自HttpServlet类就不用重写service或自己重写doget和的dopost方法了。
Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。 它担当
客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。
Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,
Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。
[color=red]一个servlet就是Java编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序。虽然servlet可以对任何类型的请求产生响应,但通常只用来扩展Web服务器的应用程序。Java Servlet技术为这些应用程序定义了一个特定于HTTP的 servlet类。
javax.servlet和javax.servlet.http包为编写servlet提供了接口和类。所有的servlet都必须实现Servlet接口,该接口定义了生命周期方法。
当实现一个通用的服务时,您可以使用或扩展由Java Servlet API提供的GenericServlet类。HttpServlet类提供了一些方法,诸如doGet和doPost,以用于处理特定于HTTP的服务。[/color]
[b]二、Servlet生命周期[/b]
装载Servlet。这项操作一般是动态执行的。然而,Server通常会提供一个管理的选项,用于在Server启动时
强制装载和初始化特定的Servlet。
Server创建一个Servlet的实例
Server调用Servlet的init()方法
一个客户端的请求到达Server
Server创建一个请求对象
Server创建一个响应对象
Server激活Servlet的service()方法,传递请求和响应对象作为参数
service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
service()方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其
它方法以处理请求,如doGet()或doPost()或程序员自己开发的新的方法。
对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这
两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用init()方法。一般Servlet只初始化一次
(只有一个对象),当Server不再需要Servlet时(一般当Server关闭时),Server调用Servlet的Destroy()方法
。
[b]三、Java Servlet 与 Applet 的比较[/b]
相似之处:
* 它们不是独立的应用程序,没有main()方法。
* 它们不是由用户或程序员调用,而是由另外一个应用程序(容器)调用。
* 它们都有一个生存周期,包含init()和destroy()方法。
不同之处:
* Applet具有很好的图形界面(AWT),与浏览器一起,在客户端运行。
* Servlet 则没有图形界面,运行在服务器端。
[b]四、Servlet与jsp区别[/b]
Servlet是一种在服务器端运行的Java程序,从某种意义上说,它就是服务器端的Applet。所以Servlet可以
像Applet一样作为一种插件(Plugin)嵌入到Web Server中去,提供诸如HTTP、FTP等协议服务甚至用户自已
定制的协议服务。而JSP是继Servlet后Sun公司推出的新技术,它是以Servlet为基础开发的,Servlet与JSP
区别:
(1)编程方式不同
JSP是为了解决Servlet中相对困难的编程技术而开发的技术,因此,JSP在程序的编写方面比Servlet要容易
的多,Servlet严格遵循Java语言的编程标准,而JSP则遵循脚本语言的编制标准。
(2)Servlet必须在编译以后才能执行
JSP并不需要另外进行编译,JSP Container会自动完成这一工作,而Servlet在每次修改代码之后都需要编译
完才能执行。
(3)运行速度不同
由于JSP Container将JSP程序编译成Servlet的时候需要一些时间,所以JSP的运行速度比Servlet要慢一些,
不过,如果JSP文件能毫无变化的重复使用,它在第一次以后的调用中运行速度就会和Servlet一样了,这是
因为JSP Container接到请求以后会确认传递过来的JSP是否有改动,如果没有改动的话,将直接调用JSP编译
过的Servlet类,并提供给客户端解释执行,如果JSP文件有所改变,JSP Container将重新将它编译成
Servlet,然后再提交给客户端
编译后的jsp文件
public final class costtypeshow_jsp extends HttpJspBase
其中
public interface HttpJspPageextends JspPage
public interface JspPageextends Servlet
public interface Servlet
Servlet接口中的方法如下:
void destroy()
ServletConfig getServletConfig()
java.lang.String getServletInfo()
void init(ServletConfig config)
void service(ServletRequest req, ServletResponse res)
Servlet
public class CommonServlet extends HttpServlet
public abstract class HttpServletextends GenericServlet implements java.io.Serializable
public abstract class GenericServletextends java.lang.Object implements Servlet, ServletConfig,
java.io.Serializable
public interface Servlet
[b]五、ServletConfig与ServletContext区别[/b]
首先从作用范围来说,ServletConfig作用于某个特定的Servlet,即从该Servlet实例化,那么就开始有
效,但是该Servlet之外的其他Servlet不能访问;ServletContext作用于某个web应用,即在一个web应用中
相当于一个全局对象,在Servlet容器启动时就已经加载,对于不同的web应用,有不同的ServletContext。
其次,来看一下二者参数的使用。如果一个参数为整个web应用所用,那么就配置为ServletContext参数,如
果一个参数仅为一个Servlet所用,那么就应该配置为ServletConfig参数。
具体如:
上下文参数
<context-param>
<param-name>MainPath</param-name>
<param-value>D:\dionysus\common\EBS\WebContent\</param-value>
<description></description>
</context-param>
和
<servlet>
<servlet-name>affice_add</servlet-name>
<servlet-class>servlet.Affice_add</servlet-class>
<init-param>
<param-name>filepath</param-name>
<param-value>/webContent/affice</param-value>
</init-param>
</servlet>
最后,说明一下参数的获取。访问ServletConfig参数,取得ServletConfig对象后,调用getInitParameter
()方法;访问ServletContext对象,只要调用现有的ServletConfig对象的getServletContext()即可,然后同
样调用getInitParamter()方法就能获取参数。
[b]六、使用作用域对象[/b]
几个协作的Web组件通过一些对象来共享信息,这些对象是作为四个作用域对象的属性来维护的。这些
属性可以通过表示域的类的[get|set]Attribute方法访问。表14-3列出了这个作用域对象。
表14-3 作用域对象
作用域对象 类 哪些组件可以对其进行访问
Web 上下文 [b]javax.servlet.ServletContext [/b]Web上下文中的Web组件。见访问Web上下文
会话[b] javax.servlet.http.HttpSession [/b]处理属于会话的请求的Web组件。见维护客户端状态。
请求 [b]javax.servlet.ServletRequest [/b]的子类型 处理请求的Web组件。
页 [b]javax.servlet.jsp.PageContext [/b]创建对象的JSP页。见隐式对象。
[b]七、控制对共享资源的并发访问 [/b]
在多线程的服务器中,可能出现对共享资源的并发访问。除了作用域对象属性外,共享资源还包括存储器中的数据(如实例和类变量)、外部对象(如文件)、数据库连接和网络连接。并发访问可出现在多个情况下。
· 多个Web组件访问存储在Web上下文中的对象。t
· 多个Web组件访问存储在会话中的对象。
· 一个Web组件中的多个线程访问实例变量。一个Web容器一般为每个请求创建一个线程来处理。如果用户确认一个servlet实例每次只处理一个请求,servlet就能实现SingleThreadModel 接口。如果servlet实现了这个接口,用户就能确保servlet的服务方法中不可能有两个线程并发执行。Web容器可通过同步访问一个servlet的单独实例、或者通过维护一个Web组件池为每个实例调用一个新的请求来实现。这个接口并不能防止Web组件访问共享资源(如静态类变量、外部对象)导致的同步问题
当资源可以并发访问时,使用资源也就可以用不一致的方式。为了防止这样的情况发生,用户必须使用在Java指导中的线程单元中描述的同步机制来控制访问。
[b]八、分析Servlet接口[/b]
public interface Servlet
包含方法如下:
[b]void destroy() [/b]
Called by the servlet container to indicate to a servlet that the servlet is being taken out of service.
[b]ServletConfig getServletConfig() [/b]
Returns a ServletConfig object, which contains initialization and startup parameters for this servlet.
[b]java.lang.String getServletInfo()[/b]
Returns information about the servlet, such as author, version, and copyright.
[b]void init(ServletConfig config) [/b]
Called by the servlet container to indicate to a servlet that the servlet is being placed into service.
[b]void service(ServletRequest req, ServletResponse res) [/b]
[b] 九、分析GenericServlet[/b]
public abstract class GenericServlet extends java.lang.Object implements Servlet, ServletConfig, java.io.Serializable
方法如下:
void destroy()
java.lang.String getInitParameter(java.lang.String name)
java.util.Enumeration<java.lang.String> getInitParameterNames()
ServletConfig getServletConfig()
ServletContext getServletContext()
java.lang.String getServletInfo()
java.lang.String getServletName()
void init()
void init(ServletConfig config)
void log(java.lang.String msg)
void log(java.lang.String message, java.lang.Throwable t)
abstract void service(ServletRequest req, ServletResponse res)
[b] 十、分析HttpServlet[/b]
public abstract class HttpServletextends GenericServlet implements java.io.Serializable
方法如下:
protected void doDelete(HttpServletRequest req, HttpServletResponse resp)
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
protected void doHead(HttpServletRequest req, HttpServletResponse resp)
protected void doOptions(HttpServletRequest req, HttpServletResponse resp)
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
protected void doPut(HttpServletRequest req, HttpServletResponse resp)
protected void doTrace(HttpServletRequest req, HttpServletResponse resp)
protected long getLastModified(HttpServletRequest req)
protected void service(HttpServletRequest req, HttpServletResponse resp)
void service(ServletRequest req, ServletResponse res)
Dispatches client requests to the protected service method.
从上面可以看出只要继承自HttpServlet类就不用重写service或自己重写doget和的dopost方法了。