1. 程式人生 > >web應用的入口:web.xml核心配置檔案詳解

web應用的入口:web.xml核心配置檔案詳解

前言:如果要了解web專案的底層實現,web.xml配置檔案,是必須要掌握的。web.xml配置檔案,是web專案的核心,web專案的啟動,從這裡開始。
為了方便大家理解,我們從最常見的配置開始著手來說明。

一,contextConfigLocation

contextConfigLocation用來配置自定義的配置檔案的載入路徑,如果指定了contextConfigLocation,當web專案啟動時,首先會去載入這個路徑下
的配置檔案。這個功能,常見的用途,就是在配置檔案內容很多時,為了便於管理和閱讀,分解配置檔案到不同的檔案中。例如我們通常的做法,
將servce相關的bean配置在單獨的application-service.xml中,將DAO相關的bean配置在單獨的application-dao.xml中。用法如下:
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/my.xml</param-value>
</context-param>
    如果有多個配置檔案,不同的配置檔案之間,可以在<param-value>標籤中,用逗號隔開。這裡還有一點需要說明的是,
contextConfigLocation的作用是自定義配置檔案的載入路徑,預設情況下,系統會去/WEB-INF目錄下,載入applicationContext.xml這個檔案,
一旦配置了contextConfigLocation,ContextLoader就會去我們指定的路徑下去載入配置檔案。如下:
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>my.xml,you.xml,he.xml</param-value>
</context-param>

二,org.springframework.web.filter.CharacterEncodingFilter


1,CharacterEncodingFilter過濾器的作用
    CharacterEncodingFilter是Spring框架提供的字元編碼過濾器,很容易猜到,CharacterEncodingFilter的作用就是解決專案中的編碼問題,
編碼問題是專案中經常會遇到的一個問題,Spring提供了一種更優雅的解決方法,從全域性的角度,來處理HTTP請求的編碼問題。我們只需要在
web.xml檔案中進行CharacterEncodingFilter配置,就可以解決專案中的中文亂碼問題。

2,CharacterEncodingFilter過濾器的使用方法
    在web.xml配置檔案中,進行一個filter的配置即可,encodingFilter用來指定過濾器類,這裡使用的就是CharacterEncodingFilter;encoding
用來指定編碼方式,我們一般都會設定成UTF-8;forceEncoding用來確保,不管是否指定了編碼方式,都強制使用encoding配置的編碼方式。
    示例程式碼如下:
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

3,CharacterEncodingFilter原始碼
package org.springframework.web.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CharacterEncodingFilter extends OncePerRequestFilter{
    private String encoding;
    private boolean forceEncoding;
    public CharacterEncodingFilter(){
        this.forceEncoding = false;
    }
    public void setEncoding(String encoding){
        this.encoding = encoding;
    }
    public void setForceEncoding(boolean forceEncoding){
        this.forceEncoding = forceEncoding;
    }
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
      throws ServletException, IOException{
      if ((this.encoding != null) && (((this.forceEncoding) || (request.getCharacterEncoding() == null)))) {
          request.setCharacterEncoding(this.encoding);
          if (this.forceEncoding) {
              response.setCharacterEncoding(this.encoding);
          }
      }
      filterChain.doFilter(request, response);
    }
}

三,org.springframework.web.context.ContextLoaderListener

    ContextLoaderListener是什麼呢?ContextLoaderListener是一個監聽器。ContextLoaderListener負責監聽Web專案的啟動過程。
ContextLoaderListener中定義了2個方法:contextInitialized和contextDestroyed,contextInitialized執行時,會初始化web應用
的根上下文資訊。
    對於Spring承載的web應用而言,可以在指定在web應用程式啟動時載入IOC容器(或者稱為WebApplicationContext)。這個功能
是由ContextLoaderListener這個監聽器類來完成的。ContextLoaderListener繼承自ContextLoader,實際上就是通過ContextLoader
來完成IOC的初始化的。ContextLoaderListener可以看做是Spring的啟動器,Spring從這裡開始。
ContextLoaderListener原始碼:
package org.springframework.web.context;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ContextLoaderListener extends ContextLoader implements ServletContextListener{
    private ContextLoader contextLoader;
    public ContextLoaderListener(){
    }
    public ContextLoaderListener(WebApplicationContext context){
        super(context);
    }
    public void contextInitialized(ServletContextEvent event){
        this.contextLoader = createContextLoader();
        if (this.contextLoader == null) {
            this.contextLoader = this;
        }
        // 初始化Web應用上下文
        this.contextLoader.initWebApplicationContext(event.getServletContext());
    }
    @Deprecated
    protected ContextLoader createContextLoader(){
        return null;
    }
    @Deprecated
    public ContextLoader getContextLoader(){
        return this.contextLoader;
    }
    public void contextDestroyed(ServletContextEvent event){
        if (this.contextLoader != null) {
            this.contextLoader.closeWebApplicationContext(event.getServletContext());
        }
        ContextCleanupListener.cleanupAttributes(event.getServletContext());
    }
}

