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

            
          當我們去啟動一個 WEB 項目的時候, 容器(包括 JBoss, Tomcat 等)首先會去讀項目的 web.xml 配置文件里面的信息,

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

          1> 首先是, 容器會先讀 <context-param></context-param> 節點, 并創建一個 ServletContext 實例, 以節點的 name 作為鍵, value 作為值,

             存儲到上下文環境中。

          2> 接著, 容器會去讀 <listener></listener> 節點, 根據配置的 class 類路徑來創建監聽。

          3> 接著, 容器去讀 <filter></filter> 節點, 根據指定的類路徑來實例化過濾器。

          以上都是在 WEB 項目還沒有完全啟動起來的時候就已經完成了的工作。如果系統中有用到 Servlet, 則 Servlet 是在第一次發起請求的時候被實例化的,

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

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

          其中, 如果 web.xml 中出現了相同的節點, 則是按照在配置文件中出現的先后順序來加載的。

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

            
          <?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() {
                  
              }
          }
            


          后臺啟動輸出結果:






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

          評論:
          # re: web.xml 的加載過程 2013-03-30 23:46 | 小學徒
          寫得很好,我這個菜鳥都一看就懂、  回復  更多評論
            
          # re: web.xml 的加載過程 2013-04-01 08:42 | 北斗
          最后的圖片錯了吧  回復  更多評論
            
          # re: @北斗 2013-04-01 11:01 | fancydeepin
          不會呢, 你覺得最后的圖片錯在哪里了呢?  回復  更多評論
            
          # re: web.xml 的加載過程 2013-04-07 10:08 | qqq
          ---------------------------------------------------
          服務部署簡要命令
          ---------------------------------------------------
          1、創建項目目錄,如<Windchill>\jaxws,后續本文中項目目錄以<ProjectDir>指代;生成服務為-Dservlet.name=<ServerName> 假設為:<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

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


          2、服務代碼
          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、編碼服務代碼
          windchill shell
          cd D:\ptc\Windchill_10.0\Windchill\jaxws\src\ext\jaxws\service
          javac TestJaxService.java


          4、發布Webservice
          windchill shell
          cd D:\ptc\Windchill_10.0\Windchill\huaweiws\src
          ant -f build.xml
          ### 命令成功執行后重啟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報錯,修正codebase/WEB-INF/web.xml文件

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

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


          網站導航:
           
          主站蜘蛛池模板: 志丹县| 洛阳市| 渭源县| 昌吉市| 渑池县| 象山县| 蓝山县| 东平县| 霍邱县| 平南县| 双峰县| 芦溪县| 象州县| 顺义区| 乃东县| 金湖县| 三门县| 年辖:市辖区| 鄂尔多斯市| 陆川县| 洞头县| 晋城| 峨山| 横山县| 陆河县| 常德市| 肥城市| 苗栗市| 金平| 延川县| 重庆市| 会宁县| 桐柏县| 台中县| 鄂州市| 普陀区| 获嘉县| 东乌| 安溪县| 政和县| 龙里县|