tomcat簡單操作

Tomcat是由Apache軟件基金會下屬的Jakarta項目開發的一個servelet容器,按照Sun microsystems提供的技術
規範開發出來,Tomcat 8實現了對servlet 3.1和Javaserver page 2.3(JSP)的支持,並提供了作爲web服務器的
一些特有功能,如Tomcat管理和控制平臺、安全域管理和Tomcat附加組件等

  1. 安裝jdk和apache
    tomcat簡單操作

  2. 修改/etc/profile 末尾追加
    export JAVA_H0ME=/usr/local/jdk1.8.0_211
    export JRE_HOME=/usr/local/jdk1.8.0_211
    export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_H0ME/lib/dt.jar
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
    刷新一下 source /etc/profile
    查看一下 java -version
    tomcat簡單操作
  3. 啓動一下tomcat
    tomcat簡單操作
    4.查看一下端口
    tomcat簡單操作
  4. 測試一下

tomcat簡單操作
多實例(一個主機運行多個Tomcat)

  1. 複製一個tomcat配置文件
    cp -r /usr/local/tomcat /usr/local/tomcat2
  2. 修改/usr/local/tomcat2/conf/server.xml (把各個端口號加一)
    tomcat簡單操作
  3. 啓動tomcat2
    tomcat簡單操作
  4. 測試
    tomcat簡單操作

