Java Servlet,Java的服务器端小程序。这个容易让我们想起applet,实际上servlet和applet有很多共同之处,首先,它们是非独立的Java应用程序,不能由用户或者程序员来调用,而是由容器进行管理。不同的是,applet是有图形化界面的,实际它继承于java.awt.Panel类,因此它有Panel的方法,常常需要重写的paint方法,也是来自Container,另外applet是运行在客户端浏览器中。而Servlet没有图形化界面,它存在于服务器的Servlet容器中,运行在服务器端。
Servlet被编写成字节码,动态加载到支持Java的服务器中。所谓Servlet容器,又说Servlet引擎,用来包容和管理Servlet,是服务器的一部分,用来在发送和响应请求的时候提供一些服务,包含网络服务,解码,格式化等等。
而,从用户发送请求到获取信息的过程一般是这样,首先客户端浏览器发送一个HTTP请求,这个请求是符合HTTP规范的,便于服务器端对请求进行解析和处理,请求到达服务器,服务器将请求分发给Servlet容器,由Servlet容器来加载对应的Servlet实例,Servlet实例获取客户端请求,进行相应的处理和响应,Servlet容器负责将HTTP响应正确送出,并到达客户端。此过程如下图:
那么,现在我们来分析一下这整个过程,并看一看Webx框架中,是如何处理的
1.应该使用哪一个Servlet实例来处理?
(服务器将请求分发给Servlet容器,由Servlet容器来加载对应的Servlet实例)
首先拿到一个URL,服务器会根据URL选择对应的Web应用,这部分URL被成为Context Path;然后在对应的Web应用中,会在web.xml文件中去查找对应的Servlet,经过这个过程服务器从一个请求,可以决定加载哪一个Servlet实例来处理这个请求。在web.xml中通过配置servlet-mapping来配置Servlet,这部分URL被成为Servlet Path
而在Webx框架中,使用WebxControllerServlet来处理
<servlet-name>WebxController</servlet-name>
<servlet-class>com.alibaba.webx.WebxControllerServlet</servlet-class>
...
<servlet-mapping>
<servlet-name>WebxController</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>WebxController</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
...
2.Servlet生命周期
Servlet实现了javax.servlet.Servlet接口,这个接口有五个方法
1)public ServletConfig getServletConfig(),是Servlet的配置信息,以名值对的形式提供初始化参数,包含Servlet名称,InitParameter, ServletContext(用于和其他Servlet通信)
2)public String getServletInfo(),获取Servlet的相关信息
3)public void init(ServletConfig config) throws ServletException
Servlet初始化。Servlet容器通过调用这个方法来实现Servlet的初始化,完成一些工作,例如建立数据库连接,获取配置信息等,init方法只被调用一次,在Servelt容器装入对应Servlet时执行。可以自己写init,可使用super.inti()来完成一些启动配置工作。
4)public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException
处理请求,在这之前要确保init()完成。Servlet容器将用户请求封装到ServletRequest中,Servlet从中获取信息,处理后,使用ServletResponse传回客户端。
HttpServlet对象的service()方法中,主要调用两个方法:
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException;
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException;
还有doPut,doDelete,doOptions,doHead...,对应于不同的请求
5)public void destroy()
终止。当服务器不需要Servlet时或者重新装入新实例时,调用这个方法,释放资源,保存数据到持久设备等等。
destroy方法仅仅执行一次,在执行前,Servlet容器会看对应的service方法中是否还有线程执行,如果有会等待其执行完毕或者等待服务器设定的超时值到达。
destroy之后,该Servlet不再使用,Servlet容器不会将请求发送给这个对象。