[转]Tomcat启动分析

原帖

http://docs.huihoo.com/apache/tomcat/heavyz/01-startup.html

以下摘录了部分

------------------------------------------------------------------------------------

1 - Tomcat Server的组成部分

1.1 - Server

A Server element represents the entire Catalina servlet container. (Singleton)

1.2 - Service

Service是这样一个集合:它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求

1.3 - Connector

一个Connector将在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户
TOMCAT有两个典型的Connector,一个直接侦听来自browser的http请求,一个侦听来自其它WebServer的请求
Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求
Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求

1.4 - Engine

Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名
当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理
Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理

1.5 - Host

代表一个Virtual Host,虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配
每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context,有一个Context path
当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理
匹配的方法是“最长匹配”,所以一个path==""的Context将成为该Host的默认Context
所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配

1.6 - Context

一个Context对应于一个Web Application,一个Web Application由一个或者多个Servlet组成
Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类
当Context获得请求时,将在自己的映射表(mapping table)中寻找相匹配的Servlet类

2 - Tomcat Server的结构图

5 - Tomcat Server处理一个http请求的过程

假设来自客户的请求为:
http://localhost:8080/wsota/wsota_index.jsp

1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应
3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host
4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context
6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)
7) path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet
8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类
9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法
10)Context把执行完了之后的HttpServletResponse对象返回给Host
11)Host把HttpServletResponse对象返回给Engine
12)Engine把HttpServletResponse对象返回给Connector
13)Connector把HttpServletResponse对象返回给客户browser

--------------------------------------------------------------------------

Servlet、jsp、http协议

当我们在web浏览器中输入一个httpURL时,浏览器首先将其封装为http请求报文,该报文中还会包含本地用户的一些信息,如浏览器、操作系统等信息。

这些请求的发起,还包括页面中的一个超文本链接或一个表单的提交。所谓表单,是包含在标签<form></form>间的信息,当用户按提交按钮后,将发出一个http请求,默认情况下,该请求需要的页面是当前页面,方法为get,将提交该表单中所有定义的数据。但可以通过<form action="reg.jsp" method="post">来指定请求的页面以及请求的方法。如果使用get方法,这些提交的信息将作为url的一部分提交到web服务器,如果使用post方法,则提交的信息将封装到实体主体部分中去。

当web服务器得到该报文后,如果是自己可以处理的请求,则直接返回页面,否则将请求转发给其它程序处理(这需要通过配置才能让web服务器知道转发给谁)。如果是对servlet或jsp的请求,则该请求会转发给servlet容器。

现在servlet容器收到请求后,首先会将报文信息(也可能是web服务器解析后传递过来的数据结构?)封装为一个HttpServletRequest的对象,同时根据请求查找相应的HttpServlet类(根据web-inf目录下web.xml中给出的servlet-class信息,到web-inf/classes下找相应的类),找到后,创建该类实例(如果该类已经装入内存,则直接从内存创建,这也是为什么在tomcat中,如果修改内容后必须重新起动的原因,而对于发布的web应用,在servlet容器起动时,也会进行一些预处理,可能是对每个web应用中web.xml文件进行处理,servlet容器起动后加入的web应用对servlet容器是不知道的,因此必须重启,至少tomcat如此)。然后根据请求是get或post(当然还有其它命令,如head,但一般应用中主要是这两个),分别调用HttpServlet类实例的doGet或doPost方法,同时传入HttpServletRequest的对象以及作为响应请求的HttpServletResponse对象。

现在进入doGet(或doPost)方法,在方法中,从HttpServletRequest对象中得到用户提交的信息,进行处理,然后通过HttpServletResponse对象输出相应的页面。doGet和doPost可以给出两个完全不同的响应页面,但一般情况下,doPost会直接调用doGet。从面向对象的角度来说,一个servlet应该只对应一个页面。

当doGet(或doPost)方法结束后,HttpServlet类就完成了工作,现在是servlet容器的任务了。它得到了HttpServlet类处理后的HttpServletResponse对象,根据该对象,容器封装http响应报文(或者填充web服务器可以理解的数据结构?),返回给web服务器。

