概括:
Tomcat启动时,先找系统变量CATALINA_BASE,如果没有,则找CATALINA_HOME。然后找这个变量所指的目录下的conf文件夹,从中读取配置文件。最重要的配置文件:server.xml 。要配置tomcat,基本上了解server.xml,context.xml和web.xml。
能在别的配置文件中配置的内容不推荐在server.xml中进行配置,如:能在/conf/context.xml中配置的就在/conf/context.xml中进行独立的配置。因为server.xml 是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而 context.xml 文件则不然, tomcat 服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。
Server.xml
tomcat主配置文件可以设置端口号,添加虚拟机这些的,是对服务器的设置。
Web.xml
其中CATALINA_BASE/conf/web.xml 是全局配置,适用于所有的Web应用程序。应用程序的./WEB-INF/web.xml 是针对各个Web应该程序的独立配置,只对单个Web Context有效。一般CATALINA_BASE/conf/web.xml 不需修改,采用Tomcat默认配置即可。
CATALINA_BASE/conf/web.xml 默认配置:
<web-appxmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
以下是部分<mime-mapping>
<mime-mapping>
<extension>avi</extension>
<mime-type>video/x-msvideo</mime-type>
</mime-mapping>
<mime-mapping>
<extension>java</extension>
<mime-type>text/plain</mime-type>
<mime-mapping>
<extension>mp3</extension>
<mime-type>audio/x-mpeg</mime-type>
</mime-mapping>
<mime-mapping>
<extension>mp4</extension>
<mime-type>video/mp4</mime-type>
</mime-mapping>
<mime-mapping>
<extension>txt</extension>
<mime-type>text/plain</mime-type>
</mime-mapping>
<mime-mapping>
<extension>zip</extension>
<mime-type>application/zip</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xls</extension>
<mime-type>application/vnd.ms-excel</mime-type>
</mime-mapping>
<mime-mapping>
<extension>doc</extension>
<mime-type>application/vnd.ms-word</mime-type>
</mime-mapping>
<mime-mapping>
<extension>ppt</extension>
<mime-type>application/vnd.ms-powerpoint</mime-type>
</mime-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
./WEB-INF/web.xml中主要配置项:
context-param -- 应用于整个Web应用程序(Context)的初始化参数。有多项,则分开。
filter / filter-mapping -- 共同配置Context的过滤规则。filter 配置过滤器;filter-mapping配置过滤规则和过滤器的映射关系。
Listener -- 配置整个Web的事件触发器。
Servlet / servlet-mapping -- 配置servlet和servlet所处理的HTTP请求(servlet-mapping)
session-config -- 配置HTTP session相关属性。
welcome-file-list -- 配置欢迎页
1.启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml读两个节点: <listener></listener> 和 <context-param></context-param>
2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.
3.容器将<context-param></context-param>转化为键值对,并交给ServletContext.
4.容器创建<listener></listener>中的类实例,即创建监听.
5.在监听中会有contextInitialized(ServletContextEventargs)初始化方法,在这个方法中获得ServletContext =ServletContextEvent.getServletContext();
context-param的值 =ServletContext.getInitParameter("context-param的键");
6.得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早.
换句话说,这个时候,你对<context-param>中的键值做的操作,将在你的WEB项目完全启动之前被执行.
7.举例.你可能想在项目启动之前就打开数据库.
那么这里就可以在<context-param>中设置数据库的连接方式,在监听类中初始化数据库的连接.
8.这个监听是自己写的一个类,除了初始化方法,它还有销毁方法.用于关闭应用前释放资源.比如说数据库连接的关闭.
Context.xml
该文件中的配置是所有web.xml的全局配置。
默认的/conf/context.xml配置:
<WatchedResource>WEB-INF/web.xml</WatchedResource>如果web.xml 改变了,则自动重新加载改应用。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
JNDI访问数据库,我们要记住的是:通过JNDI查找数据源,然后通过数据源可以从连接池获取空闲的数据库连接,获得连接后就跟普通jdbc操作无疑了。而数据源是由web容器(Tomcat)提供的(当然数据源有不同的实现),不能直接在程序中NEW一个数据源对象,而需要JNDI(Java Naming and Directory Interface)技术来获得.
javax.nameing.Context提供了查找JNDI资源的接口,例如通过以下代码获得名称为jdbc/books的数据源引用:
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/books");
得到数据源对象后,通过DataSource的getConnection()方法来获得数据库的连接对象Connection。
Connection con = ds.getConnection();
当程序结束数据库的访问后,应当调用Connection.close()方法,及时将Connection返还给连接池,使Connection恢复空闲状态。
PS:Tomcat把DataSource作为一种可配置的JNDI资源来处理。生成DataSource对象的工厂为org.apache.commons.dbcp.BasicDataSourceFactory.
数据源与连接池的关系:
在数据源(datasource)中事先建立了多个数据库连接,这些连接保存在连接池(connection pool)中。访问数据库时,只需要从连接池中获取空闲状态的连接,当程序访问数据库结束时,再将连接放回连接池。
上面提到数据源是由WEB容器提供的,那么这个容器是怎么样识别我们要连接那个数据库以及相关的访问参数(用户名,密码...)呢!这就需要我们进行JNDI的配置来告诉WEB容器(context.xml和web.xml).
1.配置context.xml文件:
在context.xml文件中加入Resource标签,该标签属性如下:
<Context>
<Resource name="jdbc/books"
auth="Container"
type="javax.sql.DataSource"
maxActive="100" //最大连接数
maxIdle="30"//最小连接数
maxWait="10000" //最大空闲时间,单位是毫秒
username="sa"
password="sa"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/sample_db"/>
</Context>
或
<Resource
name="jdbc/books" //引用名可以自定义
auth="Container" //指定管理DataSource的Manager
type="javax.sql.DataSource" //指定包名
maxActive="100" //最大可活动量
maxIdle="30" //最大空限量
maxWait="10000" //最大等待时间
username="sa" //用户
password="sa" //密码
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDrier";//连接的驱动类
url="jdbc:sqlserver://localhost:1433;DatabaseName="books"//连接的URL
/>
2.配置web.xml文件:
在web.xml中加入resource-ref标签。
<web-app>
<resource-ref>
<description>booksConnection</description>
<res-ref-name>jdbc/books</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
代码:
//导入包
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
//获取数据源的链接
Context ic = new InitialContext();
DataSource ds =(DateSource)ic.lookup("java:comp/env/jdbc/books");
//获得Connection
Connection conn = ds.getConnection();
这样就完成了JNDI的使用,这里就总结一下JNDI的使用步骤:
1.配置context.xml文件。
2.配置web.xml文件。
3.编写代码,使用lookup()方法获得数据源对象,然后通过getConnection()获得连接。
4.跟JDBC一样编写相关代码。