从零开始搭建ssm项目(二)配置web.xml

这是我的上一篇,没看过的可以在这里点击阅读 https://www.jianshu.com/p/3431b6dceed3

在mysql建库建表,sql语句统一放在以下目录,以便以后修改。


初始建表数据如下

-- 创建图书表
CREATE TABLE `book` (
  `book_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '图书ID',
  `name` varchar(100) NOT NULL COMMENT '图书名称',
  `number` int(11) NOT NULL COMMENT '馆藏数量',
  PRIMARY KEY (`book_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=utf8 COMMENT='图书表';

-- 初始化图书数据
INSERT INTO `book` (`book_id`, `name`, `number`)
VALUES
    (1000, 'Java程序设计', 10),
    (1001, '数据结构', 10),
    (1002, '设计模式', 10),
    (1003, '编译原理', 10);

-- 创建预约图书表
CREATE TABLE `appointment` (
  `book_id` bigint(20) NOT NULL COMMENT '图书ID',
  `student_id` bigint(20) NOT NULL COMMENT '学号',
  `appoint_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '预约时间' ,
  PRIMARY KEY (`book_id`, `student_id`),
  INDEX `idx_appoint_time` (`appoint_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='预约图书表';

配置web.xml如下


    
    
    
        mvc-dispatcher
        org.springframework.web.servlet.DispatcherServlet
        
        
            contextConfigLocation
            classpath:spring/spring-*.xml
        
    
    
        mvc-dispatcher
        
        /
    


既然说到了web.xml的配置,那就简单说一下web.xml的加载(网上找的攻略,讲得挺详细,我就贴这里了)

一:web.xml加载过程

简单说一下,web.xml的加载过程。当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等)。首>先会去读取web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常的被启动起来。

启动WEB项目的时候,容器首先会去读取web.xml配置文件中的两个节点: 和> 如图:

紧接着,容器创建一个ServletContext(application),这个web项目的所有部分都将共享这个上下文。容器>以的name作为键,value作为值,将其转化为键值对,存入>ServletContext。

容器创建中的类实例,根据配置的class类路径来创建监听,在监>听中会有初始化方法,启动Web应用时,系统调用Listener的该方法 contextInitialized(ServletContextEvent >args),在这个方法中获得:

ServletContext application =ServletContextEvent.getServletContext();

context-param的值= application.getInitParameter("context-param的键");

得到这个context-param的值之后,你就可以做一些操作了。

举例:你可能想在项目启动之前就打开数据库,那么这里就可以在中设置数据库的连
接方式(驱动、url、user、password),在监听类中初始化数据库的连接。这个监听是自己写的一个类,
除了初始化方法,它还有销毁方法,用于关闭应用前释放资源。比如:说数据库连接的关闭,此时,调用
contextDestroyed(ServletContextEvent args),关闭Web应用时,系统调用Listener的该方法。

接着,容器会读取,根据指定的类路径来实例化过滤器。

以上都是在WEB项目还没有完全启动起来的时候就已经完成了的工作。如果系统中有Servlet,则>Servlet是在第一次发起请求的时候被实例化的,而且一般不会被容器销毁,它可以服务于多个用户的请求。>所以,Servlet的初始化都要比上面提到的那几个要迟。总的来说,web.xml的加载顺序是:
-> -> -> 。其中,如果web.xml中出现了相同的元素,则按照在配置文件中出现
的先后顺序来加载。

二:web.xml标签详解

1.

是部署描述的根元素,该元素含23个子元素。在Servlet2.3中,子元素必须按照>DTD文件描述中指定的顺序出现。比如:如果部署描述符中的元素有mapping>两个子元素,则子元素必须出现在子元素之前。在Servlet2.4中,顺
序并不重要。

2.

定义web应用的名称。如trk-order-rest

3.

可以使用distributable元素来告诉servlet/JSP容器,Web容器中部署的应用程序适合在分布式环境下运行。

4.

元素含有一对参数名和参数值,用作应用的Servlet上下文初始化参数,参数名在整个>Web应用中必须是惟一的,在web应用的整个生命周期中上下文初始化参数都存在,任意的Servlet和jsp都可>以随时随地访问它。子元素包含有参数名,而子元素包含的是参数值。作为选择,可用子元素来描述参数。

配置Spring,必须需要,而可有可无,如果在web.xml中不写配置信息,默认的路径是/WEB-INF/applicationContext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数:在里指定相应的xml文件名,如果有多个xml文件,可以写在一起并以“,”号分隔,比如在business-client工程中,我们采用了自定义配置方式,配置如下:

配置在同一个容器中的多个web项目,要配置不同的webAppRootKey,web.xml文件中最好定义webAppRootKey参数,如果不定义,将会缺省为“webapp.root”,为防止log4j配置冲突,每个项目配置不同的webAppRootKey。如下:

当然也不能重复,否则报类似下面的错误:

Web app root system property already set to different value: 'webapp.root' = [/home/user/tomcat/webapps/project1/] instead of   [/home/user/tomcat/webapps/project2/] - Choose unique values for the 'webAppRootKey' context-param in your web.xml files!

5.

用于设置容器的session参数,比如:用于指定http session的失效时间。默认时间设置(30minutes)。用来指定默认的会话超时时间间隔,以分钟为单位。该元素值为整数。如果 session-timeout元素的值为零或负数,则表示会话将永远不会超时。

6.见我的博客,这里不在阐述。(http://www.cnblogs.com/vanl/p/5742501.html)

7.见我的博客,这里不在阐述。(http://www.cnblogs.com/vanl/p/5753722.html)

8.

8.1.Servlet介绍

Servlet通常称为服务端小程序,是服务端的程序,用于处理及响应客户的请求。Servlet是一个特殊的Java类,创建Servlet类自动继承HttpServlet。客户端通常只有GET和POST两种请求方式,Servlet为了响应这两种请求,必须重写doGet()和doPost()方法。大部分时候,Servlet对于所有的请求响应都是完全一样的,此时只需要重写service()方法即可响应客户端的所有请求。另外HttpServlet有两个方法:

init(ServletConfig config):创建Servlet实例时,调用该方法初始化Servlet资源。

destory():销毁Servlet实例时,自动调用该方法回收资源。

通常无需重写init()和destory()两个方法,除非需要在初始化Servlet时,完成某些资源初始化的方法,才考虑重写init()方法。如果重写了init()方法,应该在重写该方法的第一行调用super.init(config),该方法将调用HttpServlet的init()方法。如果需要在销毁Servlet之前,先完先完成某些资源的回收,比如关闭数据库链接,才需要重写destory()方法。

8.2.Servlet的生命周期

创建Servlet实例有两个时机:

客户端第一次请求某个Servlet时,系统创建该Servlet的实例,大部分Servlet都是这种Servlet;

web应用启动时立即创建Servlet实例,即1(LZ有篇文章详细说明:http://www.cnblogs.com/vanl/p/5756122.html)

每个Servlet的运行都遵循如下生命周期:

(1)创建Servlet实例。

(2)Web容器调用Servlet的init()方法,对Servlet进行初始化。

(3)Servlet初始化之后,将一直存在与容器之中,用于响应客户端请求,如果客户端发送GET请求,容器调用Servlet的doGet()方法处理并响应请求;如果客户端发送POST请求,容器调用Servlet的doPost()方法处理并响应请求。或者统一使用service()方法处理来响应用户请求。

(4)Web容器决定销毁Servlet时,先调用Servlet的destory()方法,通常在关闭Web应用时销毁Servlet实例。

8.3.Servlet的配置

为了让Servlet能响应用户请求,还必须将Servlet配置在web应用中,配置Servlet需要修改web.xml文件。从Servlet3.0开始,配置Servlet有两种方式:

(1)在Servlet类中使用基于注解的方式进行配置:@WebServlet

(2)在web.xml文件中进行配置。

我们用web.xml文件来配置Servlet,需要配置用来声明一个Servlet。元素的用法和的用法相同。元素与元素具有相同的元素描述符,可以使用子元素将初始化参数名和参数值传递给Servlet,访问Servlet配置参数通过ServletConfig对象来完成,ServletConfig提供如下方法:

java.lang.String.getInitParameter(java.lang.String name):用于获取初始化参数

ServletConfig获取配置参数的方法和ServletContext获取配置参数的方法完全一样,只是ServletContex是取得当前Servlet的配置参数,而ServletContext是获取整个web应用的配置参数。

8.4.配置Spring MVC的Servlet

image

配置Spring MVC,指定处理请求的Servlet,有两种方式:

(1)默认查找MVC配置文件的地址是:/WEB-INF/${servletName}-servlet.xml。

(2)可以通过修改配置文件的位置,需要在配置DispatcherServlet时指定MVC配置文件的位置。

我们在平台项目两个工程中分别使用了不同的配置方式,介绍如下:

我们在business-client工程中按照默认方式查找MVC的配置文件,配置文件目录为: /WEB-INF/business-servlet.xml。工程目录结构如下所示:

我们在public-base-server工程中,通过第2种方式进行配置,把spring-servlet.xml放到src/main/resources/config/spring-servlet.xml,则需要在配置DispatcherServlet时指定标签。具体代码如下:

工程目录结构如下:

image

其中,classpath是web项目的类路径,可以理解为classes目录下面。因为无论这些配置文件放在哪>里,编译之后没有特殊情况的话都直接在classes下面。在我们的工程里,经过验证,maven工程这两个

路径经过编译后生成的文件都位于classes目录下,即这两个路径相当于类路径,在下面创建config文件夹(folder),创建自定义的xml配置文件即可。

8.5.classpath与classpath*区别

同名资源存在时,classpath只从第一个符合条件的classpath中加载资源,而classpath会从所有的classpath中加载符合条件的资源。classpath,需要遍历所有的classpath,效率肯定比不上classpath,因此在项目设计的初期就尽量规划好资源文件所在的路径,避免使用classpath*来加载。

8.6.ContextLoaderListener和DispatcherServlet初始化上下文关系和区别

从上图可以看出,ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,一般如:DAO层、Service层Bean;DispatcherServlet初始化的上下文加载的Bean是只对Spring MVC有效的Bean,如:Controller、HandlerMapping、HandlerAdapter等,该初始化上下文只加载Web相关组件。

注意:用户可以配置多个DispatcherServlet来分别处理不同的url请求,每个DispatcherServlet上下文都对应一个自己的子Spring容器,他们都拥有相同的父Spring容器(业务层,持久(dao)bean所在的容器)。

9.

包含一个子元素用来指定首页文件名称。元素可以包含一个或多个子元素。如果在第一个元素中没有找到指定的文件,Web容器就会尝试显示第二个,以此类推。

你可能感兴趣的:(从零开始搭建ssm项目(二)配置web.xml)