Linux系統下Jsp環境部署

-------本文大綱

簡介

Jsp環境部署

Tomcat目錄結構

SHOP++網上商城系統安裝

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

一、簡介

  • JSP

JSP(Java Server Pages)是由Sun Microsystems公司倡導、許多公司參與一起建立的一種動態網頁技術標準。在傳統的網頁HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標記(tag),從而形成JSP文件(*.jsp)簡單地說,jsp就是可能包含了java程序段的html文件(由jasper將嵌入在html文檔的程序整個的轉換爲serlet代碼),爲了和普通的html區別,因此使用jsp後綴名。

  • Servlet

Servlet是一種獨立於平臺和協議的服務器端的Java應用程序,可以生成動態的Web頁面。 它擔當Web瀏覽器或其他HTTP客戶程序發出請求,與HTTP服務器上的數據庫或應用程序之間的中間層

Servlet是位於Web 服務器內部的服務器端的Java應用程序,與傳統的從命令行啓動的Java應用程序不同,Servlet由Web服務器進行加載,該Web服務器必須包含支持Servlet的Java虛擬機。

在通信量大的服務器上,Java servlet的優點在於它們的執行速度更快於CGI程序。各個用戶請求被激活成單個程序中的一個線程,而創建單獨的程序,這意味着各個請求的系統開銷比較小。

簡單地說,servlet就是在服務器端被執行的java程序,它可以處理用戶的請求,並對這些請求做出響應。Servlet編程是純粹的java編程,而jsp則是html和java編程的中庸形式,所有的jsp文件都將被最終轉換成java servlet來執行。

從jsp到java到class,jsp在首次被請求時是要花費一定的服務器資源的。但慶幸的是,這種情況只發生一次,一旦這個jsp文件被翻譯並編譯成對應的servlet,在下次請求來臨時,將直接由servlet來處理,除非這個jsp已經被修改。

JSP和Servlet的最大區別在於,Servlet通常需要事先編譯好,而JSP則並非必須事先編譯。這意味着Servlet通常放置於私有資源區域,而JSP則通常以嵌入代碼的方式包含於HTML頁面文件中,這些HTML文件通常放置在公開資源區域。

  • Tomcat

Tomcat是一個免費的開源的Serlvet容器,它是Apache基金會的Jakarta項目中的一個核心項目,由Apache,Sun和其它一些公司及個人共同開發而成。

Tomcat是穩固的獨立的Web服務器與Servlet Container,不過,其Web服務器的功能則不如許多更健全的Web服務器完整,如Apache(Apache是一個強大的Web服務器 ,在處理靜態頁面、處理大量網絡客戶請求、支持服務的種類以及可配置方面都有優勢,高速並且強壯,但是沒有JSP/Servlet的解析能力)

將Apache和Tomcat整合起來可以看作是用Tomcat做Apache的jsp/servlet解析插件,不過Tomcat作爲一個Web服務器,本身只具備了基本的Web服務功能。

二、Jsp環境部署

1、安裝JDK(jdk-7u55-linux-x64)

[root@essun download]# ls
apache-tomcat-7.0.53.tar.gz  jdk-7u55-linux-x64.rpm
[root@essun download]# rpm -ivh jdk-7u55-linux-x64.rpm
Preparing...                ########################################### [100%]
   1:jdk                    ########################################### [100%]
Unpacking JAR files...
    rt.jar...
    jsse.jar...
    charsets.jar...
    tools.jar...
    localedata.jar...
    jfxrt.jar...
[root@essun download]#
  • 安裝後存放的路徑

[root@essun java]# rpm -ql jdk | tail -10
/usr/java/jdk1.7.0_55/man/man1/schemagen.1
/usr/java/jdk1.7.0_55/man/man1/serialver.1
/usr/java/jdk1.7.0_55/man/man1/servertool.1
/usr/java/jdk1.7.0_55/man/man1/tnameserv.1
/usr/java/jdk1.7.0_55/man/man1/unpack200.1
/usr/java/jdk1.7.0_55/man/man1/wsgen.1
/usr/java/jdk1.7.0_55/man/man1/wsimport.1
/usr/java/jdk1.7.0_55/man/man1/xjc.1
/usr/java/jdk1.7.0_55/release
/usr/java/jdk1.7.0_55/src.zip
[root@essun java]# cd /usr/java/^C
[root@essun java]# ll
total 4
lrwxrwxrwx 1 root root   16 May 11 09:45 default -> /usr/java/latest
drwxr-xr-x 8 root root 4096 May 11 09:44 jdk1.7.0_55
lrwxrwxrwx 1 root root   21 May 11 09:45 latest -> /usr/java/jdk1.7.0_55
  • 添加環境變量

