Servlet技术是一种实现动态网页的解决方案,它是基于Java编程语言的WEB服务器端编程技术。
Servlet技术也是JSP技术(另外一种动态网页开发技术)的基础。
一个Servlet程序就是一个实现了特殊接口的?Java类,它由支持Servlet(具有Servlet引擎)的WEB服务器调用和启动运行。
一个Servlet程序负责处理它所对应的一个或一组URL地址的访问请求,并接收客户端发出的访问请求信息和产生响应内容。
Applet是用于浏览器端的Java小程序,Servlet是用于WEB服务器端的Java小程序。
获取客户端通过HTML的FORM表单递交的数据和URL后面的参数信息
创建对客户端的响应消息内容
访问服务器端的文件系统
连接数据库并开发基于数据库的应用
调用其它的Java类
Servlet API(Servlet Application Programming Interface)是一套专门用于开发Servlet程序的Java类和接口。 早期包装Servlet API的jar包被称之为JSDK(Java Servlet Development Kit,即JavaServlet开发工具包),最新版本的JavaServlet开发工具包已经被集成到了JavaEE(J2EE升级后的名称,即Java企业级版本)开发工具包中。
Servlet接口,它实现了Servlet程序的基本特征和功能。javax.servlet.http.HttpServlet类是GenericServlet的子类,它在GenericServlet类的基础上进行了一些针对HTTP特点的扩充
客户端每次访问一个支持HTTP的Servlet程序时,Servlet引擎都将调用Servlet的service方法来进行处理。service方法接受两个参数,一个是用于封装HTTP请求消息的对象,其类型为HttpServletRequest,另一个是代表HTTP响应消息的对象,其类型为HttpServletResponse。调用HttpServletResponse对象的getWriter方法可以获得一个文本输出流对象,向这个流对象中写入的数据将作为HTTP响应消息的实体内容部分发送给客户端。
Servlet程序必须通过Servlet引擎来启动运行,并且储存目录有特殊要求,通常需要存储在<WEB应用程序目录>\WEB-INF\classes\目录中。
Servlet程序必须在WEB应用程序的web.xml文件中或使用Annotation进行注册和映射其访问路径,才可以被Servlet引擎加载和被外界访问。
一个<servlet>元素用于注册一个Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。
缺省Servlet
如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求
在<tomcat的安装目录>\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。
当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet。
1.Servlet引擎检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第4步,否则,执行第2步。
2.装载并创建该Servlet的一个实例对象。
3.调用Servlet实例对象的init()方法。
4.创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
5.WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
load-on-startup
在<servlet>元素中嵌套一个<load-on-startup>子元素,WEB应用程序在启动时就可以装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。
举例:
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
init方法
在Servlet的整个生命周期内,它的init方法只被调用一次,而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法。自动重新装载
Tomcat也提供了是否自动重新装载被修改的Servlet的配置选项。在<Tomcat安装主目录>/conf/server.xml文件中,可以将<Context>元素的reloadable属性设置为true,这样,Tomcat将监视该WEB应用程序的/WEB-INF/classes和/WEB-INF/lib目录下的类是否发生了改变,然后自动重新装载那些发生了改变的类。
举例:
<Context path="/it" docBase="d:\myweb" debug="0" reloadable="true"/>
虽然Servlet源程序中引用的是Servlet API,但Servlet运行时真正调用的对象是由Servlet容器中的实现类创建的,所以,将Servlet API的jar包增加到CLASSPATH环境变量中,只能保证Servlet程序可以被成功编译,但不能让Servlet程序离开Servlet容器运行。
ServletConfig接口
Servlet在有些情况下可能需要访问Servlet容器或借助Servlet容器访问外部的资源,所以,Serlvet引擎需要将表示Servlet容器的对象传递给Servlet。另外,在web.xml文件中为某个Servlet设置的友好名称和初始化参数等信息也需要传递给该Servlet。 Servlet引擎将代表Servlet容器的对象和Servlet的配置参数信息一并封装到一个称为ServletConfig的对象中,并在初始化Servlet实例对象时传递给该Servlet。ServletConfig接口则用于定义ServletConfig对象需要对外提供的方法,以便在Servlet程序中可以调用这些方法来获取有关信息。Servlet引擎调用Servlet的实例对象的init(ServletConfig?config)方法将ServletConfig对象传递给Servlet。Servlet.getServletConfig()方法必须返回init(ServletConfig?config)方法传递进来的这个ServletConfig对象的引用。
ServletContext接口
Servlet引擎为每个WEB应用程序都创建一个对应的ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用ServletConfig.getServletContext方法可以返回ServletContext对象的引用。由于一个WEB应用程序中的所有Servlet都共享同一个ServletContext对象,所以,ServletContext对象被称之为application 对象(Web应用程序对象)。
功能:
获取WEB应用程序的初始化参数
application域范围的属性
访问资源文件
获取虚拟路径所映射的本地路径
WEB应用程序之间的访问
ServletContext的其他方法
Filter
主要用途:当客户端请求某个网页(HTML/JSP/Servlet)之前,让过滤器先对其进行适当的“过滤”;或者当服务器端对客户端的请求做出响应之前,让过滤器先对其进行适当的“过滤”;
在从一个页面跳转(forward)到其他页面的时候;
在包含(include)其他的内容的时候;
在发生错误的时候。
使用Filter:
1.创建一个类,实现Filter接口,并且实现其中的方法:
init()方法是它的初始化方法,在Filter被装载的时候被自动调用;
doFilter()方法是Filter类的核心方法,我们希望过滤器完成的功能,都应该放到这个方法中;
destroy()方法是当Filter销毁的时候调用的方法;
2.将过滤的任务放到doFilter()方法中,这个方法有三个参数:ServletRequest、ServletResponse和FilterChain,其中ServletRequest和ServletResponse为传递给方法的请求和响应 参数,而FilterChain是用来把请求和响应传递给下一个Filter或者其他JSP/Servlet等资源;
3.在doFilter()中调用FilterChain的doFilter()方法,它只有两个参数:ServletRequest和ServletResponse,通常只要将Filter的doFilter()方法的前两个当作它的参数就可以了;
4.在web.xml或Annotation注册这个Filter,以及它将过滤的页面。
Listener
当Servlet Context刚被创建准备接受第一个请求的时候,或者Servlet Context即将关闭的时候,都会通知ServletContext Listener 。ServletContextListener
ServletContextListener用于监听Servlet Context的变化,
它有两个方法:
servletContextInitialized(ServletContext Event sce):当Servlet
servletContextDestroyed(ServletContext Event sce):当Servlet Context销毁的时候(例如关闭应用服务器或者重新加载应用),将会调用这个方法。
ServletContextAttributeListener
当往Servlet Context添加、删除或者替换一个属性的时候,将会通知ServletContext AttributeListener。
方法:
void attributeAdded(ServletContextAttributeEvent scab):当往ServletContext中加入一个属性的时候,将会调用这个方法;
void attributeRemoved(ServletContextAttributeEvent scab):当从ServletContext中删除一个属性的时候,将会调用这个方法;
void attributeReplaced(ServletContextAttributeEvent scab):当改变ServletContext中的属性的时候,将会调用这个方法。
HttpSessionListener
当一个HttpSession刚被创建(created)或者失效(invalidated)的时候,将会通知HttpSessionListener 。
方法:
void sessionCreated(HttpSessionEvent hse):当一个HttpSession对象被创建时,将会调用这个方法;
void sessionDestroyed(HttpSessionEvent hse):当一个HttpSession超时或者调用HttpSession的invalidate()方法让它销毁时,将会调用这个方法 。
HttpSessionAttributeListener
当往一个HttpSession中添加、删除或者替换一个属性的时候,将会通知Http SessionAttributeListener
方法:
void attributeAdded(HttpSessionBindingEvent e):当往会话中加入一个属性的时候,将会调用这个方法;
void attributeRemoved(HttpSessionBindingEvent e):当从会话中删除一个属性的时候,将会调用这个方法;
void attributeReplaced(HttpSessionBindingEvent e):当改变会话中的属性的时候,将会调用这个方法。