我們重點來看一下初始化Web應用上下文的方法:initWebApplicationContext,原始碼如下:
  public WebApplicationContext initWebApplicationContext(ServletContext servletContext){
      if (servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null) {
          throw new IllegalStateException("Cannot initialize context because there is already a root application context present -
          check whether you have multiple ContextLoader* definitions in your web.xml!");
      }
      Log logger = LogFactory.getLog(ContextLoader.class);
      // 這個日誌,相信大家都很熟悉了,在使用tomcat啟動一個web專案,控制檯都會列印
      // 資訊: Initializing Spring root WebApplicationContext
      servletContext.log("Initializing Spring root WebApplicationContext");
      if (logger.isInfoEnabled()) {
          logger.info("Root WebApplicationContext: initialization started");
      }
      long startTime = System.currentTimeMillis();
      try{
          if (this.context == null) {
              this.context = createWebApplicationContext(servletContext);
          }
          if (this.context instanceof ConfigurableWebApplicationContext) {
              configureAndRefreshWebApplicationContext((ConfigurableWebApplicationContext)this.context, servletContext);
          }
          servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
          ClassLoader ccl = Thread.currentThread().getContextClassLoader();
          if (ccl == ContextLoader.class.getClassLoader()) {
              currentContext = this.context;
          }
          else if (ccl != null) {
              currentContextPerThread.put(ccl, this.context);
          }
          if (logger.isDebugEnabled()) {
              logger.debug("Published root WebApplicationContext as ServletContext attribute with name [" + WebApplicationContext.    ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + "]");
          }
          if (logger.isInfoEnabled()) {
              long elapsedTime = System.currentTimeMillis() - startTime;
              logger.info("Root WebApplicationContext: initialization completed in " + elapsedTime + " ms");
          }
          return this.context;
      }
      catch (RuntimeException ex) {
          logger.error("Context initialization failed", ex);
          servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex);
          throw ex;
      }
      catch (Error err) {
          logger.error("Context initialization failed", err);
          servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, err);
          throw err;
      }
  }

四,org.springframework.web.context.request.RequestContextListener


1,RequestContextListener與ContextLoaderListener的區別是什麼?
    RequestContextListener的作用是什麼呢?RequestContextListener與ContextLoaderListener的區別是什麼?RequestContextListener與
ContextLoaderListener的區別是兩者監聽不同的事件,RequestContextListener監聽的是ServletRequestEvent事件,其實就是HTTP請求事件,
ContextLoaderListener監聽ServletContextEvent事件,也就是web容器的啟動和關閉事件。我們應該怎麼理解RequestContextListener呢,可以
這樣來理解:RequestContextListener對web提供了更加精細化的監聽,web伺服器接收的每次HTTP請求,都會通知RequestContextListener監聽
器。

2,RequestContextListener監聽器的使用方法
    下面來說一下RequestContextListener這個監聽器的使用方法,其實也很簡單,只需要在web.xml中進行配置即可。需要注意的問題是
版本問題,如果我們使用的是servlet2.4及以上的版本,我們需要配置監聽器,配置如下:
<listener>
    <listener-class>com.yangcq.fc.deploy.DeployListener</listener-class>
</listener>
如果我們使用的是servlet2.4之前的版本,我們需要配置一個過濾器,配置如下:
<filter>
    <filter-name>RequestContextFilter</fileter-name>
    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>RequestContextFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3,RequestContextListener監聽器的實現原理分析
    不管是監聽器RequestContextFilter,還是過濾器RequestContextFilter,原理差不多,都是利用了ThreadLocal這個“專用通道”,將HTTP
請求引數繫結到為該請求提供服務的執行緒上。實現細節如下:
private static final ThreadLocal<RequestAttributes> requestAttributesHolder = new NamedThreadLocal("Request attributes");
    RequestContextListener實現了ServletRequestListener介面,原始碼如下:
package org.springframework.web.context.request;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import org.springframework.context.i18n.LocaleContextHolder;
public class RequestContextListener implements ServletRequestListener{
    private static final String REQUEST_ATTRIBUTES_ATTRIBUTE = RequestContextListener.class.getName() + ".REQUEST_ATTRIBUTES";
    // 初始化request上下文
    public void requestInitialized(ServletRequestEvent requestEvent){  
        // 注意ServletRequestEvent與ServletContextEvent的不同,RequestContextListener的requestInitialized方法,傳遞的引數是
        // ServletRequestEvent,而ContextLoaderListener的contextInitialized方法,傳遞的引數是ServletContextEvent
        if (!(requestEvent.getServletRequest() instanceof HttpServletRequest)) {
            // 首先判斷當前的ServletRequestEvent是不是依賴於HttpServletRequest
            throw new IllegalArgumentException("Request is not an HttpServletRequest: " + requestEvent.getServletRequest());
        }
        // 獲取當前的HttpServletRequest
        HttpServletRequest request = (HttpServletRequest)requestEvent.getServletRequest();
        // 把HttpServletRequest資料封裝到ServletRequestAttributes
        ServletRequestAttributes attributes = new ServletRequestAttributes(request);
        request.setAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE, attributes);
        LocaleContextHolder.setLocale(request.getLocale());
        RequestContextHolder.setRequestAttributes(attributes);
      }
    // 銷燬request上下文
    public void requestDestroyed(ServletRequestEvent requestEvent) {
        ServletRequestAttributes attributes = (ServletRequestAttributes)requestEvent.getServletRequest()
            .getAttribute(REQUEST_ATTRIBUTES_ATTRIBUTE);
        ServletRequestAttributes threadAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        if (threadAttributes != null){
            if (attributes == null) {
                attributes = threadAttributes;
            }
            LocaleContextHolder.resetLocaleContext();
            RequestContextHolder.resetRequestAttributes();
        }
        if (attributes != null)
            attributes.requestCompleted();
    }
}

五,org.springframework.web.servlet.DispatcherServlet

1,DispatcherServlet核心控制器的作用
    DispatcherServlet是Spring MVC的核心控制器,所有的web請求都要通過DispatcherServlet來處理,這些請求經過轉發、匹配、資料處理以
後,交給頁面來進行展示。DispatcherServlet的基類是HttpServlet,DispatcherServlet啟動時也會初始化上下文資訊,這個上下文是對根上下
文的補充。在SpringMVC中,對於不同的web請求,SpringMVC提供了不同的對映策略(HandleMapping),不同的專案可以根據自身情況選擇不同的
對映策略。預設情況下,DispatcherServlet使用的是BeanNameUrlHandlerMapping作為自己的對映策略。

2,DispatcherServlet核心控制器的初始化
    DispatcherServlet的初始化,是在ContextLoaderListener的初始化之後。DispatcherServlet的初始化的時間與在web.xml中load-on-startup
的定義有關。DispatcherServlet會建立自己的上下文來持有SpringMVC的Bean物件,在建立這個自己持有的IOC容器時,會從ServletContext中得
到根上下文,作為DispatcherServlet持有上下文的雙親上下文。從這裡我們可以看出,ServletContext是根上下文,DispatcherServlet是第二層次
的二級上下文。DispatcherServlet上下文是對根上下文的補充和擴充套件,是為了更好的支援web。好,先看一下DispatcherServlet的繼承關係:
    * public class DispatcherServlet extends FrameworkServlet
    * public abstract class FrameworkServlet extends HttpServletBean
    * public abstract class HttpServletBean extends HttpServlet implements EnvironmentCapable, EnvironmentAware
    從上面這個繼承關係可以看出,DispatcherServlet的本質還是一個HttpServlet,SpringMVC框架就是對servlet的封裝。萬變不離其宗。其實,
DispatcherServlet也是通過使用Servlet API來處理HTTP請求的。DispatcherServlet實現的原理,和Servlet很相似。

3,DispatcherServlet核心控制器的配置方法
配置如下:
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>