[root@essun bin]# cat /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
#注:$JAVA_HOME/bin一定要寫在前面,否則將引用的是系統自帶的java環境
[root@essun bin]# java -version
java version "1.7.0_55"
Java(TM) SE Runtime Environment (build 1.7.0_55-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)

到此,jdk安裝完成。

2、安裝Tomcat (apache-tomcat-7.0.53.tar.gz)

[root@essun download]# tar xf apache-tomcat-7.0.53.tar.gz -C /
usr/local/
[root@essun local]# ln -sv apache-tomcat-7.0.53 tomcat
`tomcat' -> `apache-tomcat-7.0.53'
  • 添加環境變量

[root@essun tomcat]# cat /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
[root@essun tomcat]# . /etc/profile.d/tomcat.sh
[root@essun tomcat]# cat
cat          catalina.sh  catchsegv
  • 啓動服務

[root@essun tomcat]# catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/latest
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@essun tomcat]# ss -tnlp | grep 8080
LISTEN     0      100                      :::8080                    :::*      users:(("java",28017,42))
[root@essun tomcat]# ss -tnlp | grep java
LISTEN     0      100                      :::8080                    :::*      users:(("java",28017,42))
LISTEN     0      1          ::ffff:127.0.0.1:8005                    :::*      users:(("java",28017,45))
LISTEN     0      100                      :::8009                    :::*      users:(("java",28017,43))
  • 添加啓動腳本

#!/bin/sh
# Tomcat init script for Linux.
#
# chkconfig: 2345 92 34
# description: The Apache Tomcat servlet/JSP container.
JAVA_HOME=/usr/java/latest
CATALINA_HOME=/usr/local/tomcat
export JAVA_HOME CATALINA_HOME
case $1 in
start)
  $CATALINA_HOME/bin/catalina.sh start;;
stop)
  $CATALINA_HOME/bin/catalina.sh stop;;
restart)
  $CATALINA_HOME/bin/catalina.sh stop
  sleep 2
  $CATALINA_HOME/bin/catalina.sh start;;
esac
[root@essun tomcat]# chmod +x /etc/rc.d/init.d/tomcat
[root@essun tomcat]# chkconfig --add tomcat
[root@essun tomcat]# chkconfig tomcat on
  • 訪問測試

wKiom1Nu9CqSn3hoAAXs9S6ikZQ108.jpg

到此,tomcat安裝完成

3、Tomcat Manager
tomcat強大的管理工具,具有以下特性:
 遠程deploy新應用程序
 清理空閒會話
 在不重啓container的情況下Undeploy應用程序
 分析內存泄漏
 JVM狀態
 服務器狀態
然而,在tomcat7中,TM默認是禁用的。要啓用之,需要編輯tomcat-users.xml文件;

只要簡單的設置就可以

  • 修改/usr/local/tomcat/conf/tomcat-users.xml

<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui"/>
</tomcat-users>
  • 重啓tomcat

[root@essun tomcat]# service tomcat restart
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/latest
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/latest
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

web重新訪問,在默認頁面的右邊有三個按鈕

  • Server Status:服務器性能監控

wKiom1NvjI-AnOZjAAWGFaitFUI892.jpg

  • Manager App :應用程序管理

輸入登錄密碼

wKioL1NviTChbTdUAAPs54As8Sc688.jpg

應用程序相關信息

wKiom1NviY2jjYwnAAYuAWgLYr4037.jpg

應用程序部署

wKioL1NviwLD09Y3AARtoLtgRqs325.jpg