查看
JPS命令功能描述:jps是用於查有權限訪問的hotspot虛擬機(jdk中帶的虛擬機)的進程
命令語法: jps [options] [hostid]
options:命令選項,用來對輸出格式進行控制
-p 僅僅顯示vm標識,不顯示jar,class,main參數等信息
-m 輸出主函數傳入的參數
-l 輸出應用程序主類完整package名稱或jar完整名稱
-v 列出jvm參數,-Xms20m -Xmx50m是啓動程序指定的jvm參數與
-V 輸出通過.hotsportrc或者-XX:Flags=<filename>指定的jvm參數
hostid:指定特定主機,可以使IP地址或域名,也可以指定具體協議,端口 [protocol:][//hostname][:port]
[servername]

配置
目錄結構
程序目錄
tomcat簡單操作
——Tomcat執行腳本目錄 conf ——Tomcat配置文件 lib ——Tomcat運行需要的庫文件(JARS) logs ——
Tomcat執行時的LOG文件 temp ——Tomcat臨時文件存放目錄 webapps ——Tomcat的主要Web發佈目錄(存
放我們自己的JSP,SERVLET,類) work ——Tomcat的工作目錄,Tomcat將翻譯JSP文件到的Java文件和class文件
放在這裏
tomcat簡單操作
web工程發佈目錄結構 webapps是
Tomcat的主要Web發佈目錄,默認情況下把Web應用文件放於此目錄 項目名: 項目名下面有WEB-INF ,
META-INF,兩個文件夾,和一些給瀏覽器訪問的資源,如html文件;
WEB-INF:可以稱爲是安全目錄,因爲在這下面的文件,瀏覽器是訪問不到的,

  1. web.xml:Web應用程序配置文件,描述了 servlet 和其他的應用組件配置及命名規則。
  2. classes:包含所需要的 class 文件,包括 servlet class 和其他的一些class,他們不能包含在 .jar文件中。
  3. lib:存放web應用需要的各種JAR文件
    META-INF:用來配置應用程序、擴展程序、類加載器和服務

默認webapps目錄結構
docs:Tomcat幫助文檔 examples:web應用實例 host-manager:主機管理 manager:應用管理 ROOT:默認站點根
目錄
配置文件
conf目錄主要是用來存放tomcat的一些配置文件。
server.xml 主配置文件 web.xml 與其他適用於整個web應用程序設置的配置文件 context.xml 默認的context設
置,應用於安裝了Tomcat的所有主機的所有部署內容 tomcat-users.xml用來配置管理tomcat的用戶與權限
catalina.xml Tomcat的安全防護策略文件
組件

  1. Server提供一個接口,由1至多個Service組成,讓其它程序可以訪問到這個Service集合,同時維護各個
    Service的生命週期,包括如何初始化,如何結束服務,如何找到別人請求的服務。
  2. Service又由1-n個Connector及單個Container組成,只是在Container和Connector外多包了一層,提供各種
    服務
  3. Connector組件是可選擇替換的,負責接收瀏覽器發過來的TCP連接請求,創建Request/Response,分配線
    程,將創建的對象傳遞給Container來處理請求
  4. Container是容器的父接口,由四個容器組成,分別是Engine,Host,Context,Wrapper。其中Engine包
    含Host,Host包含Context,Content包含Wrapper,一個Servlet class對應一個Wrapper
  5. Engine容器是作爲頂級Container組件來設計的,由Host組成,其作用相當於一個Container的門面。有了
    Engine,請求的處理過程變爲:瀏覽器發出請求,Connector接受請求,將請求交由Container(這裏是
    Engine)處理,Container(Engine來擔當)查找請求對應的Host並將請求傳遞給它,Host拿到請求後查
    找相應的應用上下文環境,準備 servlet環境並調用service方法。
  6. Host容器是Engine的子容器,一個Host在Engine中代表一個虛擬主機,這個主機可以運行多個應用,他
    負責安裝和展開這些應用,並且標識這個應用,以便能夠區分他們。它的子容器通常是Context,他除了
    關聯子容器外,還保存一個主機應有的信息。Host不是必需的,但是要運行 war程序,就必須要使用
    Host,因爲在war中必有web.xml文件,這個文件解析就需要Host,如果有多個Host就需要定義一個top
    容器 Engine,而Engine沒有父容器,一個Engine就代表一個完整的Servlet引擎
  7. Context代表Servlet的Context,它具備Servlet運行的基本環境,理論上只要有Context就能運行Servlet,
    簡單的Tomcat可以沒有Engine和Host。其最重要的功能就是管理Servlet實例,Servlet實例在Context中是
    以Wrapper 出現的。
  8. Wrapper代表一個Servlet,它負責管理Servlet,包括裝載,初始化,執行以及資源回收。它是最底層的
    容器。
  9. valve 閥門,攔截請求並在將其轉至對應的webapp前進行某種處理操作,可以用於任何容器中,比如記
    錄日誌、基於ip做訪問控制
    配置文件解讀
    <?xml version="1.0" encoding="UTF-8"?>
    <Server port="8005" shutdown="SHUTDOWN">
    <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
    <Listener className="org.apache.catalina.core.AprLifecycleListener"
    SSLEngine="on" />
    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"
    />
    <Listener
    className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"
    />
    <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
    type="org.apache.catalina.UserDatabase"
    description="User database that can be updated and saved"
    factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
    pathname="conf/tomcat-users.xml" />
    </GlobalNamingResources>
    <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
    <Realm className="org.apache.catalina.realm.LockOutRealm">
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
    resourceName="UserDatabase"/>
    </Realm>
    <Host name="localhost" appBase="webapps"
    unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.AccessLogValve"
    directory="logs"
    prefix="localhost_access_log" suffix=".txt"
    pattern="%h %l %u %t "%r" %s %b" />
    </Host>
    </Engine>
    </Service>
    </Server>
    engine是核心組件,負責通過connector接收用戶請求,並處理請求,將請求轉發至對應的虛擬主機host上,
    defaulthost指定缺省的處理請求的主機名,它至少與其中呢一個host元素的name屬性值是一樣的 realm表示存
    放用戶名、密碼及role的數據庫
    tomcat簡單操作
    Tomcat Server處理一個http請求的過程 假設來自客戶的請求爲: http://localhost:8080/wsota/wsota_index.jsp
    請求被髮送到本機端口8080,被在那裏偵聽的Coyote HTTP/1.1 Connector獲得 Connector把該請求交給它所在
    的Service的Engine來處理,並等待來自Engine的迴應 Engine獲得請求localhost/wsota/wsota_index.jsp,匹配它
    所擁有的所有虛擬主機Host Engine匹配到名爲localhost的Host(即使匹配不到也把請求交給該Host處理,因爲
    該Host被定義爲該Engine的默認主機) localhost Host獲得請求/wsota/wsota_index.jsp,匹配它所擁有的所有
    Context Host匹配到路徑爲/wsota的Context(如果匹配不到就把該請求交給路徑名爲""的Context去處理)
    path="/wsota"的Context獲得請求/wsota_index.jsp,在它的mapping table中尋找對應的servlet Context匹配到
    URL PATTERN爲*.jsp的servlet,對應於JspServlet類 構造HttpServletRequest對象和HttpServletResponse對象,
    作爲參數調用JspServlet的doGet或doPost方法 Context把執行完了之後的HttpServletResponse對象返回給Host
    Host把HttpServletResponse對象返回給Engine Engine把HttpServletResponse對象返回給Connector Connector
    把HttpServletResponse對象返回給客戶browser
    tomcat簡單操作

自定義目錄
修改server.xml文件中的host元素 #appBase 定義站點目錄 #docBase 定義應用目錄 #Context path 指出你的訪
問路徑(虛擬應用名,可爲空) #Context docBase 指定你的存放路徑 #debug 爲設定dedug的登記,0提供最
少的信息,9提供最多的信息 #reloadable=true 當web.xml或者class有改動的是後續都會自動更新加載,不需要
從新啓動服務 #crosscontext="true" 表示配置的不同context共享一個session #unpackWARs 是否自動解壓war
包 #autoDeploy 是否自動部署(熱部署)
tomcat簡單操作
appBase 這個目錄表示: 這個目錄下面的子目錄將自動被部署爲應用(autoDeploy="true") 這個目錄下的war
文件將被自動解壓縮並部署爲應用(unpackWARs="true") 這個目錄下的子目錄,會當做單獨的虛擬目錄,或
者叫應用 如果不想使用Tomcat下的webapp目錄路,則appBase下面加一行docBase,把路徑配置到docBase
中,把appBase爲空就可以了

自定義目錄

  1. 修改/usr/local/tomcat/conf/server.xml
    tomcat簡單操作
  2. 創建所需目錄和網頁
    [root@bogon ~]# mkdir -p /data/project
    [root@bogon ~]# vim /data/project/index1.jsp
    [root@bogon ~]# vim /data/project/index2.jsp
  3. 修改112 /usr/local/tomcat/conf/web.xml

tomcat簡單操作

  1. 重啓tomcat
    tomcat簡單操作
  2. 查看端口
    tomcat簡單操作
  3. 測試
    tomcat簡單操作

自定義一個監控頁面,通過web查看運行性能(類似phpinfo) server.xml如下設置

  1. 修改/usr/local/tomcat/conf/web.xml
    tomcat簡單操作
  2. 創建所需目錄和網頁
    tomcat簡單操作
    <%
    Runtime rtm = Runtime.getRuntime();
    long mm = rtm.maxMemory()/1024/1024;
    long tm = rtm.totalMemory()/1024/1024;
    long fm = rtm.freeMemory()/1024/1024;
    out.println("JVM memory detail info :<br>");
    out.println("Max memory:"+mm+"MB"+"<br>");
    out.println("Total memory: "+tm+"MB"+"<br>");
    out.println("Free memory: "+fm+"MB"+"<br>");
    out.println("Available memmory can be used is :"+(mm+fm-tm)+"MB"+"<br>");
    %>
  3. 重啓tomcat
    tomcat簡單操作
  4. 查看端口
    tomcat簡單操作
  5. 測試

tomcat簡單操作

遠程監控
Tomcat開啓JMX遠程調試功能

  1. 修改/usr/local/tomcat/bin/catalina.sh
    tomcat簡單操作
  2. 配置認證,配置jmxremote.access和jmxremote.password 進入默認按照jdk的目錄
    tomcat簡單操作
    修改/usr/local/jdk1.8.0_211/jre/lib/management/jmxremote.password
    tomcat簡單操作
    修改/usr/local/jdk1.8.0_211/jre/lib/management/jmxremote. Access
    tomcat簡單操作
  3. 限制口令文件讀取權限
    chmod 600 jmxremote.password jmxremote.access
  4. 重啓tomcat
    tomcat簡單操作
  5. 查看端口
    tomcat簡單操作
    6.測試

    tomcat簡單操作

    tomcat簡單操作
    tomcat簡單操作
    tomcat簡單操作

後臺
app manager
做這個的時候要把catalina.sh裏邊寫入的東西刪除掉,否則Tomcat無法訪問到頁面

  1. 修改 修改/usr/local/tomcat/conf/tomcat-users.xml文件,配置manager角色、用戶名及密碼
    tomcat簡單操作
    tomcat簡單操作
  2. 修改/usr/local/tomcat/webapps/manager/META-INF/context.xml 20
    tomcat簡單操作
  3. 重啓tomcat
    tomcat簡單操作
  4. 查看端口
    tomcat簡單操作

  5. 測試
    tomcat簡單操作
    tomcat簡單操作

  6. 創建測試網頁
    tomcat簡單操作
  7. 打包網頁
    jar -cvf bdqn.war index.jsp
  8. 測試
    (1)
    tomcat簡單操作
    tomcat簡單操作
    tomcat簡單操作
    (2)
    tomcat簡單操作

    tomcat簡單操作
    tomcat簡單操作
    tomcat簡單操作

  9. 查看 /usr/local/tomcat/webapps/有沒有test

tomcat簡單操作

熱部署
tomcat的熱部署實現原理:tomcat啓動的時候會有啓動一個線程每隔一段時間會去判斷應用中加載的類是否發生
變法(類總數的變化,類的修改),如果發生了變化就會把應用的啓動線程停止掉,清除引用,並且把加載該應
10-Tomcat.md 5/12/2019
18 / 23
用的WebappClassLoader設爲null,然後創建一個新的WebappClassLoader來重新加載應用。
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
reloadable的作用是當你修改了jsp之後會自動編譯class文件,等於即時生效,但是代價不低,適合本地
開發調試,一般在開發階段將reloadable的屬性設置爲true,有助於調試servlet和其他的class文件,但是
由於這樣會增加服務器的運行負載,損耗系統性能,在項目運行階段將它設置爲false
war包部署
直接將web項目文件(一般是複製生成的war包)複製到Tomcat的webapps目錄
如果Tomcat沒有開啓自解壓,則將war包解壓到webapps目錄
解壓命令jar(解壓到當前目錄) jar -xf bdqnweb.war war包也可以使用unzip解壓,使用unzip命令的時候,可
以指定解壓目錄
安全
端口防護
修改目標端口爲不易猜測的端口,降低自動掃描軟件發現到的機率
後臺管理
刪除默認的管理後臺(如果不需要使用),降低被爆破和提權的風險
刪除webapp下的host-manager和manager目錄
禁用目錄瀏覽
修改 conf/web.xml文件,將listings改爲false
隱藏信息
儘量避免暴露服務器的版本信息,隱藏錯誤頁面。在配置中對一些常見的錯誤進行重定向,避免出現錯誤時
Tomcat默認顯示的錯誤頁面暴露服務器和版本信息;必須確保程序根目錄下的錯誤頁面已經存在;
vim conf/web.xml
添加內容
<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>
重啓Tomcat,測試一下
firefox 192.168.43.249:8088/aaaaaaaaaaaaaaa

注意:這裏的意思是說,如果是404的錯誤就找/目錄下的notfound.jsp,所以一定要知道自己的網頁根目錄在哪,並在這個目錄下創建notfound.jsp頁面,頁面內容自己編輯 網頁根目錄是server.xml文件中 host 標籤下的context標籤裏的docBase

tomcat簡單操作

tomcat簡單操作上邊web.xml中只寫了404報錯的,其他常見報錯也可以寫,比如
<error-page>
<error-code>403</error-code>
<location>/forbidden.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/systembusy.jsp</location>
</error-page>

腳本權限收回
去除其他用戶對Tomcat的bin目錄下的 shutdown.sh、startup.sh、catalina.sh的可執行權限,防止其他用戶有
Tomcat的權限 chmod -R 744 /usr/local/apache-tomcat-8.5.35/bin/
日誌規範
開啓Tomcat默認訪問日誌中的referer和user-agent記錄,開啓這兩個是爲了一旦出現安全問題,能夠更好的根
據日誌進行問題排查
[root@localhost apache-tomcat-8.5.35]# vim conf/server.xml
原來是這樣:
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
10-Tomcat.md 5/12/2019
20 / 23
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
修改後的樣子:
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i %D" />

主機管理器的使用 (末尾添加)

  1. 修改/usr/local/tomcat/conf/tomcat-users.xml
    tomcat簡單操作

<role rolename="admin-gui"/>
<user username="xgp" password="123.com" roles="admin-gui"/>

  1. 修改/usr/local/tomcat/webapps/host-manager/META-INF/context.xml
    tomcat簡單操作
  2. 重啓tomcat
    tomcat簡單操作
  3. 查看端口
    tomcat簡單操作
  4. 瀏覽器測試

    tomcat簡單操作
    tomcat簡單操作
    日誌切割使用cronolog

  5. 編譯安裝Cronolog
    tomcat簡單操作
  6. 修改/usr/local/tomcat/bin/catalina.sh
    448 加註釋
    tomcat簡單操作
    找到第二個org.apache.catalina.starup.Bootstrap修改 472
    tomcat簡單操作
  7. 重啓tomcat
    tomcat簡單操作

  8. 查看端口
    tomcat簡單操作
  9. 測試
    tomcat簡單操作

定義錯誤頁面

  1. 修改/usr/local/tomcat/conf/web.xml 23
    tomcat簡單操作
  2. 創建所需網頁
    vim /usr/local/tomcat/webapps/ROOT/error.jsp
    tomcat簡單操作
  3. 重啓tomcat
    tomcat簡單操作
  4. 查看端口
    tomcat簡單操作
  5. 測試
    tomcat簡單操作

線程池優化

  1. 修改/usr/local/tomcat/conf/server.xml 56
    tomcat簡單操作
    修改 69
    tomcat簡單操作

2.重啓tomcat
tomcat簡單操作

  1. 查看端口
    tomcat簡單操作

Tomcat優化
1 /usr/local/tomcat/bin/catalina.sh 開頭添加
tomcat簡單操作

JAVA_OPTS="-Dfile.encoding=UTF-8
-server
-Xms1024M
-Xmx1024M
-XX:NewSize=512M
-XX:MaxNewSize=1024M
-XX:PermSize=256M
-XX:MaxPermSize=356M
-XX:NewRatio=2
-XX:ParallelGCThreads=15
-XX:+DisableExplicitGC"
-Xms:表示 JVM初始內存大小,也可以說是Java 初始化堆的大小,-Xms 與-Xmx 設成一樣的值,避免 JVM 反覆重新申請內存,導致性能大起大落,默認值爲物理內存的 1/64
-Xmx:表示最大 Java 堆大小,當應用程序需要的內存超出堆的最大值時虛擬機就會提示內存溢出,並且導致應用服務崩潰,因此一般建議堆的最大值設置爲可用內存的最大值的80%。
-Xmn:設置JVM最小內存(128-256就夠了,一般不設置)
-XX:NewSize:設置新生代內存大小。 新生代,對象新創建的時候分配的內存空間,老生代在垃圾回收器回收過後該對象依然沒有被回收,該對象就會移動到老生代
-XX:PermSize:設置持久代內存大小,用於存放靜態文件,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應
用可能動態生成或者調用一些class,持久帶也稱爲方法區,方法區存儲每一個java類的結構信息:比如運行時常量池,字段和方法數據,構造函數和普通方法的字節碼內容以及類、實例、接口初始化時需要使用到的特殊方法等數據,JDK8中已經把持久代(PermGen Space) 幹掉了,取而代之的元空間(Metaspace)。Metaspace佔用的是本地內存,不再佔用虛擬機內存。
-XX:MaxPermSize:設置最大值持久代內存大小,永久代不屬於堆內存,堆內存只包含新生代和老年代
-XX:NewRatio:改變新舊空間的比例,意思是新空間的尺寸是舊空間的1/8(默認爲8)
-XX:ParallelGCThreads 可用來增加並行度,需要多cpu
-XX:+DisableExplicitGC:關閉System.gc(),簡單理解就是關閉java中的內存回收機制

2.重啓tomcat
tomcat簡單操作

  1. 查看端口
    tomcat簡單操作
  2. 測試
    tomcat簡單操作

Tomcat的請求方式
Tomcat支持三種接收請求的方式:BIO NIO APR
1、BIO:每個請求都要創建一個線程來處理,線程開銷比較大,不適用高併發的場景,性能也最低
2、NIO:基於緩衝區,能提供非阻塞I/O操作,和傳統的BIO相比,具備更好的併發性能
3、APR(Apache portable run-time libraries):簡單理解,就是從操作系統級別解決異步IO問題,大幅度的提高服務器的處理和相應性能,也是Tomcat運行高併發的首選模式
APR提供的主要功能模塊包括:內存分配及內存池、原子操作、文件I/O、鎖、內存映射、哈希表、網絡I/O、輪詢、進程及線程操作等等,通過採用APR,Tomcat可以獲得高度可擴展性以及優越的性能,並且可以更好的與本地服務器技術集成,從而可以使Tomcat作爲一款通用的Web服務器使用,而不僅僅作爲輕量級應用服務器。在這種情況下,Java將不再是一門側重於後端的編程語言,也可以更多的用於成熟的Web服務器平臺。
Excutor重要參數說明:

  1. name:共享線程池的名字,這是connector爲了共享線程池要引用的名字,改名字必須唯一
  2. namePrefix:在JVM上,每運行線程都可以有一個name字符串,這一屬性爲線程池中每個線程的name字
    符串設置了一個前綴,Tomcat將把線程號追加到這一前綴後面,默認值爲tomcat-exec-
  3. maxThreads:該線程池可以容納的最大線程數,默認200
  4. maxIdleTime:在Tomcat關閉一個空閒線程之前,允許空閒線程持續的時間(單位爲毫秒)。只有當前
    活躍的線程數大於minSpareThread的值,纔會關閉空閒進程,默認值60000,一分鐘
  5. minSpareThreads:Tomcat應該始終打開的最小不活躍線程數,默認25
  6. threadPriority:線程的等級
    Connector重要參數說明
  7. executor:表示使用參數值對應的線程池
  8. minProcessors:服務器啓動時創建的處理請求的線程數
  9. maxProcessors:最大可以創建的處理請求的進程數
  10. acceptCount:指定當前所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,
    超過這個數的請求不予處理
    處理方式
    org.apache.coyote.http11.Http11NioProtocol :表示nio處理類
    org.apache.coyote.http11.Http11AprProtocol :表示apr 模式
    HTTP/1.1 : 表示bio模式
    APR提供的主要功能模塊包括:內存分配及內存池、原子操作、文件I/O、鎖、內存映射、哈希表、網絡
    I/O、輪詢、進程及線程操作等等,通過採用APR,Tomcat可以獲得高度可擴展性以及優越的性能,並且
    可以更好的與本地服務器技術集成,從而可以使Tomcat作爲一款通用的Web服務器使用,而不僅僅作爲
    輕量級應用服務器。在這種情況下,Java將不再是一門側重於後端的編程語言,也可以更多的用於成熟
    的Web服務器平臺。
  11. /usr/local/tomcat/conf/server.xml 修改
    tomcat簡單操作
  12. 重啓tomcat
    tomcat簡單操作
    3.查看端口
    tomcat簡單操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章