參考資料:《tomcat啟動控制檯輸出日誌完整版》
2016-9-6 14:36:14 org.apache.catalina.core.AprLifecycleListener init
資訊: Loaded APR based Apache Tomcat Native library 1.1.30 using APR version 1.4.8.
2016-9-6 14:36:14 org.apache.catalina.core.AprLifecycleListener init
資訊: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2016-9-6 14:36:14 org.apache.catalina.core.AprLifecycleListener initializeSSL
資訊: OpenSSL successfully initialized with version OpenSSL 1.0.1g 7 Apr 2014
2016-9-6 14:36:14 org.apache.coyote.http11.Http11AprProtocol init
資訊: Initializing Coyote HTTP/1.1 on http-8080
2016-9-6 14:36:14 org.apache.coyote.ajp.AjpAprProtocol init
資訊: Initializing Coyote AJP/1.3 on ajp-8009
2016-9-6 14:36:14 org.apache.catalina.startup.Catalina load
資訊: Initialization processed in 1196 ms
2016-9-6 14:36:14 org.apache.catalina.core.StandardService start
資訊: Starting service Catalina
2016-9-6 14:36:14 org.apache.catalina.core.StandardEngine start
資訊: Starting Servlet Engine: Apache Tomcat/6.0.41
2016-9-6 14:36:14 org.apache.catalina.startup.HostConfig deployDescriptor
資訊: Deploying configuration descriptor host-manager.xml
2016-9-6 14:36:15 org.apache.catalina.startup.HostConfig deployDescriptor
資訊: Deploying configuration descriptor manager.xml
2016-9-6 14:36:15 org.apache.catalina.startup.HostConfig deployDirectory
資訊: Deploying web application directory docs
2016-9-6 14:36:15 org.apache.catalina.startup.HostConfig deployDirectory
資訊: Deploying web application directory examples
2016-9-6 14:36:15 org.apache.catalina.core.ApplicationContext log
資訊: ContextListener: contextInitialized()
2016-9-6 14:36:15 org.apache.catalina.core.ApplicationContext log
資訊: SessionListener: contextInitialized()
2016-9-6 14:36:15 org.apache.catalina.startup.HostConfig deployDirectory
資訊: Deploying web application directory yangcq2016
2016-9-6 14:36:15 org.apache.catalina.loader.WebappClassLoader validateJarFile
資訊: validateJarFile(D:\apache-tomcat-6.0.41\webapps\yangcq2016\WEB-INF\lib\javaee.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
2016-9-6 14:36:15 org.apache.catalina.loader.WebappClassLoader validateJarFile
資訊: validateJarFile(D:\apache-tomcat-6.0.41\webapps\yangcq2016\WEB-INF\lib\jeus.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
2016-9-6 14:36:16 org.apache.catalina.core.StandardContext listenerStart
嚴重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4153)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4709)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:583)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1079)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1002)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:506)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:822)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
    at org.apache.catalina.core.StandardService.start(StandardService.java:525)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
2016-9-6 14:36:16 org.apache.catalina.core.StandardContext listenerStart
嚴重: Error configuring application listener of class org.springframework.web.util.IntrospectorCleanupListener
java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4153)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4709)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:583)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1079)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1002)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:506)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:822)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
    at org.apache.catalina.core.StandardService.start(StandardService.java:525)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
2016-9-6 14:36:16 org.apache.catalina.core.StandardContext listenerStart
嚴重: Error configuring application listener of class org.springframework.web.context.request.RequestContextListener
java.lang.ClassNotFoundException: org.springframework.web.context.request.RequestContextListener
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4153)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4709)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:583)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1079)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1002)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:506)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:822)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
    at org.apache.catalina.core.StandardService.start(StandardService.java:525)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