Context:
對於應用程序來說,context路徑是一個關鍵屬性,其也經常用於虛擬主機的配置及.war文件中的URL映射。使用context可以降低系統負載,因爲,當某URL請求到達tomcat時,如果沒有context,tomcat需要搜索server.xml或context.xml的配置以確定此URL,否則則需要搜索所有的war文件來查找用戶的請求的資源。

此外,context也可以讓管理員基於每個app提供日誌、appBase、DB連接等配置,這極大地增強配置的靈活性;

Tomcat7 deploy應用程序的方法:

War格式的應用程序:將應用程序war文件放置於CATALINA_BASE目錄中並重新啓動tomcat;
沒打包的應用程序:將應用程序的非歸檔文件複製於CATALINA_BASE目錄中;
Tomcat Manager:登錄TM而後進行deploy;

Deploy應用程序所涉及到的操作:
Deploy: 向tomcat實例提供某應用程序源文件,並讓服務器將類加載進類加器中;這樣,應用程序纔可以爲用戶所使用;
Redeploy:用於更新deployment後的某應用程序或應用程序的部分內容;當redeploy整個應用程序時,當前應用程序的所有模塊都必須要redeploy成功,否則整個webapp將會停止 ;
Stop: 卸載當前應用程序的所有類,並停止向用戶提供服務;不過,其仍然會保留所有已deploy的文件及名稱,並可用於後續的redeployment或starting;
Start: 重新裝載當前應用的類至類加載器,並開啓服務;
Undeploy: 停止某已經deploy的應用程序,並移除deploy產生的文件和名稱
  • Host Manager :佈署虛擬主機

wKiom1Nvj77hhTw-AAOyc-9cld0813.jpg

應用程序目錄的結構:
/WEB-INF/web.xml:包含當前webapp的deploy描述符,如所有的servlets和JSP等動態文件的詳細信息,會話超時時間和數據源等;因此,其也通常用於定義當前webapp特有的資源;
/WEB-INF/classes: 包含所有服務器端類及當前應用程序相關的其它第三方類等;
/WEB-INF/lib: 包含JSP所用到的JAR文件;

三、tomcat 目錄結構

[root@essun tomcat]# ls -l | grep "^d"
drwxr-xr-x 2 root root  4096 May 11 11:36 bin
drwxr-xr-x 3 root root  4096 May 11 11:42 conf
drwxr-xr-x 2 root root  4096 May 11 11:36 lib
drwxr-xr-x 2 root root  4096 May 11 11:42 logs
drwxr-xr-x 2 root root  4096 May 11 11:36 temp
drwxr-xr-x 7 root root  4096 Mar 25 11:24 webapps
drwxr-xr-x 3 root root  4096 May 11 11:42 work

1、各目錄的作用

  • bin ——Tomcat執行腳本目錄

  • conf ——Tomcat配置文件

  • lib ——Tomcat運行需要的庫文件(JARS)

  • logs ——Tomcat執行時的LOG文件

  • temp ——Tomcat臨時文件存放目錄

  • webapps ——Tomcat的主要Web發佈目錄(存放我們自JSP,SERVLET,CLASSES)

  • work ——Tomcat的工作目錄,Tomcat將翻譯JSP文件到的Java文件和class文件放在這

2、各目錄中的文件

  • conf/

[root@essun tomcat]# ls conf
Catalina             context.xml         tomcat-users.xml
catalina.policy      logging.properties  web.xml
catalina.properties  server.xml

最主要的配置文件有

server.xml Tomcat 的全局配置文件

web.xml 爲不同的Tomcat配置的web應用設置缺省值的文件

tomcat-users.xml Tomcat用戶認證的配置文件

context.xml 用於虛擬主機的配置及.war文件中的URL映射。使用context可以降低系統負載,因爲,當某URL請求到達tomcat時,如果沒有context,tomcat需要搜索server.xml或context.xml的配置以確定此URL,否則則需要搜索所有的war文件來查找用戶的請求的資源

  • webapps

[root@essun webapps]# ls
docs  examples  host-manager  manager  ROOT

含Web應用的程序 (JSP、Servlet等)

  • work

[root@essun work]# cd Catalina/localhost/
[root@essun localhost]# ls
_  docs  examples  host-manager  manager

