一、Javaweb 部署目录结构
servlet规范不仅规范了servlet自身处理web请求的通用逻辑过程,
还规范了web服务器管理servlet的通用步骤。
为了使得我们开发的Java web 应用能在多种多样的 Java web服务器上运行,而不用做代码上的修改,根据servlet规范Java web应用在服务器中部署时的目录结构应该如下:
– 应用程序根目录
– |-- WEB-INF目录:必须目录,外界不可访问
– |-- web.xml:Web应用部署描述文件,必须
– |-- classes目录:应用处理逻辑代码,编译过的字节码文件
– |-- lib目录:第三方类库文件
– |-- TLD文件:标签库描述文件
– |-- META-INF目录:必须目录,外界不可访问
– |-- context.xml
– |-- 其他文件:JSP、HTML、CSS、JavaScript、图片等,外界可直接访问
二、web.xml的主要作用
你在WEB服务器的应用目录下部署了你的web应用,等待服务器启动:
1、web服务器启动的时候会为其应用目录下的各个应用进行初始化,依据就是WEB-INF下的web.xml。
2、首先标识应用适用的servlet规范
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
3、然后逐个解析web.xml中的标签:
容器对于web.xml的加载过程是context-param >> listener >> fileter >> servlet
初始化过程:
- 在启动Web项目时,容器(比如Tomcat)会读web.xml配置文件中的两个节点<listener>和<contex-param>。
- 接着容器会创建一个ServletContext(上下文),应用范围内即整个WEB项目都能使用这个上下文。
- 接着容器会将读取到<context-param>转化为键值对,并交给ServletContext。
- 容器创建<listener></listener>中的类实例,即创建监听。在监听的类中会有一个contextInitialized(ServletContextEvent event)初始化方法,在这个方法中可以通过event.getServletContext().getInitParameter("contextConfigLocation") 来得到context-param 设定的值。在这个类中还必须有一个contextDestroyed(ServletContextEvent event) 销毁方法.用于关闭应用前释放资源,比如说数据库连接的关闭。
- 得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早。
<filter>和<filter-mapping>:过滤器(加工类),是说
- servlet对请求处理之前,用哪些class先对请求进行一番处理,比如进行统计一些数据、身份识别等
- servlet处理完请求后的响应,再用一些class对这个响应进行一些加工啊,剔除等工作
filter表明本应用编写了哪些加工类,每个类有哪些参数
filter-mapping规定了一个url由哪些加工类进行处理的规则。一个url请求或响应可被多个加工类依次加工
<servlet>:告诉服务器这个应用写了哪些servlet,每个servlet的名字,对应的class全路径名,启动时服务器是否对他进行实例化,实例化时有哪些参数
<servlet-mapping>:告诉服务器根据请求的Url找哪个servlet来处理的规则,多个url可以由同一个servlet来处理,url的模式可以进行通配表示。
对于如下的一些映射关系:
Servlet1 映射到 /abc/*
Servlet2 映射到 /*
Servlet3 映射到 /abc
Servlet4 映射到 *.do
问题:
当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应
Servlet引擎将调用Servlet3。
当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
匹配的原则就是"谁长得更像就找谁"
session-config:设置多久时间内还认得你
mime-mapping: 告诉浏览器返回的文件的具体类型,让浏览器能正确选择处理程序
welcom-file-list: 默认处理文件
error-page :告诉服务器对某些异常的HTTP状态码,或特定类型异常被抛出时,要显示的页面的规则
4、解析完毕就等着浏览器端的请求咯,来一个请求就新开个线程,根据url模式找到处理其的servlet,封装好请求对象(如果有加工类就先加工)、响应对象作为参数调用servlet的service方法,将获得的响应返回给浏览器。
按照部署目录和web.xml元素知识,相信你可以开始进行Java web 开发了吧!