隨筆-126  評(píng)論-247  文章-5  trackbacks-0

            
          當(dāng)我們?nèi)?dòng)一個(gè) WEB 項(xiàng)目的時(shí)候, 容器(包括 JBoss, Tomcat 等)首先會(huì)去讀項(xiàng)目的 web.xml 配置文件里面的信息,

          當(dāng)這一步驟沒(méi)有出錯(cuò)并且完成之后, 項(xiàng)目才能正常的被啟動(dòng)起來(lái)。

          1> 首先是, 容器會(huì)先讀 <context-param></context-param> 節(jié)點(diǎn), 并創(chuàng)建一個(gè) ServletContext 實(shí)例, 以節(jié)點(diǎn)的 name 作為鍵, value 作為值,

             存儲(chǔ)到上下文環(huán)境中。

          2> 接著, 容器會(huì)去讀 <listener></listener> 節(jié)點(diǎn), 根據(jù)配置的 class 類路徑來(lái)創(chuàng)建監(jiān)聽(tīng)。

          3> 接著, 容器去讀 <filter></filter> 節(jié)點(diǎn), 根據(jù)指定的類路徑來(lái)實(shí)例化過(guò)濾器。

          以上都是在 WEB 項(xiàng)目還沒(méi)有完全啟動(dòng)起來(lái)的時(shí)候就已經(jīng)完成了的工作。如果系統(tǒng)中有用到 Servlet, 則 Servlet 是在第一次發(fā)起請(qǐng)求的時(shí)候被實(shí)例化的,

          且一般不會(huì)被容器銷毀, 它可以服務(wù)于多個(gè)用戶的請(qǐng)求。所以, Servlet 的初始化都要比上面提到的那幾個(gè)要遲。

          總的來(lái)說(shuō), web.xml 的加載順序是: context-param --> listener --> filter --> servlet

          其中, 如果 web.xml 中出現(xiàn)了相同的節(jié)點(diǎn), 則是按照在配置文件中出現(xiàn)的先后順序來(lái)加載的。

          下面引入一個(gè)小列子來(lái)說(shuō)明:

            
          <?xml version="1.0" encoding="UTF-8"?>
            
            
          <listener>
              
          <listener-class>net.yeah.fancydeepin.listener.AppStartListener</listener-class>
            
          </listener>
            
            <!-- 為了更好的說(shuō)明, 特意將 context-param 放在 listener 后面 -->
            
          <context-param>
              
          <param-name>technology</param-name>
              
          <param-value>java,javascript,ajax,css,html</param-value>
            
          </context-param>
            
            
          <filter>
              
          <filter-name>ReDespatcherFilter</filter-name>
              
          <filter-class>net.yeah.fancydeepin.filter.ReDespatcherFilter</filter-class>
              
          <init-param>
                
          <param-name>it</param-name>
                
          <param-value>android, python, c</param-value>
              
          </init-param>
            
          </filter>
            
          <filter-mapping>
              
          <filter-name>ReDespatcherFilter</filter-name>
              
          <url-pattern>/*</url-pattern>
            
          </filter-mapping>
            
            
          <filter>
              
          <filter-name>ReDespatcherFilter2</filter-name>
              
          <filter-class>net.yeah.fancydeepin.filter.ReDespatcherFilter2</filter-class>
              
          <init-param>
                
          <param-name>mail</param-name>
                
          <param-value>fancydeepin@yeah.net</param-value>
              
          </init-param>
            
          </filter>

          </web-app>
            

           

            
          package net.yeah.fancydeepin.listener;

          import java.util.Arrays;
          import java.util.List;
          import javax.servlet.ServletContext;
          import javax.servlet.ServletContextEvent;
          import javax.servlet.ServletContextListener;

          public class AppStartListener implements ServletContextListener{

              
          public void contextInitialized(ServletContextEvent contextEvent) {
                  System.out.println(
          "********************************************");
                  ServletContext context 
          = contextEvent.getServletContext();
                  List
          <String> params = Arrays.asList(context.getInitParameter("technology").split(","));
                  
          for(String param : params){
                      System.out.print(param 
          + "\t");
                  }
                  System.out.println(
          "\n********************************************");
              }

              
          public void contextDestroyed(ServletContextEvent contextEvent) {
                  
              }

          }
            

           

            
          package net.yeah.fancydeepin.filter;

          import java.io.IOException;
          import javax.servlet.Filter;
          import javax.servlet.FilterChain;
          import javax.servlet.FilterConfig;
          import javax.servlet.ServletException;
          import javax.servlet.ServletRequest;
          import javax.servlet.ServletResponse;

          public class ReDespatcherFilter implements Filter {
              
              
          public void init(FilterConfig filterConfig) throws ServletException {

                  System.out.println(
          "============================================");
                  System.out.println(filterConfig.getInitParameter(
          "it"));
                  System.out.println(
          "============================================");
              }
              
              
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException{
                  
                  chain.doFilter(request, response);
              }
              
              
          public void destroy() {
                  
              }
          }
            

           

            
          package net.yeah.fancydeepin.filter;

          import java.io.IOException;
          import javax.servlet.Filter;
          import javax.servlet.FilterChain;
          import javax.servlet.FilterConfig;
          import javax.servlet.ServletException;
          import javax.servlet.ServletRequest;
          import javax.servlet.ServletResponse;

          public class ReDespatcherFilter2 implements Filter {
              
              
          public void init(FilterConfig filterConfig) throws ServletException {

                  System.out.println(
          "++++++++++++++++++++++++++++++++++++++++++++");
                  System.out.println(filterConfig.getInitParameter(
          "mail"));
                  System.out.println(
          "++++++++++++++++++++++++++++++++++++++++++++");
              }
              
              
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException{
                  
                  chain.doFilter(request, response);
              }
              
              
          public void destroy() {
                  
              }
          }
            


          后臺(tái)啟動(dòng)輸出結(jié)果:






            
          posted on 2013-03-30 23:30 fancydeepin 閱讀(4745) 評(píng)論(4)  編輯  收藏

          評(píng)論:
          # re: web.xml 的加載過(guò)程 2013-03-30 23:46 | 小學(xué)徒
          寫(xiě)得很好,我這個(gè)菜鳥(niǎo)都一看就懂、  回復(fù)  更多評(píng)論
            
          # re: web.xml 的加載過(guò)程 2013-04-01 08:42 | 北斗
          最后的圖片錯(cuò)了吧  回復(fù)  更多評(píng)論
            
          # re: @北斗 2013-04-01 11:01 | fancydeepin
          不會(huì)呢, 你覺(jué)得最后的圖片錯(cuò)在哪里了呢?  回復(fù)  更多評(píng)論
            
          # re: web.xml 的加載過(guò)程 2013-04-07 10:08 | qqq
          ---------------------------------------------------
          服務(wù)部署簡(jiǎn)要命令
          ---------------------------------------------------
          1、創(chuàng)建項(xiàng)目目錄,如<Windchill>\jaxws,后續(xù)本文中項(xiàng)目目錄以<ProjectDir>指代;生成服務(wù)為-Dservlet.name=<ServerName> 假設(shè)為:<ServerName>=TestJaxService
          cd D:\ptc\Windchill_10.0\Windchill\bin
          ant -Dproject.dir=D:\ptc\Windchill_10.0\Windchill\jaxws -Dservlet.name=TestJaxService -Dsecurity.policy=webServerAuthenticated -Dservice.type=java -Dservice.class=ext.jaxws.service.TestJaxService -Dproject.type=service -f adminTools/WebServices/new-project.xml create

          ### 這里只生成服務(wù)端命令
          ### 注:
          ### 1 拷貝D:\ptc\Windchill_10\Windchill\jaxws到D:\ptc\Windchill_9.1\Windchill\jaxws中
          ### 2 前面步驟生成的服務(wù)端和客戶端僅僅示例代碼,這里根據(jù)實(shí)際情況添加服務(wù)方法,參數(shù),客戶端代碼


          2、服務(wù)代碼
          package ext.jaxws.service;

          import javax.jws.WebMethod;
          import javax.jws.WebService;
          import com.ptc.jws.servlet.JaxWsWebService;

          @WebService()
          public class TestJaxService extends JaxWsWebService
          {
          @WebMethod(operationName="queryParentPart")
          public String queryParentPart (String xmlInfo)
          {
          return "ssss";
          }
          }

          3、編碼服務(wù)代碼
          windchill shell
          cd D:\ptc\Windchill_10.0\Windchill\jaxws\src\ext\jaxws\service
          javac TestJaxService.java


          4、發(fā)布Webservice
          windchill shell
          cd D:\ptc\Windchill_10.0\Windchill\huaweiws\src
          ant -f build.xml
          ### 命令成功執(zhí)行后重啟tomcat和method server,打開(kāi)游覽器訪問(wèn)
          ### http://www.ptc.com/Windchill/servlet/<ServerName>?wsdl
          ### 示例中為:
          ### http://www.ptc.com/Windchill/servlet/TestJaxService?wsdl
          ### 如果并非正常顯示,則將D:\ptc\Windchill_10.0\Windchill\jaxws\codebase_service下的文件夾拷貝至D:\ptc\Windchill_10.0\Windchill\codebase目錄下,在訪問(wèn)一次
          ### 若部署不成功,則檢查tomcat報(bào)錯(cuò),修正codebase/WEB-INF/web.xml文件

          ### 若要撤銷部署
          cd D:\ptc\Windchill_10.0\Windchill\jaxws\src
          ant undeploy
            回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          隨筆分類(8)

          隨筆檔案(104)

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1462064
          • 排名 - 15

          最新評(píng)論

          閱讀排行榜

          主站蜘蛛池模板: 宁河县| 广饶县| 长治市| 大埔区| 德惠市| 丹江口市| 邹平县| 盈江县| 丰县| 桃园市| 淮南市| 太仓市| 如东县| 长岛县| 南京市| 姜堰市| 象山县| 富裕县| 霍林郭勒市| 新乡市| 五华县| 绥芬河市| 蒙城县| 陵水| 隆安县| 葫芦岛市| 偏关县| 广南县| 松原市| 册亨县| 明光市| 克什克腾旗| 铜梁县| 界首市| 凤冈县| 蒲城县| 游戏| 苍南县| 遂川县| 怀化市| 马龙县|