由Tomcat自動生成,這是Tomcat放置它運行期間的中間文件(諸如編譯的JSP文件)地方。 如果當Tomcat運行時,你刪除了這個目錄那麼將不能夠執行包含JSP的頁面。

3、Tomcat的配置文件
Tomcat的配置文件默認存放在$CATALINA_HOME/conf目錄中,主要有以下幾個:
  • server.xml

Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主組件的相關配置信息;

<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at
      http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- Note:  A "Server" is not itself a "Container", so you may not
     define subcomponents such as "Valves" at this level.
     Documentation at /docs/config/server.html
 -->
<Server port="8005" shutdown="SHUTDOWN">
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <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>
  <!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container",
       so you may not define subcomponents such as "Valves" at this level.
       Documentation at /docs/config/service.html
   -->
  <Service name="Catalina">
    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->
    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the BIO implementation that requires the JSSE
         style configuration. When using the APR/native implementation, the
         OpenSSL style configuration is required as described in the APR/native
         documentation -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->
    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->
    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost">
      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->
      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->
        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>
    • Server : Tomcat Server 是整個 Catalina JSP/Servlet 容器,它是一個單件(Sinleton)。
<Server port="8005" shutdown="SHUTDOWN">
    • Server的相關屬性:
      className: 用於實現此Server容器的完全限定類的名稱,默認爲org.apache.catalina.core.StandardServer;
      port: 接收shutdown指令的端口,默認僅允許通過本機訪問,默認爲8005;
      shutdown:發往此Server用於實現關閉tomcat實例的命令字符串,默認爲SHUTDOWN;
  • Service : Service 是這樣一個集合:它由一個或者多個 Connector 組成,並擁有一個負責處理所有Connector 所獲得的客戶請求的 Engine。
<Service name="Catalina">
    • Service相關的屬性:
      className: 用於實現service的類名,一般都是org.apache.catalina.core.StandardService。
      name:此服務的名稱,默認爲Catalina;
  • Connector : 一個 Connector 將在某個指定端口上偵聽客戶請求,並將獲得的請求交給 Engine 來處理,從 Engine 處獲得迴應並返回客戶。Tomcat 有兩個典型的 Connector,一個直接偵聽來自 web 瀏覽器的 HTTP 請求,一個偵聽來自其它 WebServer 的請求
    • 定義連接器可以使用多種屬性,有些屬性也只適用於某特定的連接器類型。一般說來,常見於server.xml中的連接器類型通常有4種:
      1) HTTP連接器
      2) SSL連接器
      3) AJP 1.3連接器
      4) proxy連接器
      如上面示例server.xml中定義的HTTP連接器:
      <Connector port="8080" protocol="HTTP/1.1"
                     connectionTimeout="20000"
                     redirectPort="8443" />
      定義連接器時可以配置的屬性非常多,但通常定義HTTP連接器時必須定義的屬性只有“port”,定義AJP連接器時必須定義的屬性只有"protocol",因爲默認的協議爲HTTP。以下爲常用屬性的說明:
      1) address:指定連接器監聽的地址,默認爲所有地址,即0.0.0.0;
      2) maxThreads:支持的最大併發連接數,默認爲200;
      3) port:監聽的端口,默認爲0;
      4) protocol:連接器使用的協議,默認爲HTTP/1.1,定義AJP協議時通常爲AJP/1.3;
      5) redirectPort:如果某連接器支持的協議是HTTP,當接收客戶端發來的HTTPS請求時,則轉發至此屬性定義的端口;
      6) connectionTimeout:等待客戶端發送請求的超時時間,單位爲毫秒,默認爲60000,即1分鐘;
      7) enableLookups:是否通過request.getRemoteHost()進行DNS查詢以獲取客戶端的主機名;默認爲true;
      8) acceptCount:設置等待隊列的最大長度;通常在tomcat所有處理線程均處於繁忙狀態時,新發來的請求將被放置於等待隊列中;
            上例中還定義了一個多個屬性的SSL器:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
  • Engine : Engine 是某個 service 中的請求處理機,它負責接收和處理來自 Connector 的請求。Engine 下可以配置多個虛擬主機(Virtual Host),每個虛擬主機都有一個域名。當 Engine 獲得一個請求時,它將根據請求中的信息把該請求匹配到某個 Host 上,然後在該 Host 配置的環境下處理該請求。Engine 有一個默認虛擬主機,當請求無法匹配到任何一個 Host 上的時候,將交給該默認虛擬主機來處理。
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    • 常用的屬性定義:
      defaultHost:Tomcat支持基於FQDN的虛擬主機,這些虛擬主機可以通過在Engine容器中定義多個不同的Host組件來實現;但如果此引擎的連接器收到一個發往非非明確定義虛擬主機的請求時則需要將此請求發往一個默認的虛擬主機進行處理,因此,在Engine中定義的多個虛擬主機的主機名稱中至少要有一個跟defaultHost定義的主機名稱同名;
      name:Engine組件的名稱,用於日誌和錯誤信息記錄時區別不同的引擎;
      Engine容器中可以包含Realm、Host、Listener和Valve子容器。
  • Host : 一個 Host 代表一個虛擬主機(Virtual Host),每個虛擬主機和某個域名(Domain Name)相匹配。每個虛擬主機下都可以部署(deploy)一個或者多個 web applications,每個 web application 對應於一個 Context,並擁有一個 Context path。當 Host 獲得一個針對某個特定的 Host的請求時,將在該 Host 的環境下把請求匹配到某個 Context 上,然後把請求交給該 Context 來處理。Context 的匹配方法是 最長匹配 ,所以一個 “ ” path="" 的 Context 將成爲該 Host 的默認 Context,所有無法和其它 Context 的路徑名匹配的請求都將最終和該默認 Context 匹配。
