tomcat配置文件web.xml与server.xml解析–重要

  • Post author:
  • Post category:其他



Web.xml

里主要的内容:



关于

servlet

的定义:



<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>true</param-value>


</init-param>


<load-on-startup>1</load-on-startup>


</servlet>

。。。。。。

关于

servlet-mapping

的定义:



<servlet-mapping>


<servlet-name>default</servlet-name>


<url-pattern>/</url-pattern>


</servlet-mapping>



<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-config>


<session-timeout>30</session-timeout>


</session-config>


关于

mime-mapping

的定义:



<mime-mapping>


<extension>abs</extension>


<mime-type>audio/x-mpeg</mime-type>


</mime-mapping>


最后是关于

welcom-file-list

的定义:



<welcome-file-list>


<welcome-file>index.html</welcome-file>


<welcome-file>index.htm</welcome-file>


<welcome-file>index.jsp</welcome-file>


</welcome-file-list>


可能还有事件监听器,过滤器

事件监听器:


事件监听器和

servlet

的过滤器类似,都是在

web

程序被部署到

web

服务器时生成并被初始化的。

几类监听器的作用:


ServletContext

监听器接口可以使

web

得知整个程序的载入和卸载等运行情况。


HttpSession

监听器接口可以使

web

程序了解程序会话期间的状况并作出响应。


ServletRequest

监听器接口可以使

web

程序控制请求的生命周期。


在第一个请求被

web

容器接受之前实例化并注册好监听器类是必须的。监听器在整个

web

应用生命周期中都要使用。


web

容器对每个监听类只会创建一个实例(单例模式),在第一个请求到来之前实例化并注册。

web

容器注册监听类的顺序根据他们实现的接口和在部署描述文件中定义的顺序。

web

应用调用监听实例的顺序按照他们注册的顺序。



appfuse

来说,在

web

容器根据应用程序部署文件

web.xml

进行部署的时候,首先完成对

listener



filter

的实例化和初始化,然后由于



public






class



StartupListener



extends




ContextLoaderListener







implements



ServletContextListener {


。。。。


StartupListener

继承自

ServletContextListener

,因此在容器对

servletContext

进行初始化的时候,会调用这个监听。由于在

appfuse

应用程序的

web.xml

里有关于

spring

的配置信息,因此这里就把

spring

配置好了!!!


过滤器:



Filter

生命周期




web

工程发布后,在请求使引擎访问一个

web

资源之前,引擎必须定位

Filter

列表;引擎必须确保为列表中的每一个

Filter

建立了一个实例,并调用了他们的

init(FilterConfig config)

方法。在这过程中可以抛出异常。部署描述文件中定义的所有

filter

,仅会在引擎中产生一个实例。

当引擎接受一个请求时,引擎就会调用

filter

列表中第一个

filter



doFilter

方法,把

ServletRequest



ServletResponse



FilterChain

作为参数传给它。

filter



doFilter

方法典型的处理步骤是:


1

)检查请求头信息


2

)开发者创建一个实现了

ServletRequest



HttpServletRequest

的类,去包装

request

对象,以便修改请求的头信息或体数据。


3

)开发者创建一个实现了

ServletReqponse



HttpServletResponse

的类,去包装

response

对象,以便修改请求的头信息或体数据。


4)filter

可以调用链中的下一个实体,下一个实体是另一个

filter

,如果该

filter

是列表中最后的一个,则它的下一个实体就是一个目标

web

资源。如果要调用下一个

filter



doFilter

方法,把

request

,和

response

对象传给

FilterChain

对象的

doFilter

方法中就可以了。


Filter chain



doFilter

方法是由引擎提供的,引擎在该方法中会定位

filter

列表中的下一个

filter

,调用它的

doFilter

方法,把传来的

request



response

对象传给它。


5

)在调用

chain.doFilter

之后,

filter

可以检测响应的头信息


6

)在这些过程中,

filter

可以抛出异常。当在调用

doFilter

过程中抛出

UnavailableException

异常时,引擎重复尝试处理

下面的

filter chain

的方法,如过时后还没请求到

filter chain

就会关闭对

filter chain

的请求。当

filter

是列表中最后一个

filter

时,它的下一个实体是描述配置文件中

filter

后面的

servlet

或其它资源。

在引擎删除一个

Filter

之前,引擎必须调用

Filter



destroy

方法,来释放资源。



Web.xml

:都是关于应用程序的。




<web-app >

各种

<context-param>

。。。。

各种

<filter>

,以及

<filter-mapping>

。。。。

各种

<listener>

。。。。

各种

<servlet>

,以及

<servlet-mapping>

。。。


<session-config>


<welcome-file-list>



各种

<error-page>

。。。。


<taglib>


<resource-ref>


<security-constraint>


<login-config>


<security-role>



Server.xml

里的主要内容:


首先是关于

server

的定义:



<Server port=”8005″ shutdown=”SHUTDOWN” debug=”0″>

。。。

关于

server

的注释:


A “Server” is a singleton element that represents the entire JVM,


which may contain one or more “Service” instances.  The Server


listens for a shutdown command on the indicated port.


关于

listener

的定义:



<Listener className=”org.apache.catalina.mbeans.ServerLifecycleListener”


debug=”0″/>


<Listener className=”org.apache.catalina.mbeans.GlobalResourcesLifecycleListener”


debug=”0″/>


关于

globalNamingResources

的定义:



<GlobalNamingResources>



<!– Test entry for demonstration purposes –>


<Environment name=”simpleValue” type=”java.lang.Integer” value=”30″/>



<!– Editable user database that can also be used by


UserDatabaseRealm to authenticate users –>