2016-9-6 14:36:16 org.apache.catalina.core.StandardContext listenerStart
嚴重: Skipped installing application listeners due to previous error(s)
2016-9-6 14:36:16 org.apache.catalina.core.StandardContext start
嚴重: Error listenerStart
2016-9-6 14:36:16 org.apache.catalina.core.StandardContext start
嚴重: Context [/yangcq2016] startup failed due to previous errors
2016-9-6 14:36:16 org.apache.catalina.startup.HostConfig deployDirectory
資訊: Deploying web application directory yangcq2015
2016-9-6 14:36:16 org.apache.catalina.loader.WebappClassLoader validateJarFile
資訊: validateJarFile(D:\apache-tomcat-6.0.41\webapps\yangcq2015\WEB-INF\lib\javaee.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
2016-9-6 14:36:16 org.apache.catalina.loader.WebappClassLoader validateJarFile
資訊: validateJarFile(D:\apache-tomcat-6.0.41\webapps\yangcq2015\WEB-INF\lib\jeus.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
2016-09-06 14:36:17,149 [main] INFO  com.yangcq.ycq.deploy.TransactionDeployer - start deploy config source file. sourcePath : D:\apache-tomcat-6.0.41\webapps\yangcq2015\WEB-INF\classes\design, distPath : D:\apache-tomcat-6.0.41\webapps\yangcq2015\WEB-INF\classes\config
2016-09-06 14:36:25,404 [main] INFO  com.yangcq.ycq.deploy.TransactionDeployer - deploy config source file ok...
2016-9-6 14:36:25 org.apache.catalina.core.ApplicationContext log
資訊: Initializing Spring root WebApplicationContext

2016-9-6 14:36:36 org.apache.catalina.core.ApplicationContext log
資訊: Initializing Spring FrameworkServlet 'dispatcher'
2016-9-6 14:36:37 org.apache.catalina.startup.HostConfig deployDirectory
資訊: Deploying web application directory ycq
2016-9-6 14:36:37 org.apache.catalina.core.ApplicationContext log
資訊: Set web app root system property: 'webapp.root' = [D:\apache-tomcat-6.0.41\webapps\ycq\]
2016-9-6 14:36:37 org.apache.catalina.core.ApplicationContext log
資訊: Initializing Logback from [classpath:logback.xml]
14:36:37,873 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
14:36:37,873 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
14:36:37,873 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/D:/apache-tomcat-6.0.41/webapps/ycq/WEB-INF/classes/logback.xml]
14:36:38,076 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Setting ReconfigureOnChangeFilter scanning period to 30 seconds
14:36:38,076 |-INFO in ReconfigureOnChangeFilter{invocationCounter=0} - Will scan for changes in [[D:\apache-tomcat-6.0.41\webapps\ycq\WEB-INF\classes\logback.xml]] every 30 seconds.
14:36:38,076 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Adding ReconfigureOnChangeFilter as a turbo filter
14:36:38,076 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
14:36:38,092 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [ROLLING]
14:36:38,171 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use zip compression
14:36:38,171 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern MSS_HOME_IS_UNDEFINED/log//archives//ycq/Out-%d{yyyy-MM-dd}.%i for the active file
14:36:38,186 |-INFO in [email protected] - The date pattern is 'yyyy-MM-dd' from file name pattern 'MSS_HOME_IS_UNDEFINED/log//archives//ycq/Out-%d{yyyy-MM-dd}.%i.zip'.
14:36:38,186 |-INFO in [email protected] - Roll-over at midnight.
14:36:38,186 |-INFO in [email protected] - Setting initial period to Mon Nov 09 10:37:02 CST 2015
14:36:38,186 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
14:36:38,264 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ROLLING] - Active log file name: MSS_HOME_IS_UNDEFINED/log//Outycq.log
14:36:38,264 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ROLLING] - File property is set to [MSS_HOME_IS_UNDEFINED/log//Outycq.log]
14:36:38,264 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
14:36:38,264 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [ERRORLog]
14:36:38,264 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use zip compression
14:36:38,264 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern MSS_HOME_IS_UNDEFINED/log//archives//ycq/Error-%d{yyyy-MM-dd}.%i for the active file
14:36:38,264 |-INFO in [email protected] - The date pattern is 'yyyy-MM-dd' from file name pattern 'MSS_HOME_IS_UNDEFINED/log//archives//ycq/Error-%d{yyyy-MM-dd}.%i.zip'.
14:36:38,264 |-INFO in [email protected] - Roll-over at midnight.
14:36:38,264 |-INFO in [email protected] - Setting initial period to Mon Nov 09 10:37:02 CST 2015
14:36:38,264 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
14:36:38,280 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.boolex.JaninoEventEvaluator] for [evaluator] property
14:36:38,420 |-INFO in [email protected] - Adding [return] prefix and a semicolon suffix. Expression becomes [return level>=40000;]
14:36:38,420 |-INFO in [email protected] - See also http://logback.qos.ch/codes.html#block
14:36:38,764 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ERRORLog] - Active log file name: MSS_HOME_IS_UNDEFINED/log//Errorycq.log
14:36:38,764 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ERRORLog] - File property is set to [MSS_HOME_IS_UNDEFINED/log//Errorycq.log]
14:36:38,764 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
14:36:38,764 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
14:36:38,764 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
14:36:38,764 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.ycq] to DEBUG
14:36:38,764 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
14:36:38,764 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
14:36:38,779 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
14:36:38,779 |-INFO in [email protected] - Registering current configuration as safe fallback point
14:36:38,764 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ERRORLog] - Active log file name: MSS_HOME_IS_UNDEFINED/log//Errorycq.log
14:36:38,764 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ERRORLog] - File property is set to [MSS_HOME_IS_UNDEFINED/log//Errorycq.log]
14:36:38,764 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
14:36:38,764 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
14:36:38,764 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
14:36:38,764 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.ycq] to DEBUG
14:36:38,764 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
14:36:38,764 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
14:36:38,779 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
14:36:38,779 |-INFO in [email protected] - Registering current configuration as safe fallback point
14:36:38,779 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Setting ReconfigureOnChangeFilter scanning period to 30 seconds
14:36:38,779 |-INFO in ReconfigureOnChangeFilter{invocationCounter=0} - Will scan for changes in [[D:\apache-tomcat-6.0.41\webapps\ycq\WEB-INF\classes\logback.xml]] every 30 seconds.
14:36:38,779 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Adding ReconfigureOnChangeFilter as a turbo filter
14:36:38,795 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
14:36:38,795 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [ROLLING]
14:36:38,795 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use zip compression
14:36:38,795 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern MSS_HOME_IS_UNDEFINED/log//archives//ycq/Out-%d{yyyy-MM-dd}.%i for the active file
14:36:38,795 |-INFO in [email protected] - The date pattern is 'yyyy-MM-dd' from file name pattern 'MSS_HOME_IS_UNDEFINED/log//archives//ycq/Out-%d{yyyy-MM-dd}.%i.zip'.
14:36:38,795 |-INFO in [email protected] - Roll-over at midnight.
14:36:38,795 |-INFO in [email protected] - Setting initial period to Mon Nov 09 10:37:02 CST 2015
14:36:38,795 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
14:36:38,795 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ROLLING] - Active log file name: MSS_HOME_IS_UNDEFINED/log//Outycq.log
14:36:38,795 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ROLLING] - File property is set to [MSS_HOME_IS_UNDEFINED/log//Outycq.log]
14:36:38,795 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]
14:36:38,795 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [ERRORLog]
14:36:38,795 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use zip compression
14:36:38,795 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern MSS_HOME_IS_UNDEFINED/log//archives//ycq/Error-%d{yyyy-MM-dd}.%i for the active file
14:36:38,795 |-INFO in [email protected] - The date pattern is 'yyyy-MM-dd' from file name pattern 'MSS_HOME_IS_UNDEFINED/log//archives//ycq/Error-%d{yyyy-MM-dd}.%i.zip'.
14:36:38,795 |-INFO in [email protected] - Roll-over at midnight.
14:36:38,795 |-INFO in [email protected] - Setting initial period to Mon Nov 09 10:37:02 CST 2015
14:36:38,795 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
14:36:38,795 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.boolex.JaninoEventEvaluator] for [evaluator] property
14:36:38,795 |-INFO in [email protected] - Adding [return] prefix and a semicolon suffix. Expression becomes [return level>=40000;]
14:36:38,795 |-INFO in [email protected] - See also http://logback.qos.ch/codes.html#block
14:36:38,810 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ERRORLog] - Active log file name: MSS_HOME_IS_UNDEFINED/log//Errorycq.log
14:36:38,810 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[ERRORLog] - File property is set to [MSS_HOME_IS_UNDEFINED/log//Errorycq.log]
14:36:38,810 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
14:36:38,810 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
14:36:38,810 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
14:36:38,810 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [com.ycq] to DEBUG
14:36:38,810 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
14:36:38,810 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
14:36:38,810 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
14:36:38,810 |-INFO in [email protected] - Registering current configuration as safe fallback point
2016-9-6 14:36:38 org.apache.catalina.core.ApplicationContext log
資訊: JUL to SLF4J bridge is not available on the classpath
2016-9-6 14:36:38 org.apache.catalina.core.ApplicationContext log


------------------------------------初始化root WebApplicationContext------------------------------------
資訊: Initializing Spring root WebApplicationContext
2016-9-6 14:36:38 org.springframework.web.context.ContextLoader initWebApplicationContext
資訊: Root WebApplicationContext: initialization started
2016-9-6 14:36:39 org.springframework.web.context.support.XmlWebApplicationContext prepareRefresh
資訊: Refreshing Root WebApplicationContext: startup date [Tue Sep 06 14:36:39 CST 2016]; root of context hierarchy
2016-9-6 14:36:39 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
資訊: Loading XML bean definitions from class path resource [applicationContext.xml]
2016-9-6 14:36:39 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
資訊: Loading XML bean definitions from class path resource [applicationContext-dao.xml]
2016-9-6 14:36:39 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
資訊: Loading XML bean definitions from class path resource [applicationContext-job.xml]
2016-9-6 14:36:39 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
資訊: Loading XML bean definitions from class path resource [applicationContext-cache.xml]
2016-9-6 14:36:40 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer loadProperties
資訊: Loading properties file from class path resource [cache.properties]
2016-9-6 14:36:43 org.springframework.context.support.DefaultLifecycleProcessor start
資訊: Starting beans in phase 2147483647
14:36:43.691 [INFO ] [main] [] Scheduler schedulerFactoryBean_$_NON_CLUSTERED started. Caller+0     at org.quartz.core.QuartzScheduler.start(QuartzScheduler.java:575)
14:36:43.691 [DEBUG] [schedulerFactoryBean_QuartzSchedulerThread] [] batch acquisition of 0 triggers Caller+0     at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:276)
2016-9-6 14:36:43 org.springframework.scheduling.quartz.SchedulerFactoryBean startScheduler
資訊: Starting Quartz Scheduler now
2016-9-6 14:36:43 org.springframework.web.context.ContextLoader initWebApplicationContext
資訊: Root WebApplicationContext: initialization completed in 4897 ms
------------------------------------初始化root WebApplicationContext------------------------------------


