一、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 开发了吧!