Tomcat在严格意义上并不是一个真正的应用服务器,它只是一个可以支持运行Serlvet/JSP的Web容器,不过Tomcat也扩展了一些应用服务器的功能,如JNDI,数据库连接池,用户事务处理等等。Tomcat 是一种具有JSP环境的Servlet容器。Servlet容器是代替用户管理和调用 Servlet的运行时外壳。
容器负责处理客户请求。当客户请求来到时,SERVLET容器获取请求,然后调用某个SERVLET,并把Servlet的执行结果返回给客户。当客户请求某个资源时,Servlet容器使用ServletRequest对象把客户的请求信息封装起来,然后调用Java Servlet API中定义的Servlet的一些生命周期方法,完成Servlet的执行,接着把Servlet执行的要返回给客户的结果封装到ServletResponse对象中,最后Servlet容器把客户的请求发送给客户,完成为客户的一次服务过程。
TOMCAT是一个基于组件的服务器,它的构成组件都是可配置的,其中最外层的给件是CATALINA SERVLET容器,其他的组件按照一定的格式要求配置在这个顶层容器中。TOMCAT的各个组件是<TOMCAT_HOME>\conf\server.xml文件中配置的,TOMCAT服务器默认情况下对各种组件都有默认的实现,下面通过分析server.xml文件来理解TOMCAT的各个组件是如何组织的。
<Server> 顶层元素,代表一个服务器 <Service> 顶层元素,是Connector的集合,只有一个Engine <Connectior/> 连接器类元素,代表通信接口 <Engine> 容器类元素,为特定的Service组件处理所有客户请求,可包含多个Host <Host> 为特定的虚拟主机处理所有客户请求 <Context> 为特定的WEB应用处理所有客户请求 </Context> </Host> </Engine> <span style="white-space:pre"> </span></Service> </Server>
* Catalina :一个符合ServletAPI规范2.3的Servlet Container
* Jasper:一个符合JSP规范1.2的JSP编译器和运行环境
* Webapps:Tomcat中包含的一些例子和用于测试的web例程,以及相关文档。
1,页面内容等文件的存放位置:*.html, *.jsp等可以有许多目录层次,由用户的网站结构而定,实现的功能应该是网站的界面,也就是用户主要的可见部分。除了HTML文件、JSP文件外,还有js(JavaScript)文件和css(样式表)文件以及其他多媒体文件等。
2,Web-INF/web.xml这是一个Web应用程序的描述文件。这个文件是一个XML文件,描述了Servlet和这个Web应用程序的其他组件信息,此外还包括一些初始化信息和安全约束等等。
3,Web-INF/classes/这个目录及其下的子目录应该包括这个Web应用程序的所有JavaBean及Servlet等编译好的Java类文件(*.class)文件,以及没有被压缩打入JAR包的其他class文件和相关资源。注意,在这个目录下的Java类应该按照其所属的包层次组织目录(即如果该*.class文件具有包的定义,则该*.class文件应该放在.\WEB-INF\classes\包名下)。
4,通常Web-INF/classes/这个目录下的类文件也可以打包成JAR文件,并可以放到WEB-INF下的lib目录下。如将 classes目录下的各个*.class文件打包成WebMis.jar文件(jar cvf WebMis.jar *.*)
值得注意的是:
(1)WEB-INF目录中包含应用软件所使用的资源,但是WEB-INF却不在公共文档根目录之中。在这个目录中所包含的文件都不能被客户机所访问。
(2)类目录中(在WEB-INF下)包含运行Web应用程序时所需的Servlets,Beans等类。
(3)lib目录(在WEB-INF下)包含有Java archive files (JARs),例如标签库或者Servlets,Beans等类的*.jar文件。
(4)如果一个类出现在JAR文件中同时也出现在类的目录中,类加载器会加载位于类目录中的那一个。
common/lib/ 这个目录下包含了所有压缩到JAR文件中的类文件和相关文件。比如:第三方提供的Java库文件、JDBC驱动程序等。其中msbase.jar、mssqlserver.jar、msutil.jar文件为SqlServer2000的JDBC驱动程序。其中servlet-api.jar和jsp-api.jar为Servlet和JSP的API所在的包
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />我们可以直接修改port这个端口号来改变端口。
<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>
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />这段代码规定了Tomcat监听HTTP请求的端口号等信息。可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。注意这里只是get请求,对于post不生效的。更改后的代码如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
<!-- 建立一个角色-->
<role rolename="manager-gui"/> <!-- 建立一个用户--> <user username="LinkinPark" password="NightWish" roles="manager-gui"/>
5,部署web应用。一共有3种方法:
第一种方法:将web项目文件件拷贝到webapps目录中。这也是最常用的部署方式,实际开发中我们使用IDE工具自动部署的时候其实就是将我们自己的项目放到了tomcat的webapps目录下的。<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeloy="true" xmlValidation="falase" xmlNamespaceAware="false">
<Context path="/hello" reloadable="true" docBase="E:\test1" debug="0" privileged="true"></Context>其中path是其相对web URL的路径,是一个虚拟的路径虚拟,比如说:http://localhsot:8080/hello;
<Context path="/linkin" reloadable="true" docBase="E:\test1" debug="0" privileged="true"></Context>这种方法有个优点,可以定义别名。服务器端运行的项目名称为path,外部访问的URL则使用XML的文件名。这个方法很方便的隐藏了项目的名称,对一些项目名称被固定不能更换,但外部访问时又想换个路径,非常有效。比如上面这行代码部署项目以后,该应用的URL地址为:http://<server_address>:<port>/linkin