企業級應用TOMCAT

第1章 Tomcat

1.1 Tomcat簡介

Tomcat是一個免開放源代碼的Web應用服務器,屬於輕量級應用服務器,在中小型系統和併發訪問用戶很少的場合下被廣泛使用,是開發調試JSP程序的首選,另外它仍是Servlet和JSP容器,獨立的Servlet容器是Tomcat的默認模式php

其相似Nginx、Apache(httpd)、lighttpd等Web服務器html

nginx和http只能處理html等靜態文件(jpg),配合php就可以處理動態的網頁(以.php結尾);java

tomcat也可以處理靜態的html文件,配合hdk可以處理動態網頁(以.jsp結尾)mysql

但Tomcat處理靜態HTML的能力不如Nginx/Apachelinux

1.2 軟件版本選擇

JDK下載:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlnginx

Tomcat下載:http://tomcat.apache.org/git

說明:在生產環境下,使用Tomcat安裝版本需同開發協商,Tomcat和JDK版本需並行(tomcat8<=>jdk8)github

 

第2章 Tomcat安裝

2.1 安裝JDK(⭐之後全部涉及到java應用的都須要安裝)

JDK->JAVA虛擬機(jvm)->一處編譯,到處使用web

1 tar xf jdk-8u60-linux-x64.tar.gz -C /application/
2 ln -s /application/jdk1.8.0_60 /application/jdk   #其餘版本同理->只需修改版本號,安裝方法相同
3 
4 sed -i.ori '$a export JAVA_HOME=/application/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
5 
6 source /etc/profile
7 java -version

2.2 安裝Tomcat

1 tar xf apache-tomcat-8.0.27.tar.gz -C /application/
2 ln -s /application/apache-tomcat-8.0.27 /application/tomcat
3 echo 'export TOMCAT_HOME=/application/tomcat'>>/etc/profile
4 source /etc/profile
5 chown -R root.root /application/jdk/ /application/tomcat/

出現下述結果即表示部署成功算法

 1 [root@web03 ~]# /application/tomcat/bin/version.sh   #查看tomcat軟件有關信息
 2 Using CATALINA_BASE:   /application/tomcat
 3 Using CATALINA_HOME:   /application/tomcat
 4 Using CATALINA_TMPDIR: /application/tomcat/temp
 5 Using JRE_HOME:        /application/jdk
 6 Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
 7 Server version: Apache Tomcat/8.0.27
 8 Server built:   Sep 28 2015 08:17:25 UTC
 9 Server number:  8.0.27.0
10 OS Name:        Linux
11 OS Version:     3.10.0-693.el7.x86_64
12 Architecture:   amd64
13 JVM Version:    1.8.0_60-b27
14 JVM Vendor:     Oracle Corporation

2.2.1 Tomcat目錄結構

 1 [root@web03 tools]# cd  /application/tomcat/
 2 
 3 [root@web03 tomcat]# tree -L 1
 4 .
 5 ├── bin   #用以啓動/關閉Tomcat或者其它功能的腳
 6 │   ├── catalina.sh   #核心
 7 │   ├── shutdown.sh   #關閉tomcat服務
 8 │   ├── startup.sh   #啓動tomcat服務
 9 ├── conf   #用以配置Tomcat的XML文件
10 │   ├── server.xml   #主配置文件
11 │   ├── tomcat-users.xml   #管理用戶的配置文件
12 ├── lib 
13 ├── LICENSE
14 ├── logs   #Web應用程序的日誌文件
15 │   ├── catalina.out***
16 ├── NOTICE
17 ├── RELEASE-NOTES
18 ├── RUNNING.txt
19 ├── temp   #臨時目錄
20 ├── webapps   #Web網頁應用程序根目錄->站點目錄
21 └── work

2.2.2 webapps站點目錄