<Resource name=”UserDatabase” auth=”Container”


type=”org.apache.catalina.UserDatabase”


description=”User database that can be updated and saved”>


</Resource>


<ResourceParams name=”UserDatabase”>


<parameter>


<name>factory</name>


<value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>


</parameter>


<parameter>


<name>pathname</name>


<value>conf/tomcat-users.xml</value>


</parameter>


</ResourceParams>



</GlobalNamingResources>


关于

service

的定义:



<Service name=”Catalina”>

。。。



注意

connector



engine



container

)都是

service

里的元素。


关于

connector

的定义:



<Connector port=”8000″       URIEncoding=”gbk”


maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″


enableLookups=”false” redirectPort=”8443″ acceptCount=”100″


debug=”0″ connectionTimeout=”20000″


disableUploadTimeout=”true” />

关于

connector

的注释:


A “Connector” represents an endpoint by which requests are received


and responses are returned.  Each Connector passes requests on to the


associated “Container” (normally an Engine) for processing.


关于

engine

的定义:



<Engine name=”Catalina” defaultHost=”localhost” debug=”0″>



。。。


关于

engine

的注释:


An Engine represents the entry point (within Catalina) that processes


every request.  The Engine implementation for Tomcat stand alone


analyzes the HTTP headers included with the request, and passes them


on to the appropriate Host (virtual host).


关于

logger

的定义:



<Logger className=”org.apache.catalina.logger.FileLogger”


prefix=”catalina_log.” suffix=”.txt”


timestamp=”true”/>


关于

realm

的定义:



<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”


debug=”0″ resourceName=”UserDatabase”/>


关于

host

的定义:



<Host name=”localhost” debug=”0″ appBase=”webapps”


unpackWARs=”true” autoDeploy=”true”


xmlValidation=”false” xmlNamespaceAware=”false”>


关于

logger

的定义:



<Logger className=”org.apache.catalina.logger.FileLogger”


directory=”logs”  prefix=”localhost_log.” suffix=”.txt”


timestamp=”true”/>

关于

logger

的注释:


Logger shared by all Contexts related to this virtual host.  By


default (when using FileLogger), log files are created in the “logs”


directory relative to $CATALINA_HOME.  If you wish, you can specify


a different directory with the “directory” attribute.  Specify either a


relative (to $CATALINA_HOME) or absolute path to the desired


directory.


。。。后面还可能有关于

context

的定义。



server



<!–[if !supportAnnotations]–>

[z1]

<!–[endif]–>



.xml

:都是关于服务器一些特性的。


一个

server

有一个

service

,一个

service

里有多个

connector

和一个

engine

,不同的

connector

除了端口可能不同,协议也可能不同。多个

connector

对应一个

engine



engine

代表我们应用程序的容器。一个

engine

中有一个到多个

host

,一个

host

代表我们的一个虚拟主机。

host

里又有一个到多个

context

,一个

context

代表了一个应用程序的虚拟子站点。


应用程序里也有

web.xml



struts-config.xml

,这两个配置文件的内容不同于

tomcat

自带的配置文件。



tomcat

应用程序的初始化和运行过程:




tomcat

启动时的工作(初始化):

由于应用程序是放在

webapps

目录下面的,在

Tomcat

启动时,其

web

容器会自动校验和载入此目录内的

web

程序,使其可以直接工作。如果程序有错,

web

服务器会将错误信息输出或存入在

logs

目录,若错误严重,

tomcat

可能会停止工作。


从上面我们可以看到一个

webapp

应用程序中,包含的元素有:


Filter



listener



servlet

。它们初始化的时机应该是不一样的。



Servlet



jsp

的生命周期:




Tomcat

处理用户请求,我们可以清晰的看到容器

Servlet

的生命周期管理过程:


1



Tomcat

在启动的时候应该直接加载并实例化

webapps

下面应用程序的

listener



filter

,并在相应的时机进行调用。


2

、客户发出请求—

>Web

服务器转发到

Web

容器

Tomcat




3



Tomcat

主线程对转发来用户的请求做出响应创建两个对象:

HttpServletRequest



HttpServletResponse




4

、从请求中的

URL

中找到正确

Servlet



Tomcat

为其创建或者分配一个线程,同时把

3

创建的两个对象传递给该线程;


5



Tomcat

调用

Servlet



servic()

方法,根据请求参数的不同调用

doGet()

或者

doPost()

方法;


6

、假设是

HTTP GET

请求,

doGet()

方法生成静态页面,并组合到响应对象里;


7



Servlet

线程结束,

Tomcat

将响应对象转换为

HTTP

响应发回给客户,同时删除请求和响应对象。

从该过程中,我们可以理解

Servlet

的生命周期:

Servlet

类加载(对应

4

步);

Servlet

实例化(对应

3

步);调用

init

方法(对应

4

步);调用

service()

方法(对应

5



6

步);;调用

destroy()

方法(对应

7

步)。

从中可以看到

servlet



jsp

是在请求到来的时候,

web

容器进行首次对

servlet



jsp

(转换为

servlet

)的初始化。而且初始化一次之后,在

web

容器中就只存在这样一个实例,利用多线程来处理不同用户的请求。



Struts-config.xml


<form-beans>



各种

<form-bean>



<global-exceptions>


<global-forwards>



各种

<forward>

。。。。


<action-mappings>

各种

<action>

。。。。

action

里还可能有

forward

元素,如果有,而且它与

global-forwards

里的重名,则它会将

global

里的覆盖。


各种

</plug-in>

<!–[if !supportAnnotations]–>

<!–[endif]–>



版权声明:本文为xiaohui1014原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。