Web服务器将响应报文传递给浏览器。浏览器解析响应报文,显示页面。

对于jsp文件,首先会被编译为相应的servlet,在tomcat中,name.jsp会被编译为name_jsp.class,它的package为org.apache.jsp,原有的html信息被放入编译后的方法中,由JspWriter定义的out对象输出。因此当我们写jsp中的java代码时,至少由两个对象是可以直接使用的,即HttpServletRequest的对象request以及HttpServletResponse对象response。

------------------------------------------------------------

TOMCAT简述(转)

一、Tomcat背景 
  自从JSP发布之后,推出了各式各样的JSP引擎。Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器,当然同时也支持Servlet, 这样Tomcat就诞生了。Tomcat是jakarta项目中的一个重要的子项目,其被JavaWorld杂志的编辑选为2001年度最具创新的java产品,同时它又是sun公司官方推荐的servlet和jsp容器,因此其越来越多的受到软件公司和开发人员的喜爱。servlet和jsp的最新规范都可以在tomcat的新版本中得到实现。其次,Tomcat是完全免费的软件,任何人都可以从互联网上自由地下载。Tomcat与Apache的组合相当完美。

二、Tomcat目录 
tomcat 
|---bin Tomcat:存放启动和关闭tomcat脚本; 
|---conf Tomcat:存放不同的配置文件(server.xml和web.xml); 
|---doc:存放Tomcat文档; 
|---lib/japser/common:存放Tomcat运行需要的库文件(JARS); 
|---logs:存放Tomcat执行时的LOG文件; 
|---src:存放Tomcat的源代码; 
|---webapps:Tomcat的主要Web发布目录(包括应用程序示例); 
|---work:存放jsp编译后产生的class文件;