1 [root@web03 tomcat]# cd webapps/
2 [root@web03 webapps]# ll
3 total 20
4 drwxr-xr-x 14 root root 4096 Oct  5 12:09 docs         #tomcat幫助文檔
5 drwxr-xr-x  6 root root 4096 Oct  5 12:09 examples     #web應用實例
6 drwxr-xr-x  5 root root 4096 Oct  5 12:09 host-manager  #管理
7 drwxr-xr-x  5 root root 4096 Oct  5 12:09 manager      #管理
8 drwxr-xr-x  3 root root 4096 Oct  5 12:09 ROOT       #默認網站根目錄

2.3 啓動/關閉Tomcat

 1 /application/tomcat/bin/startup.sh 2 /application/tomcat/bin/shutdown.sh 

注意:未啓動時關閉會報一堆錯誤

1 [root@web03 ~]# netstat -lntup|grep java   #凡跟java有關的程序均需查看java端口
2 tcp6       0      0 :::8080                 :::*                    LISTEN      1464/java
3 tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1464/java
4 tcp6       0      0 :::8009                 :::*                    LISTEN      1464/java

2.3.1 訪問web網站測試

http://10.0.0.17:8080/   #tomcat默認端口8080

2.4 查看日誌信息

1 cd /application/tomcat/logs/
2 ll   # catalina.out->實時記錄tomcat的運行信息(文件愈來愈大須要定時清空>)
3 
4 [root@web03 logs]# tailf catalina.out   #查看日誌信息
5 24-Nov-2017 09:47:45.098 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 1296 ms

 

第3章 Tomcat在CentOS7啓動慢

3.1 現象

在CentOS7啓動Tomcat時,啓動過程很慢須要幾分鐘,通過查看日誌發現耗時在這裏:是session引發的隨機數問題致使的。Tocmat的Session ID是經過SHA1算法計算獲得的,計算Session ID的時候必須有一個密鑰,爲了提升安全性Tomcat在啓動的時候會經過隨機生成一個密鑰

3.1.1 實例

1 22-Apr-2017 19:33:07.623 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [55,507] milliseconds.
2 
3 22-Apr-2017 19:33:07.653 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /application/apache-tomcat-8.0.27/webapps/ROOT has finished in 55,935 ms

3.2 主要緣由

生成隨機數的時候卡住了,致使tomcat沒法啓動

爲了加速/dev/random提供隨機數的速度,你能夠經過操做設備的外設,讓其產生大量的中斷(如網絡傳輸數據,按鍵,移動鼠標,在命令行敲幾個不一樣的命令,俗稱聚氣)

cat /dev/random &>/dev/null會消耗能量

3.3 解決方法

方法01

 1 vim $JAVA_HOME/jre/lib/security/java.security 2 securerandom.source=file:/dev/urandom 

方法02

1 vim $TOMCAT_HOME/bin/catalina.sh
2 if [[ "$JAVA_OPTS" != *-Djava.security.egd=* ]]; then
3     JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/urandom"
4 fi

#這個系統屬性egd表示熵收集守護進程(entropy gathering daemon)

方法03(推薦)

 1 yum install -y rng-tools #安裝rngd服務(熵服務,增大熵池) 2 systemctl start rngd.service #此服務建議開機自啓 3 systemctl status rngd.service 

03.1設置開機自啓

 1 cat >>/etc/rc.d/rc.local<<EOF 2 systemctl start rngd.service 3 /application/tomcat/bin/startup.sh 4 EOF 

注意:在虛擬機內,AMD CPU不支持第三種方法

 

第4章 經過web管理Tomcat

測試功能,生產環境禁用!

4.1 定義web頁面用戶名及密碼

 1 sed -i.ori '$i <role rolename="manager-gui"/>\n<role rolename="admin-gui"/>\n<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>' /application/tomcat/conf/tomcat-users.xml 

1 [root@web03 ~]# tail -4 /application/tomcat/conf/tomcat-users.xml
2 <role rolename="manager-gui"/>
3 <role rolename="admin-gui"/>
4 <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
5 </tomcat-users>   #注意:是在此行前加入上面三行

