第5章 Servlet技术详解
JavaScript、Servlet、JSP和JDBC是进行Java Web开发必备的基本技术,上一章讲解了JavaScript的基础知识,本章重点讲解Servlet的基础知识。本章首先对Servlet进行简要的介绍,然后详细讲解Servlet的生命周期,最后通过示例演示Servlet的使用方法。
5.1 Servlet技术简介
在1997年3月,Sun Microsystems公司的JavaSoft部门就推出了Servlet 1.0规范。当时该版本的Servlet只具有CGI与NSAPI之类产品的功能。发展到现在,已经为Servlet 3.0规范。该版本的Servlet不仅能够开发HTTP协议方面的程序,还可以开发Web Server、Mail Server、FTP Server和Applicaton Server等方面的服务。
5.1.1 Servlet的运行原理
Servlet是运行在服务器端,由Web服务器进行加载,用来响应客户端请求的Java代码模块。Servlet是一种独立于平台和协议的服务器端Java应用程序,可以生成动态的Web页面。javax.servlet和javax.servlet.http包为编写Servlet提供了接口和类,所有的Servlet程序都必须继承Servlet接口,该接口定义了生命周期方法。
JSP页面在执行时首先要被编译成Servlet,JSP和Servlet的转换示意图如图5.1所示。
图5.1 JSP和Servlet的转换示意图
需要注意的是,每个Servlet请求都是由一个线程而不是一个全新的进程来处理的。
web.xml是Servlet规范中定义的Web应用发布的描述文件,它与Tomcat完全独立。web.xml的主要作用是,装载DispatcherServlet类,设置一些初始化参数,加入标记库,设置如*.do、*.form的映射等。
web.xml文件的示例代码如下:
<?xml version="1.0" encoding="UTF-8"?> <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_3_0.xsd" version="3.0"> <display-name>web.xml的示例</display-name> <!--定义一个过滤器 --> <filter> <filter-name>LogFilter</filter-name> <filter-class>com.gd.log.LogFilter</filter-class> </filter> <!--设定过滤器负责过滤的URL --> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>*.do</url-pattern > </filter-mapping> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>servlet</servlet-class> <!--定义Servlet的初始化参数,这里指定要初始化WEB-INF文件夹下的config-servlet.xml, 一个<servlet>可以有多个<init-param> --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> //指定当Web启动时,加载Servlet的顺序,当它的值大于等于零时,Servlet容器先加载数值 小的Servlet,再加载大的;如果它的值小于零或没有设定,则Servlet容器将在Web首次访问时加载这 个Servlet </servlet> <!--拦截所有以do结尾的请求 --> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <session-config> //设定HttpSession的生命周期,示例中设定了Session可以保持不活动状态最长时间为30秒, 超过这一时间,将做无效处理 <session-timeout>30</session-timeout> </session-config> <welcome-file-list> //指定当客户访问Web应用时,如果没有给出具体的文件名,Servlet将自动调用这里设定的文 件,可以设定多个文件清单,到时候Servlet会按照顺序自动查找指定的文件,如果没有找到,服务器将 向客户端返回“HTTP404 Not Found”的出错信息 <welcome-file>index.jsp</welcome-file> <welcome-file>index.htm</welcome-file> </welcome-file-list> <taglib> //设定Web应用所引用的标记库 <taglib-uri>/spring</taglib-uri> <taglib-location>/WEB-INF/spring.tld</taglib-location> </taglib> <resource-ref> //引用的JNDI名字 <description>数据库连接池</description> <res-ref-name>jdbc/db</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> //管理所引用资源的管理者,有两个可选值:Container和Application。Container表示由容器 来创建和管理资源,Application表示由应用来创建和管理资源 </resource-ref> <security-constraint> //定义Web应用的安全约束,上述代码表示当用户访问时必须具备Guest角色 <web-resource-collection> //定义受保护的资源 <web-resource-name>示例</web-resource-name> <url-pattern>*.do</url-pattern> </web-resource-collection> <auth-constraint> <role-name>guest</role-name> </auth-constraint> //定义可以访问资源的角色 </security-constraint> <security-role> <description> 权限安全描述 </description> <role-name>guest</role-name> </security-role> <login-config> <auth-method>FORM</auth-method> <realm-name>登录入口</realm-name> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/error.jsp</form-error-page> </form-login-config> </login-config> </web-app>
代码说明:
上述配置文件采用的是Servlet 3.0规定的Web程序部署描述格式。以前的Servlet经常使用的描述格式是:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_6.dtd"><web-app>。
5.1.2 MyEclipse开发工具对Servlet的支持
为了便于程序员开发关于Servlet的程序,MyEclipse开发工具提供了对其的支持。下面将详细介绍MyEclipse开发一个简单的Servlet程序,具体步骤如下:
01 从菜单栏中选择“File>New>Web Project”命令,新建一个Web Project项目,在出现的对话框中进行如图5.2所示的设置,即在“Project Name”文本框输入“FirstServlet”,其他选项建议为默认值,单击“Finish”按钮完成创建。
图5.2 新建Web Project
02 用鼠标右键单击刚生成的项目中的“src”目录,在弹出的快捷菜单中选择“New>Servlet”命令,如图5.3所示。用来新建一个Servlet程序,这时会出现如图5.4所示的对话框。
图5.3 新建Servlet程序
图5.4 创建Servlet程序
● Modifiers:设置Servlet程序的修饰符。
● Superclass:设置Servlet程序的父类。
● Template to use:设置Servlet程序的模板。
● Which method stubs would you like to create:设置Servlet程序中需要实现的方法。
一般只需要填写“Package”和“Name”文本框,以及选择需要实现的方法,而其他选项建议为默认值。
03 在创建Servlet程序的对话框中做出如图5.4所示的选择后(“Package”文本框中的内容用来设置Servlet程序文件的包),单击“Next”按钮就会出现如图5.5所示的对话框,在该对话中可以对web.xml文件内容进行设置。
图5.5 设置web.xml文件内容
其中,“Servlet/JSP Mapping URL”文本框用来设置Servlet程序的映射路径,其一般以“/”符号开始,或者以“*do”的方式出现,但是不能输入“/*do”形式。该对话框一般只需要修改“Servlet/JSP Mapping URL”文本框中内容来确定访问该Servlet程序的路径。
04 在设置web.xml文件内容的对话框中做出如图5.5所示的修改后,单击“Finish”按钮,就完成了创建Servlet程序的向导。此时,当前项目的目录结构如图5.6所示。
图5.6 Servlet程序的目录结构