三、Tomcat类加载 
Bootstrap($JAVA_HOME/jre/lib/ext/*.jar) 
System($CLASSPATH/*.class和指定的jar) 
Common($CATALINA_HOME/common 下的classes,lib,endores三个子目录) 
Catalina ($CATALINA_HOME/server/下的classes和lib目录仅对Tomcat可见) 
&Shared($CATALINA_HOME/shared/下的classes和lib目录以及$CATALINA_HOME/lib目录)仅对Web应用程序可见,对Tomcat不可见WebApp($WEBAPP/Web-INF/*仅对该WEB应用可见classes/*.class lib/*.jar)

加载类和资源的顺序为: 
1、/Web-INF/classes 
2、/Web-INF/lib/*.jar 
3、Bootstrap 
4、System 
5、$CATALINA_HOME/common/classes 
6、$CATALINA_HOME/common/endores/*.jar 
7、$CATALINA_HOME/common/lib/*.jar 
8、$CATALINA_HOME/shared/classes 
9、$CATALINA_HOME/shared/lib/*.jar

四、server.xml配置简介: 
下面讲述这个文件中的基本配置信息,更具体的配置信息请参考tomcat的文档: 
    server: 
          1、port 指定一个端口,这个端口负责监听关闭tomcat的请求 
          2、shutdown 指定向端口发送的命令字符串 
    service: 
          1、name 指定service的名字 
    Connector (表示客户端和service之间的连接): 
          1、port 指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求 
          2、minProcessors 服务器启动时创建的处理请求的线程数 
          3、maxProcessors 最大可以创建的处理请求的线程数 
          4、enableLookups 如果为true,则可以通过调用request.getRemoteHost()进行DNS查 
询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip 
地址 
          5、redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的 
端口号 
          6、acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理 
队列中的请求数,超过这个数的请求将不予处理 
          7、connectionTimeout 指定超时的时间数(以毫秒为单位) 
    Engine (表示指定service中的请求处理机,接收和处理来自Connector的请求): 
          1、defaultHost 指定缺省的处理请求的主机名,它至少与其中的一个host元素的name 
属性值是一样的 
    Context (表示一个web应用程序): 
          1、docBase 应用程序的路径或者是WAR文件存放的路径 
          2、path 表示此web应用程序的url的前缀,这样请求的url为 
http://localhost:8080/path/**** 
          3、reloadable 这个属性非常重要,如果为true,则tomcat会自动检测应用程序的 
/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可 
以在不重起tomcat的情况下改变应用程序 
    host (表示一个虚拟主机): 
          1、name 指定主机名 
          2、appBase 应用程序基本目录,即存放应用程序的目录 
          3、unpackWARs 如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接 
从WAR文件中运行应用程序 
    Logger (表示日志,调试和错误信息): 
          1、className 指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口 
          2、prefix 指定log文件的前缀 
          3、suffix 指定log文件的后缀 
          4、timestamp 如果为true,则log文件名中要加入时间,如下 
例:localhost_log.2001-10-04.txt 
   Realm (表示存放用户名,密码及role的数据库): 
          1、className 指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口 
   Valve (功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样): 
          1、className 指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve 
类可以记录应用程序的访问信息 
    directory(指定log文件存放的位置): 
    1、pattern 有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行 
请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记 
录的值更多

五、web.xml配置简介: 
1、默认(欢迎)文件的设置 
 在tomcat4/conf/web.xml中,<welcome-file-list>与IIS中的默认文件意思相同。 
 <welcome-file-list> 
 <welcome-file>index.html</welcome-file> 
 <welcome-file>index.htm</welcome-file> 
 <welcome-file>index.jsp</welcome-file> 
 </welcome-file-list>

2、报错文件的设置 
<error-page> 
<error-code>404</error-code> 
<location>/notFileFound.jsp</location> 
</error-page> 
<error-page> 
<exception-type>java.lang.NullPointerException</exception-type> 
<location>/null.jsp</location> 
</error-page> 
如果某文件资源没有找到,服务器要报404错误,按上述配置则会调用/webapps/ROOT/notFileFound.jsp。 
如果执行的某个JSP文件产生NullPointException ,则会调用/webapps/ROOT/null.jsp

3、会话超时的设置 
设置session 的过期时间,单位是分钟; 
<session-config> 
<session-timeout>30</session-timeout> 
</session-config>

4、过滤器的设置 
<filter> 
<filter-name>FilterSource</filter-name> 
<filter-class>project4. FilterSource </filter-class> 
</filter> 
<filter-mapping> 
<filter-name>FilterSource</filter-name> 
<url-pattern>/WwwServlet</url-pattern> 
(<url-pattern>/haha/*</url-pattern>) 
</filter-mapping>

过滤: 
1) 身份验证的过滤Authentication Filters 
2) 日志和审核的过滤Logging and Auditing Filters 
3) 图片转化的过滤Image conversion Filters 
4) 数据压缩的过滤Data compression Filters 
5) 加密过滤Encryption Filters 
6) Tokenizing Filters 
7) 资源访问事件触发的过滤Filters that trigger resource access events XSL/T 过滤XSL/T filters 
9) 内容类型的过滤Mime-type chain Filter 注意监听器的顺序,如:先安全过滤,然后资源, 
然后内容类型等,这个顺序可以自己定。

六、管理 
    1、用户配置 
      在进行具体Tomcat管理之前,先给tomcat添加一个用户,使这个用户有权限来进行管理。 
      打开conf目录下的tomcat-users.xml文件,在相应的位置添加下面一行: 
    <user name="user" password="user" roles="standard,manager"/> 
    然后重起tomcat,在浏览器中输入http://localhost:8080/manager/,会弹出对话框,输入上面的用户 
名和密码即可。

2、应用程序列表 
      在浏览器中输入http://localhost:8080/manager/list,浏览器将会显示如下的信息: 
    OK - Listed applications for virtual host localhost 
    /ex:running:1 
    /examples:running:1 
    /webdav:running:0 
    /tomcat-docs:running:0 
    /manager:running:0 
    /:running:0 
     上面显示的信息分别为:应用程序的路径、当前状态、连接这个程序的session数

3、重新装载应用程序 
      在浏览器中输入 http://localhost:8080/manager/reload?path=/examples,浏览器显示如下: 
    OK - Reloaded application at context path /examples    
这表示example应用程序装载成功,如果我们将server.xml的Context元素的reloadable属性设为true,则没必要利用这种方式重新装载应用程序,因为tomcat会自动装载。

4、显示session信息 
    在浏览器中输入http://localhost:8080/manager/sessions?path=/examples,浏览器显示如下: 
    OK - Session information for application at context path /examples Default maximum session inactive 
interval 30 minutes

5、启动和关闭应用程序 
   在浏览器中输入http://localhost:8080/manager/start?path=/examples和 
http://localhost:8080/manager/stop?path=/examples分别启动和关闭examples应用程序。

------------------------------------------

Tomcat的过滤器主要由Filter、FilterChain组成,FilterChain包含一个Filter数组.当Wrapper执行FilterChain的doFilter(request,response)方法时,FilterChain首先调用第一个Filter的doFilter(request,response,filterchain)方法,当第一个filter做完过滤操作后,它又会调用filterchain的doFilter方法,此时filterchain的当前filter已变为第二个filter,第二个filter又执行dofilter方法,依此类推,直至所有过滤器都执行完毕

Java代码 
1.public interface Filter {   
2.        .....          
3.        //执行过滤   
4.        public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;   
5.  
6.}   
7.  
8.public interface FilterChain {   
9.    public void doFilter ( ServletRequest request, ServletResponse response ) throws IOException, ServletException;   
10.}

2.实现例子

Java代码 
1.class ApplicationFilterChain implements FilterChain {   
2.      
3.   //pos为当前filter的所在位置,n为filters数组的长度   
4.   if (pos < n) {   
5.            //pos++执行后,把filterchain的当前filter指向下一个   
6.            ApplicationFilterConfig filterConfig = filters[pos++];   
7.            Filter filter = null;   
8.            try {   
9.                filter = filterConfig.getFilter();   
10.  
11.                //filter执行过滤操作   
12.                filter.doFilter(request, response, this);   
13.            }   
14.            ...   
15.   }   
16.}   
17.  
18.  
19.class SampleFilter implements Filter {   
20.      ........   
21.      public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)   
22.        throws IOException, ServletException {   
23.            
24.         //do something    
25.         .....   
26.         //request, response传递给下一个过滤器进行过滤   
27.         chain.doFilter(request, response);   
28.    }   
29.         
30.}

------------------------------------------------------

摘录,全部请参见

http://www.cnblogs.com/pcbird/archive/2007/07/09.html

6.声明过滤器

servlet版本2.3引入了过滤器的概念。虽然所有支持servlet API版本2.3的服务器都支持过滤器,但为了使用与过滤器有关的元素,必须在web.xml中使用版本2.3的DTD。
过滤器可截取和修改进入一个servlet或JSP页面的请求或从一个servlet或JSP页面发出的相应。在执行一个servlet或JSP页面之前,必须执行第一个相关的过滤器的doFilter方法。在该过滤器对其FilterChain对象调用doFilter时,执行链中的下一个过滤器。如果没有其他过滤器,servlet或JSP页面被执行。过滤器具有对到来的ServletRequest对象的全部访问权,因此,它们可以查看客户机名、查找到来的cookie等。为了访问servlet或JSP页面的输出,过滤器可将响应对象包裹在一个替身对象(stand-in object)中,比方说把输出累加到一个缓冲区。在调用FilterChain对象的doFilter方法之后,过滤器可检查缓冲区,如有必要,就对它进行修改,然后传送到客户机。
例如,程序清单5-11帝国难以了一个简单的过滤器,只要访问相关的servlet或JSP页面,它就截取请求并在标准输出上打印一个报告(开发过程中在桌面系统上运行时,大多数服务器都可以使用这个过滤器)。

程序清单5-11 ReportFilter.java
package moreservlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

/** Simple filter that prints a report on the standard output 
* whenever the associated servlet or JSP page is accessed.
* <P>
* Taken from More Servlets and JavaServer Pages
* from Prentice Hall and Sun Microsystems Press,
http://www.moreservlets.com/.
* © 2002 Marty Hall; may be freely used or adapted.
*/

public class ReportFilter implements Filter {
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest)request;
System.out.println(req.getRemoteHost() +
" tried to access " +
req.getRequestURL() +
" on " + new Date() + ".");
chain.doFilter(request,response);
}