------------------------------------初始化appServlet------------------------------------
2016-9-6 14:36:43 org.apache.catalina.core.ApplicationContext log
資訊: Initializing Spring FrameworkServlet 'appServlet'
2016-9-6 14:36:43 org.springframework.web.servlet.DispatcherServlet initServletBean
資訊: FrameworkServlet 'appServlet': initialization started
2016-9-6 14:36:43 org.springframework.web.context.support.XmlWebApplicationContext prepareRefresh
資訊: Refreshing WebApplicationContext for namespace 'appServlet-servlet': startup date [Tue Sep 06 14:36:43 CST 2016]; parent: Root WebApplicationContext
2016-9-6 14:36:43 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
資訊: Loading XML bean definitions from class path resource [spring-servlet.xml]
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCache/clearCache.jhtml] onto handler 'tapCacheControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCache/refreshCache.jhtml] onto handler 'tapCacheControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCache/cacheInfo.jhtml] onto handler 'tapCacheControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapDateFreq/tapDateFreq.jhtml] onto handler 'tapDateFreqControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCKpi/tapCKpiData.jhtml] onto handler 'tapCKpiDataControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCKpi/tapCKpiPlanData.jhtml] onto handler 'tapCKpiDataControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCKpi/tapCKpiDesc.jhtml] onto handler 'tapCKpiDataControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCBranch/queryTapCBranch.jhtml] onto handler 'tapCBranchControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCKpiBasisLine/queryBasisLine.jhtml] onto handler 'tapCKpiBasisLineControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCKpiChartMonthLine/queryChartMonthLine.jhtml] onto handler 'tapCKpiChartMonthLineControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCKpiChartMonthLine/getServerSystemTime.jhtml] onto handler 'tapCKpiChartMonthLineControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCKpiColumnMonthLine/queryColumnMonthLine.jhtml] onto handler 'tapCKpiColumnMonthLineControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCKpiDegreeLine/queryDegreeLine.jhtml] onto handler 'tapCKpiDegreeLineControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCKpiMeterLine/queryMeterLine.jhtml] onto handler 'tapCKpiMeterLineControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCKpiStructLine/queryStructLine.jhtml] onto handler 'tapCKpiStructLineControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCUserLogonV/userLogon.jhtml] onto handler 'tapCUserLogonVControl'
2016-9-6 14:36:44 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping registerHandler
資訊: Mapped URL path [/tapCUserLogonV/userLogout.jhtml] onto handler 'tapCUserLogonVControl'
2016-9-6 14:36:45 org.springframework.web.servlet.DispatcherServlet initServletBean
資訊: FrameworkServlet 'appServlet': initialization completed in 1266 ms
------------------------------------初始化appServlet------------------------------------


