tomcat配置虛擬主機
          2008-12-13 17:38

          一、網(wǎng)站系統(tǒng)的組成

          只要在一臺計算機上安裝了WEB服務(wù)器軟件,從功能上講,這臺計算機就可以稱為WEB服務(wù)器。一個網(wǎng)站的規(guī)模可大可小,功能可多可少,最簡單的網(wǎng)站只需要一臺Web服務(wù)器即可對外提供網(wǎng)頁瀏覽服務(wù)。復(fù)雜的網(wǎng)站包括多臺WEB服務(wù)器組成的群集系統(tǒng)、負載均衡設(shè)備、具有緩存功能的代理服務(wù)器(可以有多級,甚至包括放置在服務(wù)器端的緩存系統(tǒng))、數(shù)據(jù)庫系統(tǒng)等,如圖2.2所示。

           


          2.2

          www.sina.com網(wǎng)站系統(tǒng)采用的基本上就是圖2.2所示的架構(gòu),不同地區(qū)的人們在訪問www.sina.com站點時,瀏覽器實際上所訪問的服務(wù)器是不一樣的,例如,吉林省的用戶訪問的服務(wù)器實際是sina放在吉林地區(qū)的代理服務(wù)器,湖北省的用戶訪問的服務(wù)器實際是sina放在湖北地區(qū)的代理服務(wù)器。各地區(qū)的瀏覽器訪問www.sina.com站點的過程如圖2.3所示。

           


          2.3

          為了能夠讓瀏覽器透明地訪問到WEB站點,讓用戶感覺不到是在訪問區(qū)域代理服務(wù)器,在DNS系統(tǒng)中需要將www.sina.com主機名指向所有的區(qū)域代理服務(wù)器的IP地址。在瀏覽器訪問www.sina.com站點中的頁面而向DNS服務(wù)器請求解析www.sina.com主機名時,DNS服務(wù)器根據(jù)訪問者的地理位置信息返回他附近的區(qū)域代理服務(wù)器的IP地址,這樣,瀏覽器的訪問請求將發(fā)送給該區(qū)域代理服務(wù)器。只有當(dāng)區(qū)域代理服務(wù)器中沒有瀏覽器要訪問的頁面時,區(qū)域代理服務(wù)器才去從真正的www.sina.com站點服務(wù)器上獲取該頁面并進行緩存,以后該區(qū)域的其他瀏覽器就都可以就近從區(qū)域代理服務(wù)器中訪問到該頁面了,從而大大提高了訪問效率和減少了網(wǎng)絡(luò)流量。

           

           

          二、基于主機名的虛擬主機

          WEB瀏覽器與WEB服務(wù)器建立連接后,除了將請求URL中的資源路徑發(fā)送給WEB服務(wù)器外,還會將URL中的主機名部分作為HTTP請求消息的Host頭發(fā)送給WEB服務(wù)器。例如,在瀏覽器地址欄中輸入http://www.it315.org,瀏覽器發(fā)送給www.it315.org主機上的WEB服務(wù)器的請求消息內(nèi)容如下:

                 GET / HTTP/1.1<回車>

                 Host: www.it315.org<回車>

                 <回車>

          WEB服務(wù)器接收到瀏覽器的訪問請求消息后,根據(jù)Host頭字段中所設(shè)置的主機名,就知道該選擇哪個WEB站點來進行響應(yīng),因此,可以使用不同的主機名來作為區(qū)分同一個WEB服務(wù)器上的不同站點的標(biāo)識信息。

          TomcatServer.xml配置文件中有一個<Host>元素,一個<Host>元素用于建立一個WEB站點,使用多個<Host>元素則可以建立多個WEB站點。<Host>元素的父級元素為<Engine>元素,嵌套在同一個<Engine>元素中的多個<Host>元素的name屬性不能相同,<Host>元素的name屬性指定WEB站點所對應(yīng)的主機名稱。TomcatServer.xml配置文件中初始設(shè)置的<Host>元素內(nèi)容如下:

          <Host name="localhost" appBase="webapps" …>

          </Host>

          <Host>元素中的appBase屬性指定了一個路徑,該路徑將作為嵌套在它里面的<Context>元素的docBase屬性中設(shè)置的相對路徑的基準路徑。

          當(dāng)Tomcat接收到訪問請求時,將比較請求消息中的Host頭字段的值與<Host>元素的name屬性值,并以匹配的<Host>元素所創(chuàng)建的WEB站點來響應(yīng)。如果Server.xml文件中沒有與請求消息的Host頭字段匹配的<Host>元素,Tomcat將以默認的WEB站點來響應(yīng)。只要<Engine>元素的defaultHost屬性設(shè)置為嵌套在它里面的某個<Host>元素的name屬性值,該<Host>元素所創(chuàng)建的WEB站點就成了該引擎的默認WEB站點。例如,TomcatServer.xml文件中的<Engine>元素的默認設(shè)置如下:

          <Engine name="Standalone" defaultHost="localhost" debug="0">

                 <Host name="localhost" appBase="webapps" …>

                

                 </Host>

          </Engine>

          上面的這段配置信息說明,該引擎的默認WEB站點為嵌套在<Engine>元素中的name屬性為“localhost”的<Host>元素所創(chuàng)建的WEB站點。

          在同一臺計算機上建立了多個基于主機名的虛擬主機后,WEB瀏覽器要訪問其中的某個虛擬主機的資源時,在訪問URL中必須采用主機名,而不能采用IP地址。這是因為WEB瀏覽器要將URL中的主機名部分作為HTTP請求消息的Host頭發(fā)送給WEB服務(wù)器,如果URL中的主機名部分使用的是IP地址,那么,瀏覽器發(fā)出的請求消息中的Host頭字段的值就是這個IP地址,而在同一臺計算機上建立的多個基于主機名的虛擬主機共享同一個IP地址,在Host頭字段使用IP地址根本就無法區(qū)分不同的站點。

          即使在URL中指定的是主機名時,WEB瀏覽器還是要先獲得該主機名所對應(yīng)的IP地址,然后再使用這個IP去連接WEB服務(wù)器。所以,在建立基于主機名的虛擬主機時,除了要在Tomcatserver.xml文件中進行設(shè)置外,還需要在整個網(wǎng)絡(luò)系統(tǒng)中建立主機名與IP地址的映射關(guān)系,即必須將主機名添加到名稱解析系統(tǒng),以便WEB瀏覽器能夠從名稱解析系統(tǒng)中查詢出主機名所對應(yīng)的IP地址。建立主機名與IP地址的映射關(guān)系的慣用方式有兩種:一是使用客戶機本地的Hosts 文件,二是使用DNS(Domain Name System,域名系統(tǒng))服務(wù)器。Hosts 文件和DNS的作用都是允許用戶使用“友好”的、文本格式的主機名稱,而不是數(shù)字格式的IP地址來訪問網(wǎng)絡(luò)中的計算機。Hosts文件可用于小型的Intranet(企業(yè)內(nèi)部網(wǎng)),網(wǎng)絡(luò)中的所有計算機上都需要使用Hosts文件。DNS通常用于大型的網(wǎng)絡(luò),特別是Internet上對外提供服務(wù)的計算機都是通過DNS來建立其主機名與IP地址的映射關(guān)系。客戶機首先在本地的Hosts文件中查找主機名稱所映射的IP地址,如果沒有找到,再去查詢DNS服務(wù)器。為了簡單起見,這里僅介紹一下Hosts文件。對于Windows 2000系統(tǒng),Hosts 文件位于操作系統(tǒng)根目錄(取決操作系統(tǒng)所在的分區(qū),通常是c:\winnt)下的System32\Drivers\Etc子目錄中,默認情況下,該文件中有如下一行內(nèi)容:

                 127.0.0.1       localhost

          這行文本的作用就是將IP地址(127.0.0.1)映射成主機名(localhost),這也就是在IE瀏覽器地址欄中可以使用localhost訪問本地WEB服務(wù)器的原因。如果要增加更多的主機名與IP地址的映射,可以在Hosts文件中增加更多的行,然后參照上面這行內(nèi)容的格式在每行中填寫IP地址和相應(yīng)的主機名。

          :動手體驗:使用Tomcat建立基于主機名的虛擬主機

          1)用UltraEdit打開<Tomcat主目錄>/conf目錄下的Server.xml文件,使用“查找”菜單查找內(nèi)容為“</Host>”的行,緊接該行下面增加一對<Host></Host>標(biāo)簽。參照前面的<Host>標(biāo)簽的屬性設(shè)置情況,設(shè)置新增的<Host>標(biāo)簽的屬性,并在它里面嵌套一個設(shè)置該WEB站點根目錄的<Context>元素,最終的內(nèi)容如下:

                 <Host name="site1" debug="0" appBase="d:\VirtualHost1">

                        <Context path="" docBase="." debug="0"/>

                 </Host>

          這樣,將創(chuàng)建一個新的WEB站點。上面的<Context>元素的docBase屬性值被設(shè)置為一個點(.),即表示使用<Host>元素的appBase屬性中所設(shè)置的路徑作為這個<Context>所映射的目錄。

          2)在上面新增的<Host></Host>標(biāo)簽對下面再增加一對<Host></Host>標(biāo)簽,并將它設(shè)置為如下形式:

                 <Host name="site2" debug="0" appBase="d:\VirtualHost2">

                        <Context path="" docBase="." debug="0"/>

                 </Host>

          這又創(chuàng)建了一個新的WEB站點,該站點的主機名稱為site2,根目錄對應(yīng)的本地文件系統(tǒng)目錄為d:\VirtualHost2

          3)在d:盤下創(chuàng)建名稱為VirtualHost1VirtualHost2兩個目錄,并在這兩個目錄中分別創(chuàng)建一個名為test.html的文件,在d:\VirtualHost1\test.html文件中寫入如下一行內(nèi)容:

              這是d:\VirtualHost1目錄中的test.html文件

          d:\VirtualHost2\test.html文件中寫入如下一行內(nèi)容:

              這是d:\VirtualHost2目錄中的test.html文件

          4)保存修改后的Server.xml文件,重新啟動Tomcat WEB服務(wù)器程序。打開一個新的命令行窗口中,并在這個命令行窗口中執(zhí)行如下命令:

          telnet 127.0.0.1 8080

          接著在連接成功的telnet程序命令窗口中,輸入如下內(nèi)容:

                 GET /test.html HTTP/1.1<回車>

                 Host:<空格>site1<回車>

                 <回車>

          這時在telnet程序窗口中可以看到,WEB服務(wù)器返回內(nèi)容的正文部分為d:\VirtualHost1\test.html文件中的內(nèi)容。接著WEB服務(wù)器返回內(nèi)容的下邊,輸入如下內(nèi)容:

                 GET /test.html HTTP/1.1<回車>

                 Host:<空格>site2<回車>

                 <回車>

          telnet程序窗口中又可以看到,WEB服務(wù)器這次返回內(nèi)容的正文部分為d:\VirtualHost2\test.html文件中的內(nèi)容。接著WEB服務(wù)器返回內(nèi)容的下邊,輸入如下內(nèi)容:

                 GET /test.html HTTP/1.1<回車>

                 Host:<空格><回車>

                 <回車>

          telnet程序窗口中又可以看到,WEB服務(wù)器這次返回內(nèi)容的正文部分為d:\test\test.html文件中的內(nèi)容。接著WEB服務(wù)器返回內(nèi)容的下邊,再次輸入如下內(nèi)容:

                 GET /test.html HTTP/1.1<回車>

                 Host:<空格>xxx<回車>

                 <回車>

          telnet程序窗口中又可以看到,WEB服務(wù)器這次返回內(nèi)容的正文部分仍然為d:\test\test.html文件中的內(nèi)容。

          上面的整個交互過程如圖2.34所示,Tomcat根據(jù)第1次和第2次請求中所指定Host頭的值,查找Server.xml文件中與之相匹配的<Host>元素的name屬性值,并以匹配的<Host>元素所設(shè)置的WEB站點來響應(yīng);在第3次和第4次請求中所指定Host頭的值,在Server.xml文件中沒有與之對應(yīng)的<Host>元素的name屬性值,Tomcat將以默認的WEB站點來響應(yīng)。

           


          2.34

          5)在Windows 2000系統(tǒng)中,用記事本程序打開c:\winnt\System32\Drivers\Etc\Hosts文件,可以看到有如下一行內(nèi)容:

                 127.0.0.1       localhost

          緊接這行文本的下面,用它復(fù)制出兩行文本,并將這兩行文本中的localhost分別修改成site1site2,這樣,就使用Hosts文件為當(dāng)前計算機設(shè)置了多個主機名。如果要用site1site2這個兩主機名訪問其他計算機上的WEB站點,則應(yīng)將127.0.0.1修改成其他計算機的實際IP地址。保存Hosts文件后,在命令行窗口中執(zhí)行“ping site1”和“ping site2”命令,查看該主機名是否被正確解析到了相應(yīng)的IP地址上。建立site1site2與計算機IP地址的映射后,在IE瀏覽器地址欄中輸入http://localhost:8080/test.htmlhttp://site1:8080/test.htmlhttp://site2:8080/test.html,可以看到瀏覽器將顯示出各自站點中的test.html網(wǎng)頁文件的內(nèi)容。

          可見,使用主機名的方式在同一臺WEB服務(wù)器上創(chuàng)建多個虛擬主機后,在WEB瀏覽器中使用主機名訪問Web服務(wù)器時,Web服務(wù)器將選擇與該主機名關(guān)聯(lián)的WEB站點進行響應(yīng)。通過這種方式,多個WEB站點可以共享同一個IP地址和相同的端口號,唯一不足的就是WEB瀏覽不能通過IP地址去訪問這些WEB站點。基于主機名的虛擬主機是目前Internet上的大多數(shù)虛擬主機業(yè)務(wù)提供商所通常采用的方式。只要找出幾個小型公司或個人的網(wǎng)站,如果在WEB瀏覽器地址欄中輸入“http://主機名”可以訪問到該WEB站點,接著在命令行窗口中執(zhí)行“ping 主機名”,查看到該域名對應(yīng)的IP地址,然后在WEB瀏覽器地址欄中輸入“http://IP地址”時,卻無法訪問這個WEB站點了,那么,這個WEB站點就是一個基于主機名的虛擬主機,它與其他一些WEB站點共享一臺WEB服務(wù)器,而不是自己獨享一臺WEB服務(wù)器。

           

          注意:當(dāng)使用安全套接字層 (SSL) 時,不能使用主機頭字段來實現(xiàn)虛擬主機,這是因為使用SSLHTTP請求有加密保護。主機頭字段是加密內(nèi)容的一部分,不能被解釋和路由到正確的站點。

          posted @ 2009-09-16 20:17 勒緊皮帶向前沖 閱讀(299) | 評論 (0)編輯 收藏
           

          從網(wǎng)上找的IE和FF下都兼容的加入收藏的代碼

           1很早就發(fā)現(xiàn)傳統(tǒng)的加入IE收藏夾的代碼在Firefox下是無效的。
           2
           3
           4<a href="javascript:window.external.AddFavorite('http://www.9enjoy.com','9Enjoy')">添加到收藏夾</a>
           5
           6
           7今天瀏覽im286,發(fā)現(xiàn)討論兩者兼容的代碼,調(diào)試后,發(fā)現(xiàn)可行:)
           8
           9第一段:
          10
          11
          12<script>
          13function addfavorite()
          14{
          15  if (document.all)
          16  {
          17     window.external.addFavorite('http://www.9enjoy.com','9Enjoy');
          18  }

          19  else if (window.sidebar)
          20  {
          21     window.sidebar.addPanel('9Enjoy''http://www.9enjoy.com'"");
          22  }

          23}
           
          24</script>
          25<a href="#" onclick="addfavorite()">把本博客加入收藏</a>
          26
          27
          28
          29下面一段更嚴謹,IE6,IE7,F(xiàn)F均通過。
          30
          31
          32<html>
          33<head>
          34<title>加入收藏</title>
          35<script language="JavaScript" type="text/javascript">
          36function JSAddFavorite()
          37{
          38
          39       if ( window.sidebar && "object" == typeof( window.sidebar ) && "function" == typeof( window.sidebar.addPanel ) )
          40
          41       {
          42
          43               //  firefox
          44
          45               window.sidebar.addPanel( '9Enjoy, 'http://www.9enjoy.com/', '' );
          46
          47       }

          48
          49       else if ( document.all && "object" == typeof( window.external ) )
          50
          51       {
          52
          53               //  ie
          54
          55               window.external.addFavorite( 'http://www.9enjoy.com/''9Enjoy' );
          56
          57       }

          58
          59}

          60
          61</script>
          62</head>
          63
          64<body>
          65<a href="javascript:JSAddFavorite();" title="加入收藏">加入收藏</a>
          66</body>
          67<html>
          68-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
          注,我使用以上代碼在FF上并未執(zhí)行成功。
          這個是我的代碼
           1<script language="javascript">
           2    function JSAddFavorite(){
           3        if(window.sidebar && "object" == typeof(window.sidebar) && "function"==typeof(window.sidebar.addPanel)){
           4            //firefox
           5            window.sidebar.addPanel("收藏標(biāo)記","http://www.xxxx.com");
           6        }

           7        else if(document.all && "object" == typeof(window.external)){
           8            //ie
           9            window.external.addFavorite("http://www.xxxx.com","收藏標(biāo)記");
          10        }

          11    }

          12    window.setTimeout("JSAddFavorite",60*1000);
          13</script>
          如上,在FF上執(zhí)行不成功。不知怎么回事?有知道的兄弟評論下。
          posted @ 2009-09-15 23:27 勒緊皮帶向前沖 閱讀(361) | 評論 (0)編輯 收藏
           
          [轉(zhuǎn)]jsp獲取客戶端ip和mac地址
          2009年04月10日 星期五 16:02

          最近做一個安全系統(tǒng),需要對用戶的 ip 和 mac 地址進行驗證,這里用到獲取客戶端ip和mac地址的兩個方法,留存。

          1.獲取客戶端ip地址( 這個必須從客戶端傳到后臺):
             jsp頁面下,很簡單,request.getRemoteAddr() ;
             因為系統(tǒng)的VIew層是用JSF來實現(xiàn)的,因此頁面上沒法直接獲得類似request,在bean里做了個強制轉(zhuǎn)換
             public String getMyIP() {
                  try {
                      FacesContext fc = FacesContext.getCurrentInstance();
                      HttpServletRequest request = (HttpServletRequest)fc.getExternalContext().getRequest();
                      return request.getRemoteAddr();
                  }
                  catch (Exception e) {
                      e.printStackTrace();
                  }
                  return "";
              }

          2.獲取客戶端mac地址
              調(diào)用window的命令,在后臺Bean里實現(xiàn) 通過ip來獲取mac地址。方法如下:

              public String getMACAddress(String ip){
                  String str = "";
                  String macAddress = "";
                  try {
                      Process p = Runtime.getRuntime().exec("nbtstat -A " + ip);
                      InputStreamReader ir = new InputStreamReader(p.getInputStream());
                      LineNumberReader input = new LineNumberReader(ir);
                      for (int i = 1; i < 100; i++) {
                          str = input.readLine();
                          if (str != null) {
                              if (str.indexOf("MAC Address") > 1) {
                                  macAddress = str.substring(str.indexOf("MAC Address") + 14, str.length());
                                  break;
                              }
                          }
                      }
                  } catch (IOException e) {
                      e.printStackTrace(System.out);
                  }
                  return macAddress;
              }

          posted @ 2009-09-14 12:14 勒緊皮帶向前沖 閱讀(2091) | 評論 (0)編輯 收藏
           

          Tomcat6.0配置(虛擬目錄的設(shè)置+多域名綁定)

          Tomcat6.0配置(虛擬目錄的設(shè)置+多域名綁定)

          優(yōu)點:tomcat6.0可以自動更新類和頁面,當(dāng)然如果修改了配置文件,或者web.xml和lib,則需要重啟tomcat才可以.
          配置更方便,開設(shè)站點只需修改一個conf文件。

          Step 1 JDK安裝
          ----------------------------------------------------------------------------------
          1.1 點擊jdk-6u1-windows-i586-p.exe文件安裝Jdk,選擇目錄(假使E:\jdk1.6),一路回車,安裝完成
          1.2 添加JAVA環(huán)境變量(我的電腦右鍵->屬性->高級->環(huán)境變量->系統(tǒng)變量)
                  CLASSPATH   設(shè)置變量值 .;%JAVA_HOME%/bin;%JAVA_HOME%/jre/bin;%JAVA_HOME%/lib;%JAVA_HOME%/lib/tools.jar;%JAVA_HOME%/lib/dt.jar
                  JAVA_HOME   設(shè)置變量值 C:\Program Files\Java\jdk1.6.0
                  PATH        設(shè)置變量值 .;%JAVA_HOME%;%JAVA_HOME%/bin;(原來里面有內(nèi)容的話 最后加入就行)
          1.3 在DOS命令行狀態(tài)下測試Java是否成功安裝,敲入java -version可以查看版本
               c:\>java -version
               java version "1.6.0_01"
               Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
               Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)
          1.4 測試HelloWorld,新建一個HelloWorld.java的文件,內(nèi)容如下
               public class HelloWorld {
                  public static void main(String arg[]) {
                     System.out.println("Hello World!這是Java測試程序,說明你已成功安裝了Java -- Jarry!");
                  }
               }
               在命令行輸入javac HelloWorld.java,編譯一下,然后再執(zhí)行java HelloWorld,就能看到正常的輸出了。
               出現(xiàn)錯誤一般是環(huán)境變量或大小寫等有問題,仔細檢查就沒有問題了。     


          Step 2 Tomcat安裝
          ----------------------------------------------------------------------------------
          2.1 點擊apache-tomcat-6.0.10.exe文件安裝Tomcat,選擇目錄(假使d:\Tomcat)安裝完成后
          2.2 添加TOMCAT環(huán)境變量(我的電腦右鍵->屬性->高級->環(huán)境變量->系統(tǒng)變量)
                   TOMCAT_HOME   設(shè)置變量值 d:/Tomcat
          2.3 從程序菜單或是服務(wù)里啟動Tomcat,然后你在瀏覽器輸入http://localhost:8080/就可以看到Tomcat歡迎頁面。
               正常情況下都會成功,如果啟動失敗,請檢查jakarta_service_日期.log日志,通過它一般可以解決問題。

               比如出現(xiàn)類似報錯:
               [947 prunsrv.c] [error] Failed creating java
               看一下系統(tǒng)盤windows/system32/下是否丟失msvcr71.dll文件,如果缺失,需要從別的機器拷貝一個過來。

               打開瀏覽器 進入http://localhost:8080/,當(dāng)看見Tomcat小貓的圖標(biāo)了,這樣表示安裝成功。

              至此,JSP服務(wù)器就搭建完成了,用于學(xué)習(xí)和測試沒有問題了,如果想要更高級的配置,可以往下面繼續(xù)看。

          Tomcat 6與Tomcat 5或者之前版本不一樣的就是,首頁沒有顯示具體的版本,貓貓也變大了些。
          沒有admin管理頁面了,admin在Tomcat 5.5來默認都沒有了,不過可以下載admin包。
          而Tomcat 6.0沒有看見admin包,不過這并不要緊,一般情況下也不需要admin包。

          Tomcat 6.0默認也沒有開啟servlet、禁止目錄瀏覽。這需要去conf/下配置web.xml文件。
          修改listings為true即可以目錄瀏覽,

                      <param-name>listings</param-name>
                      <param-value>true</param-value>
                      <!-- false disable listings -->
                      <!-- <param-value>false</param-value>-->         

          開啟servlet直接訪問功能,把這兩段注釋打開。

              <servlet>
                  <servlet-name>invoker</servlet-name>
                  <servlet-class>
                    org.apache.catalina.servlets.InvokerServlet
                  </servlet-class>
                  <init-param>
                      <param-name>debug</param-name>
                      <param-value>0</param-value>
                  </init-param>
                  <load-on-startup>2</load-on-startup>
              </servlet>

          <servlet-mapping>
                  <servlet-name>invoker</servlet-name>
                  <url-pattern>/servlet/*</url-pattern>
              </servlet-mapping>
             

          2.4 部署一個新項目chengqun,去conf/下配置server.xml

             <Context path="/chengqun" docBase="d:\tomcat\webapps\chengqun"></Context>
             
              chengqun是你程序的目錄    重啟Tomcat,訪問http://127.0.0.1:8080/chengqun就可以訪問了

           

           

          ======================================================================================================================
          域名綁定與虛擬目錄設(shè)置:
          server.xml 的修改方式如下:

          (一)多域名綁定

          1.如果你要綁定網(wǎng)站,首先是要把tomcat的默認訪問端口8080,修改成80

          原始:
          <Connector port="8080" protocol="HTTP/1.1"
                         connectionTimeout="20000"
                         redirectPort="8443" />

          修改后:
          <Connector port="80" protocol="HTTP/1.1"
                         connectionTimeout="20000"
                         redirectPort="8443" />

          其實這里就是把port:8080,修改成port:80就可以了,其他的參數(shù)不變

          2.接下來就是重點了哈哈...
          單個域名綁定:
          原始:
          <Engine name="Catalina" defaultHost="localhost">
          <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false" />
          </Engine>
          當(dāng)然這里我把注釋代碼統(tǒng)統(tǒng)刪除掉了,省的礙眼


          修改后:
          <Host name="chengqun.202.71one.com" debug="0" appBase="d:\wwwroot\chengqun"
                 unpackWARs="true" autoDeploy="true"
                 xmlValidation="false" xmlNamespaceAware="false">
          <Context path="/" docBase="d:\wwwroot\chengqun"></Context>
          </Host>


          <Host name="chengqun1.202.71one.com" debug="0" appBase="d:\wwwroot\chengqun1"
                 unpackWARs="true" autoDeploy="true"
                 xmlValidation="false" xmlNamespaceAware="false">
          <Context path="/" docBase="d:\wwwroot\chengqun1"></Context>
          </Host>

           

          多域名綁定:
          <Host name="chengqun.202.71one.com" debug="0" appBase="d:\wwwroot\chengqun"
                 unpackWARs="true" autoDeploy="true"
                 xmlValidation="false" xmlNamespaceAware="false">
          <Alias>chengqun.202.71one.com</Alias>
          <Alias>chengqun1.202.71one.com</Alias>
          <Alias>chengqun2.202.71one.com</Alias>
          <Context path="/" docBase="d:\wwwroot\chengqun"></Context>
          </Host>

          這里面的參數(shù)還有很多,我也不是很清楚,不過這樣做確實可以實現(xiàn)多域名綁定哈哈.而且網(wǎng)站頁面修改了只要直接覆蓋就可以了,tomcat可以自動更新類和頁面,當(dāng)然如果修改了web.xml或lib,則需要重啟tomcat才可以.


          (二)虛擬目錄
          (1)
          <Host name="chengqun.202.71one.com" debug="0" appBase="d:\wwwroot\chengqun"
                 unpackWARs="true" autoDeploy="true"
                 xmlValidation="false" xmlNamespaceAware="false">
          <Context path="/chengqun" docBase="d:\wwwroot\chengqun"></Context>
          </Host>
          其中,Host標(biāo)記是用來配置虛擬主機的,就是可以多個域名指向一個tomcat,格式只要參考默認的就

          可以了。

          <context>是Host標(biāo)記的子元素吧,表示一個虛擬目錄,它主要有兩個屬性,path就相當(dāng)于虛擬目錄名字,

          而 docbase則是具體的文件位置。在這里我的虛擬路徑名稱為chengqun,實際上我的程序也就是html、jsp、

          servlet都 放在了d:\wwwroot\chengqun這個目錄下了。

          這樣我就可以通過 chengqun.202. com/chengqun 訪問我的這個虛擬目錄了。

          另外一種方法是:

          <Host name="chengqun.202. com" debug="0" appBase="d:\wwwroot\chengqun"
                 unpackWARs="true" autoDeploy="true"
                 xmlValidation="false" xmlNamespaceAware="false">
          <Context path="/" docBase="d:\wwwroot\chengqun"></Context>
          </Host>
          這樣設(shè)置以后,輸入域名可以訪問這個站點程序了(Context path="/"這里不同)
          (2)
          沒有指定默認站點,所以直接輸入IP的時候,無法訪問。如何讓輸入ip就可以訪問指定的站點呢?
              修改server.xml的 <Engine name="Catalina" defaultHost="chengqun.202. com">
          這樣就可以實現(xiàn)了輸入ip訪問chengqun.202. com這個站點的程序了!

          posted @ 2009-09-14 11:34 勒緊皮帶向前沖 閱讀(2248) | 評論 (0)編輯 收藏
           
          今天由于客戶對功能提出新要求。采用js操作iframe解決問題。特記錄其中遇到的問題。
          用Js控制iframe內(nèi)表單提交
          代碼如下:
           1<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
           2<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
           3<html>
           4  <head>    
           5    <title>c.jsp</title>
           6    
           7    <meta http-equiv="pragma" content="no-cache">
           8    <meta http-equiv="cache-control" content="no-cache">
           9    <meta http-equiv="expires" content="0">    
          10    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
          11    <meta http-equiv="description" content="This is my page">    
          12
          13    <script type="text/javascript">
          14    <!--
          15        function reg(){
          16        jsi.document.all.username.value="xxx";
          17        jsi.document.all.userid.value="xxx>";
          18        jsi.document.all.flag.value="xxx";
          19          jsi.document.forms["jsf"].submit();        
          20          window.open("http://js.51baojian.net","_blank");  
          21          setTimeout("",3000);
          22          window.location.href="http://jss.51baojian.net";
          23    }

          24    -->
          25    </script>
          26  </head>
          27  
          28  <body onload="reg();">
          29    <table cellpadding="0" cellspacing="0" border="0">
          30        <tr><td>
          31            頁面進入中..
          32            <iframe id="jsi" name="jsi" frameborder="0"
          33                    src="b.jsp" height="0" width="0"
          34            ></iframe>
          35        </td></tr>        
          36    </table>
          37  </body>
          38</html>
          b.jsp代碼為:
          1
          2<form id="jsf" name="jsf" action="url">
          3    <input type="hidden" name="username" value="">
          4    <input type="hidden" name="userid" value="">
          5    <input type="hidden" name="flag" value="">                
          6</form>
          7
          注意:
          頁面加載時,遇到iframe就直接跳過去,加載下面的內(nèi)容,然后再回來加載iframe,當(dāng)然也可以理解成遇到iframe又開了一個線程來加載iframe,但是因為涉及到新的IO操作比較耗時,所以如果在iframe下寫了js操作的話,會提示錯誤。可以采用onload來觸發(fā)js操作執(zhí)行。
          在注意:(知道的就不要看了)

          onload指整個頁面加載完成后再執(zhí)行init()函數(shù),而不是當(dāng)頁面加載到<body>時就開始執(zhí)行。

          同樣,onunload指整個頁面卸載完成(關(guān)閉)后。

          posted @ 2009-08-20 14:19 勒緊皮帶向前沖 閱讀(3613) | 評論 (0)編輯 收藏
           
          hibernate hql distinct
          2008-08-03 14:15
          hibernate hql distinct
          在 hibernate的reference 中提到過hql是可以直接使用distinct的

          --
          關(guān)鍵字distinct與all 也可以使用,它們具有與SQL相同的語義.
          select distinct cat.name from Cat cat
          select count(distinct cat.name), count(cat) from Cat cat
          --

          所以,我就嘗試使用
          select distinct c.* from Column c, 在hql中,使用 * 必須要用到別名的
          查詢出的結(jié)果是 null來的.
          在mysql 中,這種寫法是沒有錯的,..然后我再試了一下
          select distinct c from Column c , 這樣得出的結(jié)果是非null,是正確的.
          posted @ 2009-08-17 17:16 勒緊皮帶向前沖 閱讀(9527) | 評論 (1)編輯 收藏
           

          HQL是個中立的語言,即它跟任何數(shù)據(jù)庫都沒關(guān)系,你如果使用HQL的話通過數(shù)據(jù)庫方言都會翻譯成相應(yīng)的數(shù)據(jù)庫的SQL語句,包括[排序,子查詢,調(diào)用SQL中的函數(shù)].
            HQL中關(guān)鍵字是不區(qū)分大小寫的,但是屬性和類型是區(qū)分大小寫的。
             1>.簡單屬性查詢
                1>).單一屬性查詢,返回結(jié)果集屬性列表,元素類型和實體類中相應(yīng)的屬性類型一致。如:
                    session = HibernateUtils.getSession();
                    session.beginTransaction();
                     
                    //返回結(jié)果集屬性列表,元素類型和實體類中相應(yīng)的屬性類型一致
                     List students = session.createQuery("select name from Student").list();
                     for (Iterator iter=students.iterator(); iter.hasNext();) {
                            String name = (String)iter.next();
                            System.out.println(name);
                     }
                session.getTransaction().commit();
                2>).多個屬性查詢,返回的集合元素是對象數(shù)組,數(shù)組元素的類型和對
                    應(yīng)的屬性在實體類中的類型一致,數(shù)組的長度取決于select中屬性的個數(shù)。如:
                    List students = session.createQuery("select id, name from Student").list();
                   for (Iterator iter=students.iterator(); iter.hasNext();) {
                          Object[] obj = (Object[])iter.next();
                          System.out.println(obj[0] + "," + obj[1]);
                    }
                3>).如果認為返回數(shù)組不夠?qū)ο蠡梢圆捎肏QL動態(tài)實例化Student對象,
                    但是Strudent類中必須提供相應(yīng)的構(gòu)造函數(shù)。如:
                    List students = session.createQuery("select new Student(id, name) from Student").list();
                    for (Iterator iter=students.iterator(); iter.hasNext();) {
                          Student student = (Student)iter.next();
                          System.out.println(student.getId() + "," + student.getName());
                    }
              2>.實體對象查詢
                 1>).返回Student對象的集合,可以忽略select,表可以使用別名,別名可以用as也可以不用。如:
                    List students = session.createQuery("from Student s").list();
                    //List students = session.createQuery("from Student as s").list();
                   for (Iterator iter=students.iterator(); iter.hasNext();) {
                           Student student = (Student)iter.next();
                           System.out.println(student.getName());
                     }
                 2>).返回Student對象的集合,使用select查詢實體對象,必須采用別名。如:
                    List students = session.createQuery("select s from Student as s").list();
                    for (Iterator iter=students.iterator(); iter.hasNext();) {
                          Student student = (Student)iter.next();
                           System.out.println(student.getName());
                    }
                 3>).不支持select * from .....這樣的查詢語句。如:下面的語句是錯誤的
                     List students = session.createQuery("select * from Student").list();
                 4>).list和iterator的區(qū)別?
                     我們知道,session.createQuery()得到個Query,而從Hibernate API中我們可
                     以發(fā)現(xiàn)Query有兩個方法list()和iterator()用于返回結(jié)果集。它們的區(qū)別在
                     于:
                     *list每次都會發(fā)出sql語句,list會向緩存中放入數(shù)據(jù),而不利用緩存中的數(shù)據(jù)
                     *iterator在默認情況下利用緩存數(shù)據(jù),但如果緩存中不存在數(shù)據(jù)有可能出現(xiàn)N+1問題
                  5>).N+1問題
                      在默認情況下,使用query.iterator()查詢,有可能出現(xiàn)N+1問題
                      1: 首先發(fā)出一條查詢對象id列表的sql語句
                      N: 根據(jù)id列表到緩存中查詢,如果緩存中不存在與之匹配的數(shù)據(jù),那么會根據(jù)
                         id發(fā)出相應(yīng)的sql語句
                      如:
                      Iterator iter = session.createQuery("from Student").iterate();
                  while(iter.hasNext()) {
                      Student student = (Student)iter.next();
                      System.out.println(student.getName());
                  }
              3>.條件查詢
                 1>).可以采用拼字符串的方式傳遞參數(shù)。如:
                         List students = session.createQuery("select s.id, s.name from Student s where s.name like '%1%'").list();
                         for (Iterator iter=students.iterator(); iter.hasNext();) {
                                Object[] obj = (Object[])iter.next();
                                 System.out.println(obj[0] + "," + obj[1]);
                          }
                 2>).可以使用?方式傳遞參數(shù),參數(shù)的索引從0開始;傳遞的參數(shù)值如果是字符型的,不用
                     單引號引起來;可以使用方法鏈編程。如:
                      List students = session.createQuery("select s.id, s.name from Student s where s.name like ?")
                                                          .setParameter(0, "%1%")
                                                          .list();
                     for (Iterator iter=students.iterator(); iter.hasNext();) {
                                 Object[] obj = (Object[])iter.next();
                                 System.out.println(obj[0] + "," + obj[1]);
                     }
                 3>).可以使用 :參數(shù)名稱 的方式傳遞參數(shù)值。如:
                        List students = session.createQuery("select s.id, s.name from Student s where s.name like :myname")
                                                             .setParameter("myname", "%1%")
                                                             .list();
                        for (Iterator iter=students.iterator(); iter.hasNext();) {
                                   Object[] obj = (Object[])iter.next();
                                   System.out.println(obj[0] + "," + obj[1]);
                       }
                 4>).如果傳遞多個參數(shù),可以使用setParameterList方法。如:
                     List students = session.createQuery("select s.id, s.name from Student s where s.id in(:myids)")
                                                          .setParameterList("myids", new Object[]{1, 2, 3, 4, 5})
                                                         .list();
                     for (Iterator iter=students.iterator(); iter.hasNext();) {
                             Object[] obj = (Object[])iter.next();
                             System.out.println(obj[0] + "," + obj[1]);
                     }
                 5>).在HQL中可以使用數(shù)據(jù)庫的函數(shù),像mysql中的date_format。如:
                       List students = session.createQuery("select s.id, s.name from Student s where date_format(s.createTime, '%Y-%m')=?")
                                                            .setParameter(0, "2008-02")
                                                            .list();
                        for (Iterator iter=students.iterator(); iter.hasNext();) {
                               Object[] obj = (Object[])iter.next();
                                System.out.println(obj[0] + "," + obj[1]);
                         }
                 6>).查詢某個日期段的數(shù)據(jù)。如:
                     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                     //查詢2008-01-10到2008-02-15創(chuàng)建的學(xué)生
                     List students = session.createQuery("select s.id, s.name from Student s where s.createTime between ? and ?")
                                                         .setParameter(0, sdf.parse("2008-01-10 00:00:00"))
                                                         .setParameter(1, sdf.parse("2008-02-15 23:59:59"))
                                                         .list();
                        for (Iterator iter=students.iterator(); iter.hasNext();) {
                               Object[] obj = (Object[])iter.next();
                                System.out.println(obj[0] + "," + obj[1]);
                          }

              4>.Hibernate也支持直接使用sql查詢。如:
                    List students = session.createSQLQuery("select * from t_student").list();
                    for (Iterator iter=students.iterator(); iter.hasNext();) {
                          Object[] obj = (Object[])iter.next();
                          System.out.println(obj[0] + "," + obj[1]);
                    }
              5>.外置命名查詢,主要完成hql語句和程序的解耦合.
                 1>).在映射文件中采用<query>標(biāo)簽來定義HQL語句。如:
                      <query name="searchStudents">
                          <![CDATA[
                                SELECT s FROM Student s where s.id<?
                           ]]>
                      </query>
                 2>).在程序中采用session.getNamedQuery()方法得到HQL查詢串。如:
                        List students = session.getNamedQuery("searchStudents")
                                                             .setParameter(0, 10)
                                                             .list();
                        for (Iterator iter=students.iterator(); iter.hasNext();) {
                               Student student = (Student)iter.next();
                               System.out.println(student.getName());
                         }
               6>.查詢過濾器
                 1>).在影射文件中定義過濾器參數(shù)。如:
                  <filter-def name="filtertest">
                          <filter-param name="myid" type="integer"/>
                  </filter-def>   
                 2>).在類的影射中使用這些參數(shù)。如:
                   <filter name="filtertest" condition="id &lt; :myid"/><!--&lt;轉(zhuǎn)義字符"<"-->
                 3>).在程序中啟用過濾器。如:
                   session.enableFilter("filtertest")
                               .setParameter("myid", 10);   
                   List students = session.createQuery("from Student").list();//會在該session中所有的查詢后自動加上過濾器中的條件
                   for (Iterator iter=students.iterator(); iter.hasNext();) {
                         Student student = (Student)iter.next();
                         System.out.println(student.getName());
                   }
                 參見:Student.hbm.xml,FilterQueryTest.java
               7>.分頁查詢
                  1>).setFirstResult()從0開始
                  2>).setMaxResults每頁顯示多少條數(shù)據(jù)。如:
                        List students = session.createQuery("from Student")
                                                             .setFirstResult(1)
                                                             .setMaxResults(2)
                                                             .list();
                        for (Iterator iter=students.iterator(); iter.hasNext();) {
                               Student student = (Student)iter.next();
                               System.out.println(student.getName());
                       }
               8>.對象導(dǎo)航查詢
                  Hibernate支持對象的,因此可以用對象導(dǎo)航查詢。如:
                  Student類總有Classes類型的屬性classes,而Classes類有name屬性。我們通過classes的name來查詢student:
                  List students = session.createQuery("select s.name from Student s where s.classes.name like '%1%'").list();
                  for (Iterator iter=students.iterator(); iter.hasNext();) {
                       String name = (String)iter.next();
                       System.out.println(name);
                 }
               9>.連接查詢
                  1>).內(nèi)連接:只是把兩邊都有的記錄查出來,可以省略inner,并且只要影射文件中已經(jīng)設(shè)好了表之間的關(guān)系,無須用on表示查詢條件。如:
                     //List students = session.createQuery("select c.name, s.name from Student s join s.classes c").list();
                     List students = session.createQuery("select c.name, s.name from Student s inner join s.classes c").list();
                     for (Iterator iter=students.iterator(); iter.hasNext();) {
                          Object[] obj = (Object[])iter.next();
                          System.out.println(obj[0] + "," + obj[1]);
                     }
                  2>).外左連接:把左邊表的所有記錄都顯示出來。如:
                       List students = session.createQuery("select c.name, s.name from Classes c left join c.students s").list();
                       for (Iterator iter=students.iterator(); iter.hasNext();) {
                            Object[] obj = (Object[])iter.next();
                            System.out.println(obj[0] + "," + obj[1]);
                       }
                  3>).外右連接:把右邊表的所有記錄都顯示出來。如:
                       List students = session.createQuery("select c.name, s.name from Classes c right join c.students s").list();
                        for (Iterator iter=students.iterator(); iter.hasNext();) {
                             Object[] obj = (Object[])iter.next();
                             System.out.println(obj[0] + "," + obj[1]);
                       }
               10>.統(tǒng)計查詢
                  1>).count。如:
                      Long count = (Long)session.createQuery("select count(*) from Student").uniqueResult();//返回的是單條記錄
                      System.out.println(count);
                  2>).group by。如:
                      List students =session.createQuery("select c.name, count(s) from Student s join s.classes c " +
                              "group by c.name order by c.name").list();
                     for (Iterator iter=students.iterator(); iter.hasNext();) {
                          Object[] obj = (Object[])iter.next();
                          System.out.println(obj[0] + ", " + obj[1]);
                     }
               11>.DML風(fēng)格的操作(盡量少用,因為緩存不同步)
                  update和delete只會更新數(shù)據(jù)庫中的數(shù)據(jù),而緩存中不會改,此時如果取得該數(shù)據(jù)還是緩存中的,而不會是更新后的,因此緩
                  存中的數(shù)據(jù)就成了臟數(shù)據(jù)了。如果批量更新的話,還會給內(nèi)存帶來很大壓力。如:
                  session.createQuery("update Student s set s.name=? where s.id < ?")
                              .setParameter(0, "李四")
                              .setParameter(1, 5)
                              .executeUpdate();


          本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/yangfeitarena/archive/2009/04/17/4086334.aspx

          posted @ 2009-08-17 11:44 勒緊皮帶向前沖 閱讀(351) | 評論 (0)編輯 收藏
           

          點擊“開始”—>“設(shè)置”——>“控制面板”—>“任務(wù)計劃”—>“添加任務(wù)計劃”—>讓后按照任務(wù)向?qū)гO(shè)置即可。

          posted @ 2009-06-25 23:42 勒緊皮帶向前沖 閱讀(245) | 評論 (0)編輯 收藏
           

           

           1<div id="img" style="position:absolute;; width: 200; height: 151"><a href="#" target="_blank"><img src="images/170_19.gif" width="325" height="139" border="0" /></a></div> 2<script language="javascript">
           3 var xPos = 20;
           4var yPos = 10;
           5img.style.left= xPos;
           6img.style.top = yPos;
           7var step = 1;
           8var delay = 30
           9var width,height,Hoffset,Woffset;
          10var y = 1;
          11var x = 1;
          12var interval;
          13img.visibility = "visible";function changePos() 
          14{
          15width = document.body.clientWidth;
          16height = document.body.clientHeight;
          17Hoffset = img.offsetHeight;
          18Woffset = img.offsetWidth;
          19if (y) 
          20{
          21    yPos = yPos + step;
          22}

          23else 
          24{
          25    yPos = yPos - step;
          26}

          27if (yPos < 0
          28{
          29    y = 1;
          30    yPos = 0;
          31}

          32if (yPos >= (height - Hoffset)) 
          33{
          34    y = 0;
          35    yPos = (height - Hoffset);
          36}

          37if (x) 
          38{
          39    xPos = xPos + step;
          40}

          41else 
          42{
          43    xPos = xPos - step;
          44}

          45if (xPos < 0
          46{
          47    x = 1;
          48    xPos = 0;
          49}

          50if (xPos >= (width - Woffset)) 
          51{
          52    x = 0;
          53    xPos = (width - Woffset);
          54}

          55img.style.left = xPos + document.body.scrollLeft;
          56img.style.top = yPos + document.body.scrollTop;
          57}
          function start() 
          58{
          59interval = setInterval('changePos()', delay);
          60}
          function pause_resume() 
          61{
          62    clearInterval(interval);
          63}

          64start();
          65
          </script>
          posted @ 2009-06-16 15:32 勒緊皮帶向前沖 閱讀(1015) | 評論 (0)編輯 收藏
           
          安裝完服務(wù)器后,放上自己的網(wǎng)站。。測試,暈竟然出現(xiàn)如下錯誤提示:</P>
          Active Server Pages 錯誤 \'ASP 0131\'

          不允許的父路徑

          /exam/admin/login.asp,行 1

          包含文件 \'../include/conn.asp\' 不能用 \'..\' 表示父目錄。</P>
          特別郁悶,2000 Server 下不會有這個啊。。我到網(wǎng)上找了一下才明白。。</P>
          解決方法如下:</P>
          Internet 信息服務(wù)(IIS)管理器>>網(wǎng)站站點>>屬性>>主目錄選項卡>>配置》選項》勾上"啟用父路徑"的復(fù)選框即可.

          默認不啟用啟用父路徑估計是一項安全設(shè)置 :)

          posted @ 2009-06-02 14:45 勒緊皮帶向前沖 閱讀(295) | 評論 (0)編輯 收藏
          僅列出標(biāo)題
          共14頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
           
          主站蜘蛛池模板: 汉源县| 开化县| 城步| 乌拉特前旗| 白沙| 德令哈市| 汤阴县| 祁东县| 凌云县| 小金县| 鄢陵县| 丰原市| 台南市| 柳州市| 阳信县| 浦江县| 拜城县| 射洪县| 黑河市| 镇原县| 榆树市| 蕲春县| 当雄县| 芜湖县| 屏山县| 塘沽区| 五河县| 南平市| 新蔡县| 龙南县| 长寿区| 扎囊县| 沙湾县| 天水市| 静乐县| 新巴尔虎左旗| 临夏市| 汝阳县| 沙湾县| 英德市| 丰镇市|