public void init(FilterConfig config)
throws ServletException {
}

public void destroy() {}
}

一旦建立了一个过滤器,可以在web.xml中利用filter元素以及filter-name(任意名称)、file-class(完全限定的类名)和(可选的)init-params子元素声明它。请注意,元素在web.xml的web-app元素中出现的次序不是任意的;允许服务器(但不是必需的)强制所需的次序,并且实际中有些服务器也是这样做的。但这里要注意,所有filter元素必须出现在任意filter-mapping元素之前, filter-mapping元素又必须出现在所有servlet或servlet-mapping元素之前。
例如,给定上述的ReportFilter类,可在web.xml中作出下面的filter声明。它把名称Reporter与实际的类ReportFilter(位于moreservlets程序包中)相关联。
<filter>
<filter-name>Reporter</filter-name>
<filter-class>moresevlets.ReportFilter</filter-class>
</filter>
一旦命名了一个过滤器,可利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。关于此项工作有两种选择。
首先,可使用filter-name和servlet-name子元素把此过滤器与一个特定的servlet名(此servlet名必须稍后在相同的 web.xml文件中使用servlet元素声明)关联。例如,下面的程序片断指示系统只要利用一个定制的URL访问名为SomeServletName 的servlet或JSP页面,就运行名为Reporter的过滤器。
<filter-mapping>
<filter-name>Reporter</filter-name>
<servlet-name>SomeServletName</servlet-name>
</filter-mapping>
其次,可利用filter-name和url-pattern子元素将过滤器与一组servlet、JSP页面或静态内容相关联。例如,相面的程序片段指示系统只要访问Web应用中的任意URL,就运行名为Reporter的过滤器。
<filter-mapping>
<filter-name>Reporter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
例如,程序清单5-12给出了将ReportFilter过滤器与名为PageName的servlet相关联的web.xml文件的一部分。名字 PageName依次又与一个名为TestPage.jsp的JSP页面以及以模式http: //host/webAppPrefix/UrlTest2/ 开头的URL相关联。TestPage.jsp的源代码已经JSP页面命名的谈论在前面的3节"分配名称和定制的URL"中给出。事实上,程序清单5- 12中的servlet和servlet-name项从该节原封不动地拿过来的。给定这些web.xml项,可看到下面的标准输出形式的调试报告(换行是为了容易阅读)。
audit.irs.gov tried to access 
http://mycompany.com/deployDemo/UrlTest2/business/tax-plan.html
on Tue Dec 25 13:12:29 EDT 2001.

