学习笔记――Servlet
在写Servlet之前,先要简单说说Tomcat。要运行JSP程序,首先要安装Tomcat,Tomcat是Web应用服务器,它是在SUN公司的JSDK基础上发展起来的一个JSP/Servlet规范的标准实现,也就是说,Tomcat是一个JSP/Servlet容器,书籍上的叫法是JSP容器或者是Servlet容器,某些书上干脆叫Web(JSP+Servlet)容器,笔者认为叫Web容器更能让人理解。
Servlet是使用Java Servlet 应用程序设计接口(API)及相关类和方法的 Java 程序。有一句经典的话,Java servlet对于Web服务器就好象Java applet对于Web浏览器,Servlet装入Web服务器并在Web服务器内执行,而applet装入Web浏览器并在Web浏览器内执行。而Web容器的作用就是负责处理客户的请求,当客户请求到来的时候,Web容器获取请求,然后调用某个Servlet,并把Servlet的执行结果返回给客户。一个Servlet就对应一个class文件,不知道大家想过没有,既然Web容器是调用某个Servlet的,但当客户请求的是jsp文件的时候呢,它没有对应的class文件啊。其实当客户对jsp页面发出请求时,Web容器会先把这个jsp文件转换成一个Servlet,就是把所有的HTML标签都被包含在Println()语句中,所有的jsp元素将会被转换成java代码,这个过程称为JSP解析,然后再编译这个java文件生成一个class文件,这个过程称为Servlet分析,最后在JAVA虚拟机里执行,执行后的结果以HTML的形式发送给客户端,并在浏览器上解析显示。
Servlet的生命周期是指一个Servlet从被加载、初始化、相应请求、提供服务到被销毁的全过程。Web容器创建Servlet的一个实例,也就发生了Servlet加载。然后容器会调用该实例的init()函数,进行初始化,如果初始化失败就抛出一个ServletException异常,容器就直接卸载该实例。如果容器对该Servlet有请求,则调用该实例的service()函数,提供服务,如果服务请求出错,则抛出Unavailable异常。服务完成后,容器调用该实例的destroy()函数进行卸载该实例,销毁并标记该实例作为垃圾收集。
其实当Web容器启动的时候,先要去查找web.xml配置文件,这个文件记录了全部可以提供服务的Servlet,为每个配置装入选项。但启动容器后,不立即初始化Servlet,而是等到接受到客户端的请求后在进行初始化,这样就可以缩短Web容器的启动时间。但是在很多Servlet同时得到请求的时候,容器会花很多时间去初始化它们,这样会延长响应时间。针对这种情况,可以在配置文件中声明Servlet时使用<load-on-startup>标签,这样就可以在Web容器启动时候就可以实例化该Servlet,当该Servlet有请求时,线程池就会动态地将线程分配给到来的请求,就可以缩短客户请求的响应时间。
在Servlet中,要进行很多的有关HTTP的操作,但这些操作的类在JAVA API里是没有的,也就是说这些关于操作的类是扩展包,也就是在Tomcat的安装目录下,lib子目录下有一个叫servlet-api.jar的文件,把这个文件解压后在javax/servlet下就有很多关HTTP处理的类。使用Servlet太多情况下是要响应客户的HTTP请求,这时候Servlet就要继承HttpServlet抽象类。经常要重写的方法有init(),doGet(),doPost(),destroy(),一般情况下service()函数不需要重写,但service()函数在Servlet中是核心。init()函数用来创建任何资源,比如是数据库的连接;而destroy()函数是释放在init()函数中创建的任何资源。Servlet中所有的业务逻辑都是在doGet()和doPost中执行的,当一个客户通过HTML表单发出一个HTTP POST请求时,doPost()方法被调用,与POST请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器,当一个客户通过HTML 表单发出一个HTTP GET请求或直接请求一个URL时,doGet()方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一起发送。当要修改服务器端的数据时,比如要操作数据库的增删改时,这个时候就要用POST请求方式,当不用修改服务器端的数据时,就用GET请求方式,但关系到有安全性的数据即使没有修改服务器端的数据都必须用POST请求方式,毕竟GET是把数据放到URL后面的,大家都可见。
要使用Servlet,必须要在web.xml文件中声明,如下所示:
<servlet>
<servlet-name>servlet_name</servlet-name>
<servlet-class>servlet_class_path</servlet-class>
<load-on-startup> servlet_name</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servlet_name</servlet-name>
<url-pattern>url_map_name</url-pattern>
</servlet-mapping>
<url-pattern>标签是指访问这个Servlet的URL,是相对于Web应用的相对路径。其余的标签都可以从字面上理解,就不再作解释了。
就先写那么多先吧,其实还有很多都想写的,比如国际化和本地化、Tomcat的配置和各个文件的部署、JavaBean等等。但笔者只对JSP看了一个星期,还没有对上面说的技术有比较深的理解,太多东西要学了,还得狠狠地看书,等以后有了更深的理解后继续写。