2016-9-6 14:36:45 org.apache.catalina.startup.HostConfig deployDirectory
資訊: Deploying web application directory ROOT
2016-9-6 14:36:45 org.apache.coyote.http11.Http11AprProtocol start
資訊: Starting Coyote HTTP/1.1 on http-8080
2016-9-6 14:36:45 org.apache.coyote.ajp.AjpAprProtocol start
資訊: Starting Coyote AJP/1.3 on ajp-8009
2016-9-6 14:36:45 org.apache.catalina.startup.Catalina start
資訊: Server startup in 30331 ms

相關推薦

web應用入口web.xml核心配置檔案

前言:如果要了解web專案的底層實現,web.xml配置檔案,是必須要掌握的。web.xml配置檔案,是web專案的核心,web專案的啟動,從這裡開始。 為了方便大家理解,我們從最常見的配置開始著手來說明。一,contextConfigLocation contextCo

Spring Boot基礎教程 ( 四 ) Spring Boot 屬性配置檔案

相信很多人選擇Spring Boot主要是考慮到它既能兼顧Spring的強大功能,還能實現快速開發的便捷。我們在Spring Boot使用過程中,最直觀的感受就是沒有了原來自己整合Spring應用時繁多的XML配置內容,替代它的是在pom.xml中引入模組化的Starter