<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
    • 常用屬性說明:
1) appBase:此Host的webapps目錄,即存放非歸檔的web應用程序的目錄或歸檔後的WAR文件的目錄路徑;可以使用基於$CATALINA_HOME的相對路徑;
2) autoDeploy:在Tomcat處於運行狀態時放置於appBase目錄中的應用程序文件是否自動進行deploy;默認爲true;
3) unpackWars:在啓用此webapps時是否對WAR格式的歸檔文件先進行展開;默認爲true;
    • 虛擬主機定義示例:
<Engine name="Catalina" defaultHost="localhost">
  <Host name="localhost" appBase="webapps">
    <Context path="" docBase="ROOT"/>
    <Context path="/bbs" docBase="/web/bss"
      reloadable="true" crossContext="true"/>
  </Host>
  <Host name="mail.essun.com" appBase="/web/mail">
    <Context path="" docBase="ROOT"/>
  </Host>
</Engine>
主機別名定義:
如果一個主機有兩個或兩個以上的主機名,額外的名稱均可以以別名的形式進行定義,如下:
<Host name="www.essun.com" appBase="webapps" unpackWARs="true">
  <Alias>essun.com</Alias>
</Host>

Context : 一個 Context 對應於一個 web application,一個 web application 由一個或者多個Servlet 組成。每個 Context 在創建的時候都將根據配置文件conf/web.xml 和 webapps/${webapp.home}/WEB-INF/web.xml 載入 Servlet 類和創建映射表(mapping table)。當Context 獲得請求時,將在自己的映射表中尋找相匹配的 Servlet 類。如果找到,則執行該類,獲得結果並返回。

  • 例如(配置文件中默認沒有此項)
    <!-- Tomcat Root Context -->
        <Context path="" docBase="/web/webapps"/>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
        <!-- buzzin webapp -->
        <Context path="/bbs"
          docBase="/web/threads/bbs"
          reloadable="true">
        </Context>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
        <!-- chat server -->
          <Context path="/chat" docBase="/web/chat"/>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
        <!-- darian web -->
        <Context path="/darian" docBase="darian"/>
    • 常用的屬性定義有:
               1) docBase:相應的Web應用程序的存放位置;也可以使用相對路徑,起始路徑爲此Context所屬Host中appBase定義的路徑;切記,docBase的路徑名不能與相應的Host中appBase中定義的路徑名有包含關係,比如,如果appBase爲deploy,而docBase絕不能爲deploy-bbs類的名字;
               2) path:相對於Web服務器根路徑而言的URI;如果爲空“”,則表示爲此webapp的根路徑;如果context定義在一個單獨的xml文件中,此屬性不需要定義;
               3) reloadable:是否允許重新加載此context相關的Web應用程序的類;默認爲false;
    • Realm組件:一個Realm表示一個安全上下文,它是一個授權訪問某個給定Context的用戶列表和某用戶所允許切換的角色相關定義的列表。因此,Realm就像是一個用戶和組相關的數據庫。定義Realm時惟一必須要提供的屬性是classname,它是Realm的多個不同實現,用於表示此Realm認證的用戶及角色等認證信息的存放位置。

    • 下面是一個常見的使用UserDatabase的配置:

<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
              resourceName="UserDatabase"/>
     </Realm>
  • JAASRealm:基於Java Authintication and Authorization Service實現用戶認證;
  • JDBCRealm:通過JDBC訪問某關係型數據庫表實現用戶認證;
  • JNDIRealm:基於JNDI使用目錄服務實現認證信息的獲取;
  • MemoryRealm:查找tomcat-user.xml文件實現用戶信息的獲取;
  • UserDatabaseRealm:基於UserDatabase文件(通常是tomcat-user.xml)實現用戶認證,它實現是一個完全可更新和持久有效的MemoryRealm,因此能夠跟標準的MemoryRealm兼容;它通過JNDI實現;
             下面是一個使用JDBC方式獲取用戶認證信息的配置:  
<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
  driverName="org.gjt.mm.mysql.Driver"
  connectionURL="jdbc:mysql://localhost/authority"
  connectionName="test" connectionPassword="test"
  userTable="users" userNameCol="user_name"
  userCredCol="user_pass"
  userRoleTable="user_roles" roleNameCol="role_name" />
    • Valve組件:Valve類似於過濾器,它可以工作於Engine和Host/Context之間、Host和Context之間以及Context和Web應用程序的某資源之間。一個容器內可以建立多個Valve,而且Valve定義的次序也決定了它們生效的次序。Tomcat6中實現了多種不同的Valve:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
               AccessLogValve:訪問日誌Valve
               ExtendedAccessValve:擴展功能的訪問日誌Valve
               JDBCAccessLogValve:通過JDBC將訪問日誌信息發送到數據庫中;
               RequestDumperValve:請求轉儲Valve;
               RemoteAddrValve:基於遠程地址的訪問控制;
               RemoteHostValve:基於遠程主機名稱的訪問控制;

               SemaphoreValve:用於控制Tomcat主機上任何容器上的併發訪問數量;

               JvmRouteBinderValve:在配置多個Tomcat爲以Apache通過mod_proxy或mod_jk作爲前端的集羣架構中,當期望停止某節點時,可以通過此Valve將用記請求定向至備用節點;使用此Valve,必須使用JvmRouteSessionIDBinderListener;

                ReplicationValve:專用於Tomcat集羣架構中,可以在某個請求的session信息發生更改時觸發session數據在各節點間進行復制;
               SingleSignOn:將兩個或多個需要對用戶進行認證webapp在認證用戶時連接在一起,即一次認證即可訪問所有連接在一起的webapp;
               ClusterSingleSingOn:對SingleSignOn的擴展,專用於Tomcat集羣當中,需要結合ClusterSingleSignOnListener進行工作;
               RemoteHostValve和RemoteAddrValve可以分別用來實現基於主機名稱和基於IP地址的訪問控制,控制本身可以通過allow或deny來進行定義,這有點類似於Apache的訪問控制功能;如下面的Valve則實現了僅允許本機訪問/probe:
<Context path="/probe" docBase="probe">
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.0\.0\.1"/>
  </Context>
      • 其中相關屬性定義有:
               1) className:相關的java實現的類名,相應於分別應該爲org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;
               2) allow:以逗號分開的允許訪問的IP地址列表,支持正則表達式,因此,點號“.”用於IP地址時需要轉義;僅定義allow項時,非明確allow的地址均被deny;
               3) deny: 以逗號分開的禁止訪問的IP地址列表,支持正則表達式;使用方式同allow;
    • GlobalNamingResources:應用於整個服務器的JNDI映射,此可以避免每個Web應用程序都需要在各自的web.xml創建,這在web應用程序以WAR的形式存在時尤爲有用。它通常可以包含三個子元素:
                   1) Environment;
                   2) Resource;

               3) ResourceEnvRef;    

<GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <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>
    • WatchedResource:WatchedResource可以用於Context中監視指定的webapp程序文件的改變,並且能夠在監視到文件內容發生改變時重新裝載此文件。
      • Listener:Listener用於創建和配置LifecycleListener對象,而LifecycleListener通常被開發人員用來創建和刪除容器。
      • Loader:Java的動態裝載功能是其語言功能強大表現之一,Servlet容器使用此功能在運行時動態裝載servlet和它們所依賴的類。Loader可以用於Context中控制java類的加載。
      • Manager:Manger對象用於實現HTTP會話管理的功能,Tomcat6中有4種Manger的實現:
           1) StandardManager:Tomcat6的默認會話管理器,用於非集羣環境中對單個處於運行狀態的Tomcat實例會話進行管理。當Tomcat關閉時,這些會話相關的數據會被寫入磁盤上的一個名叫SESSION.ser的文件,並在Tomcat下次啓動時讀取此文件。
           2) PersistentManager:當一個會話長時間處於空閒狀態時會被寫入到swap會話對象,這對於內存資源比較吃緊的應用環境來說比較有用。
           3)DeltaManager:用於Tomcat集羣的會話管理器,它通過將改變了會話數據同步給集羣中的其它節點實現會話複製。這種實現會將所有會話的改變同步給集羣中的每一個節點,也是在集羣環境中用得最多的一種實現方式。

          4)BackupManager:用於Tomcat集羣的會話管理器,與DeltaManager不同的是,某節點會話的改變只會同步給集羣中的另一個而非所有節點。

    • Stores:PersistentManager必須包含一個Store元素以指定將會話數據存儲至何處。這通常有兩種實現方式:FileStore和JDBCStore

    • Resources:經常用於實現在Context中指定需要裝載的但不在Tomcat本地磁盤上的應用資源,如Java類,HTML頁面,JSP文件等。

    • Cluster:專用於配置Tomcat集羣的元素,可用於Engine和Host容器中。在用於Engine容器中時,Engine中的所有Host均支持集羣功能。在Cluster元素中,需要直接定義一個Manager元素,這個Manager元素有一個其值爲org.apache.catalina.ha.session.DeltaManager或org.apache.catalina.ha.session.BackupManager的className屬性。同時,Cluster中還需要分別定義一個Channel和ClusterListener元素。

    • Channel:用於Cluster中給集羣中同一組中的節點定義通信“信道”。Channel中需要至少定義Membership、Receiver和Sender三個元素,此外還有一個可選元素Interceptor。
    • Membership:用於Channel中配置同一通信信道上節點集羣組中的成員情況,即監控加入當前集羣組中的節點並在各節點間傳遞心跳信息,而且可以在接收不到某成員的心跳信息時將其從集羣節點中移除。Tomcat6中Membership的實現是org.apache.catalina.tribes.membership.McastService。
    • Sender:用於Channel中配置“複製信息”的發送器,實現發送需要同步給其它節點的數據至集羣中的其它節點。發送器不需要屬性的定義,但可以在其內部定義一個Transport元素。
    • Transport:用於Sender內部,配置數據如何發送至集羣中的其它節點。Tomcat6有兩種Transport的實現:
           1) PooledMultiSender:基於Java阻塞式IO,可以將一次將多個信息併發發送至其它節點,但一次只能傳送給一個節點。
           2)PooledParallelSener:基於Java非阻塞式IO,即NIO,可以一次發送多個信息至一個或多個節點。
    • Receiver:用於Channel定義某節點如何從其它節點的Sender接收復制數據,Tomcat6中實現的接收方式有兩種BioReceiver和NioReceiver。
  • web.xml
遵循Servlet規範標準的配置文件,用於配置servlet,併爲所有的Web應用程序提供包括MIME映射等默認配置信息;

tomcat-user.xml

Realm認證時用到的相關角色、用戶和密碼等信息;Tomcat自帶的manager默認情況下會用到此文件;在Tomcat中添加/刪除用戶,爲用戶指定角色等將通過編輯此文件實現;

  • catalina.policy