4.2 重啓tomcat服務

 1 /application/tomcat/bin/shutdown.sh 2 /application/tomcat/bin/startup.sh 

4.3 Tomcat主配置文件/application/tomcat/conf/server.xml

語法

註釋:以<!--開頭,並以-->結尾,中間包含的都是註釋,即段註釋

4.3.1 server.xml組件類別

頂級組件:位於整個配置的頂層,如server

容器類組件:能夠包含其它組件的組件,如service、engine、host、context

鏈接器組件:鏈接用戶請求至tomcat,如connector

被嵌套類組件:位於一個容器當中,不能包含其餘組件,如Valve、logger

 1 <server>
 2      <service>
 3      <connector />
 4      <engine>
 5      <host>
 6      <context></context>
 7      </host>
 8      <host>
 9      <context></context>
10      </host>
11      </engine>
12      </service>
13 </server>

4.3.2 組件詳解

  • engine:核心容器組件,catalina引擎,負責經過connector接收用戶請求,並處理請求,將請求轉至對應的虛擬主機host。
  • host:相似於httpd中的虛擬主機,通常而言支持基於FQDN的虛擬主機。
  • context:定義一個應用程序,是一個最內層的容器類組件(不能再嵌套)。配置context的主要目的指定對應對的webapp的根目錄,相似於httpd的alias,其還能爲webapp指定額外的屬性,如部署方式等。
  • connector:接收用戶請求,相似於httpd的listen配置監聽端口的。
  • service(服務):將connector關聯至engine,所以一個service內部能夠有多個connector,但只能有一個引擎engine。service內部有兩個connector,一個engine。所以,通常狀況下一個server內部只有一個service,一個service內部只有一個engine,但一個service內部能夠有多個connector。
  • server:表示一個運行於JVM中的tomcat實例。
  • Valve:閥門,攔截請求並在將其轉至對應的webapp前進行某種處理操做,能夠用於任何容器中,好比記錄日誌(access log valve)、基於IP作訪問控制(remote address filter valve)。
  • logger:日誌記錄器,用於記錄組件內部的狀態信息,能夠用於除context外的任何容器中。
  • realm:能夠用於任意容器類的組件中,關聯一個用戶認證庫,實現認證和受權。能夠關聯的認證庫有兩種:UserDatabaseRealm、MemoryRealm和JDBCRealm。
  • UserDatabaseRealm:使用JNDI自定義的用戶認證庫。
  • MemoryRealm:認證信息定義在tomcat-users.xml中。
  • JDBCRealm:認證信息定義在數據庫中,並經過JDBC鏈接至數據庫中查找認證用戶。

4.3.3 配置文件詳述

 1 <?xml version='1.0' encoding='utf-8'?>
 2 <!--
 3 <Server>元素表明整個容器,是Tomcat實例的頂層元素.由org.apache.catalina.Server接口來定義.它包含一個<Service>元素.而且它不能作爲任何元素的子元素.
 4     port指定Tomcat監聽shutdown命令端口.終止服務器運行時,必須在Tomcat服務器所在的機器上發出shutdown命令.該屬性是必須的.
 5     shutdown指定終止Tomcat服務器運行時,發給Tomcat服務器的shutdown監聽端口的字符串.該屬性必須設置
 6 -->
 7 <Server port="8005" shutdown="SHUTDOWN">
 8   <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
 9   <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
