搞定J2EE核心技术与企业应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第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程序的目录结构