隨筆-126  評論-247  文章-5  trackbacks-0

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

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

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

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

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

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

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

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

          總的來說, web.xml 的加載順序是: context-param --> listener --> filter --> servlet

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

          下面引入一個小列子來說明:

            
          <?xml version="1.0" encoding="UTF-8"?>
            
            
          <listener>
              
          <listener-class>net.yeah.fancydeepin.listener.AppStartListener</listener-class>
            
          </listener>
            
            <!-- 為了更好的說明, 特意將 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() {
                  
              }
          }
            


          后臺啟動輸出結(jié)果:






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

          評論:
          # re: web.xml 的加載過程 2013-03-30 23:46 | 小學(xué)徒
          寫得很好,我這個菜鳥都一看就懂、  回復(fù)  更多評論
            
          # re: web.xml 的加載過程 2013-04-01 08:42 | 北斗
          最后的圖片錯了吧  回復(fù)  更多評論
            
          # re: @北斗 2013-04-01 11:01 | fancydeepin
          不會呢, 你覺得最后的圖片錯在哪里了呢?  回復(fù)  更多評論
            
          # re: web.xml 的加載過程 2013-04-07 10:08 | qqq
          ---------------------------------------------------
          服務(wù)部署簡要命令
          ---------------------------------------------------
          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,打開游覽器訪問
          ### 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目錄下,在訪問一次
          ### 若部署不成功,則檢查tomcat報(bào)錯,修正codebase/WEB-INF/web.xml文件

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

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


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

          隨筆分類(8)

          隨筆檔案(104)

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1462341
          • 排名 - 15

          最新評論

          閱讀排行榜

          主站蜘蛛池模板: 西贡区| 英超| 珲春市| 东乌珠穆沁旗| 喀喇沁旗| 阿勒泰市| 长泰县| 涞水县| 富阳市| 平昌县| 阿城市| 稷山县| 华容县| 九寨沟县| 鸡西市| 鞍山市| 高台县| 肃北| 麻阳| 恭城| 乐都县| 边坝县| 南华县| 汕头市| 宁国市| 缙云县| 阜城县| 静宁县| 长宁区| 清水河县| 邻水| 洞头县| 石渠县| 望江县| 永德县| 锡林郭勒盟| 凤凰县| 萨迦县| 正蓝旗| 阜城县| 鄂托克前旗|