Web Application目录结构及web.xml

 

通常一个网络应用是由很多资源组成的,如servlet,JSP文件,class文件,第三方JAR文件,HTML文件,图片等等。

对于这些文件的组织JAVA servlet规范中已经做出定义,也就是说会以一种规范的目录结构去实现。

一个网络应用下包含的是多个子应用对应的文件夹,而对于一个子应用一般会按照资源的扩展名分成几个下级文件夹,如html,images,jsp等。但是至少要有一个WEB-INF文件夹。

这个WEB-INF文件夹下包含了该子应用最重要的部分。一般包括三个部分。

1.classes文件夹:本应用中编译生成的所有class文件集中此处。

2.lib文件夹:以JAR/zip形式表现的库文件和所有需要用到的第三方库文件存放此处。如果,这种库文件没打包成JAR/zip,则要放到classes目录中。

3.web.xml文件:此应用的初始化配置文件。非常重要。

注意:WEB-INF文件夹所包含的是服务器端使用的资源(而非客户端)。所以,任何客户端要调用的资源不应该放在此文件夹中,即使象某些JAR(包含的是applet)文件。

在开发和部署时,如果需要将整个应用进行转移位置,通常采取的一种做法是将整个应用打包成为war文件(区别与jar)。当我们将一个WAR文件放在Tomcat的网络应用文件夹下时,Tomcat会自动将其解压缩,形成一个和WAR文件名相同的文件夹。形成了部署,移植自动化。

如何打包war文件?

1.开DOS窗口,进入网络应用根目录。如:c: omcat4webapps>。

2.用jar命令压缩。c: omcat4webapps>jar -cvf helloapp.war helloapp。(具体参数看jar帮助)。

这样在webapps目录下就有了一个helloapp.war文件。

在webapps目录下我们通常会看到一个ROOT目录。这个目录被称之为缺省目录。当我们在浏览器地址栏敲入http://localhost:8080/index.jsp时,访问的就是ROOT目录下的index.jsp文件。

因此,webapps目录下除了一些目录外没有别的任何文件(放了也不会被访问到)。

web.xml结构

这个文件已经在java servlet规范中进行了标准化。

1.为开头。

2.做版本声明。

3.为开头对应用的定义。

4.其下是对所有具体内容的定义。

5.为整个文档的结束。

下面看两个和servlet相关的元素。和

在servlet下可以定义的元素有icon, servlet-name, servlet-class|jsp-file, display-name, description, init-param, load-on-startup, security-role-ref。

servlet-name:指定该sevlet的名字。客户端就是用这个名字访问该servlet。

servlet-class:指定该servlet具体关联的class文件名。且只能跟在servlet-name后面。

init-param:定义该servlet的初始化参数。具体参数名由param-name元素指定,值由param-value元素指定。

注意:一个param-name只能指定一个参数。如需多个参数,就用多个param-name。而param-vlaue却可以为一个参数名指定多个值,形成阵列(值间以逗号分割)。

另:参数是和servlet名相关,而非class文件。如此,可以用一个class文件加不同名字,不同参数形成多个版本。

其下可以定义的元素有servlet-name, url-pattern。

目的是以你指定的任何url形式去关联(访问)servlet。

我们可以为同一个servlet指定多个不同的url。

四种不同的url形式:

1.以/开始/*结束的形式。按纯目录形式关联servlet。

2.以*.postfix形式。按具体文件类型关联servlet。

3.单个字符串形式。精确匹配关联servlet。

4.单个/形式。缺省servlet(所有没精确指定资源的url都由该servlet处理)。

通常由servlet容器来解析一个指向servlet的URL。这种解析分两步,1.标识网络应用;2.定位具体的servlet。

上述两个步骤都会对URL中的URI(除去主机名以外的)部分进行分段处理,形成三个部分,Context Path, Servlet Path, Path Info。

示例:http://www.myserver.com/mywebapp/helloservlet/hello

1.Context Path

用以标识网络应用。以/开头,如此部分为空,则由缺省网络应用响应。上例中为/mywebapp。

2.Servlet Path

用以标识servlet。以/开头,如此部分为空,则由缺省servlet响应。上例中为/helloservlet。

3.Path Inof

除前两部分外,剩下的就是路径信息。本部分也可为空。上例为/hello。

HttpServletRequest提供了三个方法-getContextPath(),getServletPath()和getPathInfo()。分别提取不同段内容。

servlet容器在标识出context path后,会按照一个顺序计算URI的剩余部分。这个顺序是固定的,而且条件一旦满足,将不再继续。

1.servlet容器先将整个URI(除去context path之后的)和servlet mapping进行匹配。如果匹配成功,则除context path以为的剩余部分都是servlet path。因此,path info部分为空。

2.以/为分界符到着往前去和servlet mapping匹配。如匹配成功,匹配的部分就是servlet path,剩余部分是path info。

3.如果URI最后是某种文件扩展名,则servlet容器去和servlet mapping匹配。如成功,则将整个URI(除去context path之后的)视为servlet path,而path info为空。

4.如果始终没找到相匹配的servlet mapping,则将请求发往默认servlet。如果不存在默认servlet,则servlet容器发送错误消息,指示servlet没找到。

发布了20 篇原创文章 · 获赞 3 · 访问量 9万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章