10   <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
11   <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
12   <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
13   <GlobalNamingResources>
14     <Resource name="UserDatabase" auth="Container"
15               type="org.apache.catalina.UserDatabase"
16               description="User database that can be updated and saved"
17               factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
18               pathname="conf/tomcat-users.xml" />
19   </GlobalNamingResources>
20   <!--service服務組件-->
21   <Service name="Catalina">
22     <!--
23     connector:接收用戶請求,相似於httpd的listen配置監聽端口.
24         port指定服務器端要建立的端口號,並在這個端口監聽來自客戶端的請求。
25         address:指定鏈接器監聽的地址,默認爲全部地址(即0.0.0.026         protocol鏈接器使用的協議,支持HTTP和AJP。AJP(Apache Jserv Protocol)專用於tomcat與apache創建通訊的, 在httpd反向代理用戶請求至tomcat時使用(可見Nginx反向代理時不可用AJP協議)。
27         minProcessors服務器啓動時建立的處理請求的線程數
28         maxProcessors最大能夠建立的處理請求的線程數
29         enableLookups若是爲true,則能夠經過調用request.getRemoteHost()進行DNS查詢來獲得遠程客戶端的實際主機名,若爲false則不進行DNS查詢,而是返回其ip地址
30         redirectPort指定服務器正在處理http請求時收到了一個SSL傳輸請求後重定向的端口號
31         acceptCount指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理
32         connectionTimeout指定超時的時間數(以毫秒爲單位)
33     -->
34     <Connector port="8080" protocol="HTTP/1.1"
35                connectionTimeout="20000"
36                redirectPort="8443" />
37     <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
38     <!--engine,核心容器組件,catalina引擎,負責經過connector接收用戶請求,並處理請求,將請求轉至對應的虛擬主機host
39         defaultHost指定缺省的處理請求的主機名,它至少與其中的一個host元素的name屬性值是同樣的
40     -->
41     <Engine name="Catalina" defaultHost="localhost">
42       <!--Realm表示存放用戶名,密碼及role的數據庫-->
43       <Realm className="org.apache.catalina.realm.LockOutRealm">
44         <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
45                resourceName="UserDatabase"/>
46       </Realm>
47       <!--
48       host表示一個虛擬主機
49         name指定主機名
50         appBase應用程序基本目錄,即存放應用程序的目錄.通常爲appBase="webapps" ,相對於CATALINA_HOME而言的,也能夠寫絕對路徑。
51         unpackWARs若是爲true,則tomcat會自動將WAR文件解壓,不然不解壓,直接從WAR文件中運行應用程序
52         autoDeploy:在tomcat啓動時,是否自動部署。
53         xmlValidation:是否啓動xml的校驗功能,通常xmlValidation="false"54         xmlNamespaceAware:檢測名稱空間,通常xmlNamespaceAware="false"55       -->
56       <Host name="localhost"  appBase="webapps"
57             unpackWARs="true" autoDeploy="true">
58         <!--
59         Context表示一個web應用程序,一般爲WAR文件
60             docBase應用程序的路徑或者是WAR文件存放的路徑,也可使用相對路徑,起始路徑爲此Context所屬Host中appBase定義的路徑。
61             path表示此web應用程序的url的前綴,這樣請求的url爲http://localhost:8080/path/****
62             reloadable這個屬性很是重要,若是爲true,則tomcat會自動檢測應用程序的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應用程序,能夠在不重啓tomcat的狀況下改變應用程序
63         -->
64         <Context path="" docBase="" debug=""/>
65         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
66                prefix="localhost_access_log" suffix=".txt"
67                pattern="%h %l %u %t &quot;%r&quot; %s %b" />
68       </Host>
69     </Engine>
70   </Service>
71 </Server>

4.3.2.1  關於8005端口的註釋

 <Server port="8005" shutdown="SHUTDOWN"> 

提示:echo SHUTDOWN|nc 127.0.0.1 8005  #直接關閉全部tomcat相關軟件

注意:現版本上本機的任意用戶都可操做,但老版本tomcat只要鏈接本機便可發消息->危險

且不建議註釋此功能,會影響系統操做並致使全部shutdown命令沒法使用,只能使用kill/pkill關閉

建議方法爲:修改端口號8005爲其餘任意隨機端口,暗號亦可隨機修改==>增長安全性(視狀況而定)

4.4 WEB站點部署(代碼上線)

代碼上線有兩種方式

方法一:即直接將程序目錄放在webapps目錄下;

方法二:即用開發工具將程序打包成war包,而後上傳到webapps目錄下

4.4.1 使用war包部署web站點

 1 [root@web03 ~]# cd /application/tomcat/webapps/ 2 rz #上傳memtest.war 3 [root@web03 webapps]# ll 

瀏覽器訪問http://10.0.0.17:8080/memtest/meminfo.jsp便可

4.4.2 自定義默認網站目錄

 前地址http://10.0.0.17:8080/memtest/meminfo.jsp 現地址http://10.0.0.17:8080/meminfo.jsp 

方法1.將jsp文件或其餘程序放在tomcat/webapps/ROOT目錄下便可。由於默認網站根目錄爲tomcat/webapps/ROOT

方法2.修改主配置文件

1 cp /application/tomcat/conf/server.xml{,.ori}
2 
3 vim /application/tomcat/conf/server.xml +125
4 <Context path="" docBase="/application/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/>
5 <Context path="/40team" docBase="/application/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/>

重啓服務

 1 /application/tomcat/bin/shutdown.sh 2 /application/tomcat/bin/startup.sh 

測試

http://10.0.0.17:8080/meminfo.jsp

http://10.0.0.17:8080/40team/meminfo.jsp

 

4.5 搭建Jpress->java版本的wordpress

4.5.1 準備環境

jpress官網:http://jpress.io

下載地址:https://github.com/JpressProjects/jpres

4.5.2 安裝配置數據庫

 1 yum -y install mariadb-server 2 systemctl start mariadb.service 

1 mysql
2 create database jpress DEFAULT CHARACTER SET utf8;
3 grant all on jpress.* to jpress@'localhost' identified by '123456';
4 exit

4.5.3 jpress站點上線

 1 cd /application/tomcat/webapps 2 上傳jpress-web-newest.war 

4.5.4 web界面操做

http://10.0.0.17:8080/jpress-web-newest/

http://10.0.0.17:8080/jpress-web-newest/admin   #後臺

4.5.5 重啓服務

 1 /application/tomcat/bin/shutdown.sh 2 /application/tomcat/bin/startup.sh 

 

 

第5章 Tomcat多實例及反向代理

5.1 多實例部署

多虛擬主機:nginx,多個server標籤(域名,ip,端口) 進程數量固定master+worker

多實例(多進程):tomcat,同一個進程啓動屢次,分爲兩種狀況

注意:tomcat會盡量使用咱們的系統資源但會形成資源侵佔(適用於資源多的狀況)

5.1.1 複製Tomcat目錄

1 cd /application/tools/
2 tar xf apache-tomcat-8.0.27.tar.gz
3 
4 cp -a apache-tomcat-8.0.27 tomcat8_1
5 cp -a apache-tomcat-8.0.27 tomcat8_2   #視系統資源而定

5.1.2 修改配置文件

1 sed -i 's#8005#8011#;s#8080#8081#' tomcat8_1/conf/server.xml
2 sed -i 's#8005#8012#;s#8080#8082#' tomcat8_2/conf/server.xml

5.1.3 修改存放目錄並啓動

1 cp -a tomcat8_1 tomcat8_2 /application/
2 for i in {1..2};do /application/tomcat8_$i/bin/startup.sh;done
3 netstat -lntup |grep java

5.1.4 web網頁測試

http://10.0.0.17:8081/

http://10.0.0.17:8082/

5.2 反向代理服務配置

說明:在配置反向代理時,無需在乎後端是什麼服務,只需支持HTTP協議且知道其IP地址便可

5.2.1 lb01服務器端配置(centos6) 

 1 mv /application/nginx/conf/nginx.conf{,.ori} 2 egrep -v '#|^$' /application/nginx/conf/nginx.conf.default >/application/nginx/conf/nginx.conf 

5.2.2 修改nginx的配置文件

 1 [root@lb01 ~]# vim /application/nginx/conf/nginx.conf
 2 worker_processes  1;
 3 events {
 4     worker_connections  1024;
 5 }
 6 http {
 7     include       mime.types;
 8     default_type  application/octet-stream;
 9     sendfile        on;
10     keepalive_timeout  65;
11  upstream web_pools {
12         server 10.0.0.17:8081;
13         server 10.0.0.17:8082;
14     }
15     server {
16         listen       80;
17         server_name  localhost;
18         location / {
19              root   html;
20              index  index.jsp index.html index.htm;
21              proxy_pass http://web_pools;
22         }
23         error_page   500 502 503 504  /50x.html;
24         location = /50x.html {
25             root   html;
26         }
27     }
28 }

5.2.3 重啓nginx服務並測試

 1 /application/nginx/sbin/nginx -s stop 2 /application/nginx/sbin/nginx 

1 [root@lb01 ~]# curl -s 10.0.0.5|tail -1
2 8081
3 [root@lb01 ~]# curl -s 10.0.0.5|tail -1
4 8082

 

第6章 Tomcat監控

6.1 tomcat遠程監控

6.1.1  修改配置文件

1 vim /application/tomcat8_1/bin/catalina.sh +97
2 
3 CATALINA_OPTS="$CATALINA OPTS   #置於全部執行程序以前
4 -Dcom.sun.management.jmxremote        #開啓遠程監控命令的參數
5 -Dcom.sun.management.jmxremote.port=12345        #指定端口號爲12345
6 -Dcom.sun.management.jmxremote.authenticate=false   #指定認證方式即無需認證
7 -Dcom.sun.management.jmxremote.ssl=false          #無需加密鏈接
8 -Djava.rmi.server.hostname=10.0.0.17"               #配置本機主機IP

6.1.2  解析主機名(必須步驟,不然報錯)

 1 echo "10.0.0.17 web03" >>/etc/hosts 

6.1.3  重啓服務

 1 /application/tomcat8_1/bin/shutdown.sh 2 /application/tomcat8_1/bin/startup.sh 

6.2 zabbix監控tomcat(前提:java可以被遠程監控)

6.2.1 安裝zabbix-java-gateway(java程序),也須要jdk(openjdk)

 1 yum install -y zabbix-java-gateway 

注意:zabbix server默認未開啓java監控功能,因爲監控tomcat非必須的,故需另配server開啓功能

6.2.2 配置zabbix server(m01端)

1 sed -i -e '220a JavaGateway=127.0.0.1' -e '236a StartJavaPollers=5' /etc/zabbix/zabbix_server.conf
2 egrep -n '^J|^St' /etc/zabbix/zabbix_server.conf

6.2.3 啓動全部服務

 1 systemctl start zabbix-java-gateway.service 2 systemctl restart zabbix-server.service 

6.2.4 web界面監控

01.添加新主機

 

02.關聯模板

 

03.驗證結果

變綠即爲配置正確

6.3排除tomcat故障步驟

a. 查看catalina.out

b. 使用sh show-busy-java-threads.sh腳本進行檢測

 

第七章 Tomcat性能優化

tomcat性能取決於 內存大小

上策:優化代碼

中策:jvm優化機制 垃圾回收機制 把不須要的內存回收

          優化jvm--優化垃圾回收策略

優化catalina.sh配置文件,在catalina.sh配置文件中添加如下代碼

1 JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms800m -Xmx800m -XX:NewSize=400m -XX:MaxNewSize=400m -XX:PermSize=400m -XX:MaxPermSize=400m"   #tomcat分配1G內存模板
2 
3 su -c '/home/tomcat/tomcat8_1/bin/shutdown.sh' tomcat   #重啓服務
4 su -c '/home/tomcat/tomcat8_1/bin/startup.sh' tomcat

下策:加足夠大的內存

下下策:天天0點定時重啓tomcat

 

此筆記是本人學習摘記整理而成,此爲初稿(尚有諸多不完善之處),原創做品容許轉載,轉載時請務必以超連接形式標明文章原始出處,做者信息和本聲明,不然將追究法律責任。http://www.cnblogs.com/bananaaa/

相關文章
相關標籤/搜索