Java相關的安全策略配置文件,在系統資源級別上提供訪問控制的能力;

  • catalina.properties

Tomcat內部package的定義及訪問相關的控制,也包括對通過類裝載器裝載的內容的控制;Tomcat6在啓動時會事先讀取此文件的相關設置;

  • logging.properties:

Tomcat6通過自己內部實現的JAVA日誌記錄器來記錄操作相關的日誌,此文件即爲日誌記錄器相關的配置信息,可以用來定義日誌記錄的組件級別以及日誌文件的存在位置等;

  • context.xml

所有host的默認配置文件

四、SHOP++網上商城系統安裝

1、環境部署

  • 需要安裝mysql

[root@essun conf]# yum install -y mysql-server mysql
root@essun shop]# service mysqld start
Initializing MySQL database:  Installing MySQL system tables...
OK
Filling help tables...
OK
  • 修改/usr/local/tomcat/conf/server.xml

<Connector port="8080" protocol="HTTP/1.1"
              connectionTimeout="20000"
              redirectPort="8443" URIEncoding = "UTF-8"  />
  • 在站點目錄(/usr/local/tomcat/webapps)中,新建一目錄名爲shop

[root@essun webapps]# mkdir shop
  • 將下載後網上商城解壓到此下目錄

[root@essun shop]# pwd
/usr/local/tomcat/webapps/shop
[root@essun shop]# ls
admin    changelog.txt  index.html  license.html  product    robots.txt  sitemap  WEB-INF
article  favicon.ico    install     META-INF      resources  shopxx.txt  upload
  • 重啓tomcat服務

[root@essun shop]# service tomcat restart
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/latest
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/latest
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
  • 使用瀏覽器訪問安裝

wKiom1Nvfj2SELzwAAVC4yFVn8c394.jpg


  • 環境檢測

wKioL1Nvfi3w54-rAAOqaEIPRTs211.jpg

  • 系統配置

wKiom1NvfnizzcsUAANvEqKpudc148.jpg

  • 系統安裝

wKioL1NvfmyRlhPnAAMJkpAqAFo348.jpg


  • 訪問首頁

wKiom1NvfrnzRikhAAXlz9fF27k578.jpg

  • 子頁測試

wKioL1NvfrLg9kb9AARj5QU2uTs268.jpg

  • 登錄後臺

wKiom1NvfvfzbPfQAAG8Dplec7A123.jpg

  • 後臺管理

wKioL1NvfvCQW_2vAAMDoYSDV9E206.jpg

2、請求解析

  • 請求被髮送到本機端口 8080,被在那裏偵聽的  HTTP/1.1 Connector 獲得
  • Connector 把該請求交給它所在的 Service 的 Engine 來處理,並等待來自 Engine 的迴應
  • Engine 獲得請求 localhost/yourContext/yourJSPPage.jsp,匹配它所擁有的所有虛擬主機 Host
  • Engine 匹配到名爲 localhost 的 Host(即使匹配不到也把請求交給該 Host 處理,因爲該 Host 被定義爲該 Engine 的默認主機)
  • localhost Host 獲得請求/yourContext/yourJSPPage.jsp,匹配它所擁有的所有 Context(最長匹配)
  • Host 匹配到路徑爲/yourContext 的 Context(如果匹配不到就把該請求交給路徑名爲""的 Context 去處理)
  • path="/yourContext"的 Context 獲得請求/yourJSPPage.jsp,在它的 mapping table 中尋找對應的Servlet
  • Context 匹配到 URL pattern 爲*.jsp 的 Servlet,對應於 JspServlet 類
  • 構造 HttpServletRequest 對象和 HttpServletResponse 對象,作爲參數調用 JspServlet 的 doGet或 doPost 方法(調用什麼方法取決於來自客戶的 HTTP 請求是 GET 請求還是 POST 請求)
  • Context 把執行完了之後的 HttpServletResponse 對象返回給 Host
  • Host 把 HttpServletResponse 對象返回給 Engine
  • Engine 把 HttpServletResponse 對象返回給 Connector
  • Connector 把 HttpServletResponse 對象返回給客戶的 web 瀏覽器


========================完===========================================



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章