Spring Boot 核心配置檔案

用過 Spring Boot 的都知道在 Spring Boot 中有以下兩種配置檔案 bootstrap (.yml 或者 .properties) application (.yml 或者 .properties) 為什麼會有這兩種配置檔案呢?大家

mybatis核心配置檔案

1.屬性(properties) <properties resource="db.properties">         <property name="driver" val

Elasticsearch6.2基本概念及核心配置檔案

以下內容,都摘自官網6.2 版本文件,有些屬性名字和以前都不一樣,如果沒有找到對應的屬性,請閱讀官方文件進行查詢:官網:https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concept

struts2中的web.xml配置檔案

  web.xml 在Web應用程式描述符檔案表示Java Web應用程式的核心,它也是Struts框架的核心的一部分。在web.xml檔案中,Struts的定義其FilterDispatcher,在Servlet過濾器類初始化Struts框架和處理所有的請求。

struts2 xml(核心配置檔案)

struts.xml (核心配置檔案) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts C

ssm spring+springmvc+mybatis中的xml配置檔案

這幾天一直在整合SSM框架,雖然網上有很多已經整合好的,但是對於裡面的配置檔案並沒有進行過多的說明,很多人知其然不知其所以然,經過幾天的搜尋和整理,今天總算對其中的XML配置檔案有了一定的瞭解,所以拿出來一起分享一下,希望有不足的地方大家批評指正~~~ 首先   這篇文章暫時只對框架中所要用到的配

Android安全/開發基礎--15--應用程式配置檔案(AndroidManifest.xml

================================================================= Android應用程式都需要有清單檔案。該檔案必須命名為AndroidManifest.xml且必須防止在應用程式根目錄中。它聲明

AndroidManifest.xml配置檔案

AndroidManifest.xml配置檔案對於Android應用開發來說是非常重要的基礎知識,本文旨在總結該配置檔案中重點的用法,以便日後查閱。下面是一個標準的AndroidManifest.xml檔案樣例。 <?xml version="1.0" encoding="utf-8"?> &

hibernate.cfg.xml 核心配置檔案

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"

idea檢出Eclipse專案出現[applicationContext.xml]等配置檔案不存在問題

小白第一次用idea,配置svn後檢出Eclipse專案執行時就出現了以下錯誤:org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XMLdocument fr

Hibernate中hibernate.cfg.xml核心配置檔案配置

<property>行為標籤,name需要操作的物件 //dialect表示資料庫的方言,例org.hibernate.dialect.MySQLDialect <property

Web.config配置檔案(新手必看)

花了點時間整理了一下ASP.NET Web.config配置檔案的基本使用方法。很適合新手參看,由於Web.config在使用很靈活,可以自定義一些節點。所以這裡只介紹一些比較常用的節點。 <?xml version="1.0"?> <!

Web.config配置檔案

ASP.NET Web.config配置檔案的基本使用方法。很適合新手參看,由於Web.config在使用很靈活,可以自定義一些節點。所以這裡只介紹一些比較常用的節點。 <?xml version="1.0"?> <!--注意: 除了手動編輯此檔案以外,您

Asp.Net 之 Web.config 配置檔案

[2]在這個資料夾下還有一個web.config檔案,這個檔案包含了asp.net網站的常用配置。下面是這個web.config檔案的內容: <?xml version="1.0" encoding="utf-8"?><!-- the root web configuration fi

Hibernate_day01---Hibernate環境搭建、配置檔案核心api介紹

JavaEE三層結構對應的框架 1) web層:struts2框架 2) service層:spring框架 3)dao層:hibernate框架 -- 對資料庫進行crud操作 什麼是框架: 可複用的設計構件 作用:可以少寫一部分程式碼。使用框架寫程式,會幫我們實現一部

Mybatis -程式碼自動生成(generatorConfig.xml配置資訊

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1

Maven的pom.xml配置檔案

轉自: Maven的pom.xml配置檔案詳解  <!--父專案的座標。如果專案中沒有規定某個元素的值,那麼父專案中的對應值即為專案的預設值。 座標包括group ID,artifact ID和 version。-->  &

【MyBatis Generator】程式碼自動生成工具 generatorConfig.xml配置檔案

MyBatis Generator官網地址:http://www.mybatis.org/generator/index.html MyBaris Generator中文地址:http://mbg.cndocs.ml/ 在MBG中,最主要也最重要的,就是generatorConfig.xml