前言:如果要了解web项目的底层实现,web.xml配置文件,是必须要掌握的。web.xml配置文件,是web项目的核心,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);
}
}
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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@37ecb28e - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@37ecb28e - Roll-over at midnight.
14:36:38,186 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@37ecb28e - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@183648b1 - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@183648b1 - Roll-over at midnight.
14:36:38,264 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@183648b1 - 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 ch.qos.logback.classic.boolex.JaninoEventEvaluator@c710a3b - Adding [return] prefix and a semicolon suffix. Expression becomes [return level>=40000;]
14:36:38,420 |-INFO in ch.qos.logback.classic.boolex.JaninoEventEvaluator@c710a3b - 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 ch.qos.logback.classic.joran.JoranConfigurator@6dd6c962 - 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 ch.qos.logback.classic.joran.JoranConfigurator@6dd6c962 - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@159a8bf2 - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@159a8bf2 - Roll-over at midnight.
14:36:38,795 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@159a8bf2 - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5559c7f2 - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5559c7f2 - Roll-over at midnight.
14:36:38,795 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5559c7f2 - 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 ch.qos.logback.classic.boolex.JaninoEventEvaluator@79560ca4 - Adding [return] prefix and a semicolon suffix. Expression becomes [return level>=40000;]
14:36:38,795 |-INFO in ch.qos.logback.classic.boolex.JaninoEventEvaluator@79560ca4 - 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 ch.qos.logback.classic.joran.JoranConfigurator@5b3353f - 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
为了方便大家理解,我们从最常见的配置开始着手来说明。
一,contextConfigLocation
的配置文件。这个功能,常见的用途,就是在配置文件内容很多时,为了便于管理和阅读,分解配置文件到不同的文件中。例如我们通常的做法,
将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中定义了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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@37ecb28e - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@37ecb28e - Roll-over at midnight.
14:36:38,186 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@37ecb28e - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@183648b1 - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@183648b1 - Roll-over at midnight.
14:36:38,264 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@183648b1 - 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 ch.qos.logback.classic.boolex.JaninoEventEvaluator@c710a3b - Adding [return] prefix and a semicolon suffix. Expression becomes [return level>=40000;]
14:36:38,420 |-INFO in ch.qos.logback.classic.boolex.JaninoEventEvaluator@c710a3b - 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 ch.qos.logback.classic.joran.JoranConfigurator@6dd6c962 - 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 ch.qos.logback.classic.joran.JoranConfigurator@6dd6c962 - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@159a8bf2 - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@159a8bf2 - Roll-over at midnight.
14:36:38,795 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@159a8bf2 - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5559c7f2 - 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 ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5559c7f2 - Roll-over at midnight.
14:36:38,795 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5559c7f2 - 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 ch.qos.logback.classic.boolex.JaninoEventEvaluator@79560ca4 - Adding [return] prefix and a semicolon suffix. Expression becomes [return level>=40000;]
14:36:38,795 |-INFO in ch.qos.logback.classic.boolex.JaninoEventEvaluator@79560ca4 - 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 ch.qos.logback.classic.joran.JoranConfigurator@5b3353f - 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