程序清单5-12 Web.xml(说明filter用法的摘录)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<filter>
<filter-name>Reporter</filter-name>
<filter-class>moresevlets.ReportFilter</filter-class>
</filter>
<!-- ... -->
<filter-mapping>
<filter-name>Reporter</filter-name>
<servlet-name>PageName</servlet-name>
</filter-mapping>
<!-- ... -->
<servlet>
<servlet-name>PageName</servlet-name>
<jsp-file>/RealPage.jsp</jsp-file>
</servlet>
<!-- ... -->
<servlet-mapping>
<servlet-name> PageName </servlet-name>
<url-pattern>/UrlTest2/*</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>

[转]Tomcat启动分析的更多相关文章

  1. Tomcat启动分析(转自:http://docs.huihoo.com/apache/tomcat/heavyz/01-startup.html)

    Tomcat启动分析 1 - Tomcat Server的组成部分 1.1 - Server A Server element represents the entire Catalina servl ...

  2. Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量)

    原文:http://www.cnblogs.com/heshan664754022/archive/2013/03/27/2984357.html Tomcat启动分析(我们为什么要配置CATALIN ...

  3. SpringBoot源码解析:tomcat启动分析

    >> spring与tomcat的启动分析:war包形式 tomcat:xml加载规范 1.contex-param: 初始化参数 2.listener-class: contextloa ...

  4. Tomcat启动分析(一)-从脚本到main函数分析

    当我们在Linux下启动tomcat的时候,通过ps查看其进程信息为,接下来的内容我们就以此进行分析: [tomcat@fdd ~]$ ps -ef |grep java tomcat : tty1 ...

  5. Tomcat启动分析

    [转自] http://docs.huihoo.com/apache/tomcat/heavyz/01-startup.html 1 - Tomcat Server的组成部分 1.1 - Server ...

  6. Tomcat启动分析(二)-自己编译Tomcat

    为了方便分析Tomcat源码,利用大家习惯的方式来进行Debug调试,那么如何将Tomcat源码导入到Eclipse呢,这就是本文的重点 1 准备 1.1 获取Tomcat源码 获取tomcat源码有 ...

  7. Tomcat启动分析(Tomcat7.0)

    1)bin目录下的bootstrap.jar中的main方法启动Tomcat org.apache.catalina.startup.Bootstrap类下的main方法 可以看到Bootstrap类 ...

  8. 启动Tomcat一闪而过——分析及解决过程

    启动Tomcat一闪而过--分析及解决过程 嗯,昨天将有关JDK的知识稍微整理了一下,现在稍微整理一下有关Tomcat的! 1:Tomcat是什么? Tomcat是当今世界上使用最为广泛的.开源免费的 ...

  9. Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析

    Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...

随机推荐

  1. Matlab中使用jython扩展功能

    Matlab中面向对象能力并不强,通过使用jython引擎能够对其功能扩展. 1 编辑classpath.txt增加jython.jar 在matlab中输入 which classpath.txt ...

  2. iOS 获取LaunchImage启动图

    iOS开发中,LaunchImage图片会根据手机机型的不同,自动匹配对应的图片,而我们如果想要拿到对应的图片,无法直接通过图片的名字获取该启动图,而需要通过以下方式 + (NSString *)ge ...

  3. C# 缓存技术

    缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 本章从缓存 ...

  4. 转:MSSQL SERVER行转列 列转行

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  5. mysql使用存储过程制造测试数据

    DELIMITER $$ DROP PROCEDURE IF EXISTS message_insert_procedure; CREATE PROCEDURE `test`.`message_ins ...

  6. PHP-Manual的学习----【语言参考】----【类型】-----【Boolean类型】

    2017年7月20日15:41:26Boolean 布尔类型 1.这是最简单的类型.boolean 表达了真值,可以为 TRUE 或 FALSE. 其实就是真假的问题.2.语法 要指定一个布尔值,使用 ...

  7. Android拍照生成缩略图

    在Android 2.2版本中,新增了一个ThumbnailUtils工具类来是实现缩略图,此工具类的功能是强大的,使用是简单,它提供了一个常量和三个方法.利用这些常数和方法,可以轻松快捷的实现图片和 ...

  8. HTTP/HLS/RTMP超级负载测试工具(转)

    这个负载测试工具是网游分享的工具,可以在http://blog.csdn.net/win_lin/article/details/11835011 或者https://github.com/winli ...

  9. Command 'java' not found during running appium

    Question: When Execution code:driver = new RemoteWebDriver(new Uri("http://127.0.0.1:4723/wd/hu ...

  10. Office 365系列(二) -一些比较容易混淆的概念

    上一篇比较简明地说了Office 365怎么注册使用,在继续探讨之前先讨论一些比较容易混淆的概念! 1. Office 365:  是微软云计划的一部分包括Exchange online, Lync ...