一、網(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所示。
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所示。
為了能夠讓瀏覽器透明地訪問到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)識信息。 Tomcat的Server.xml配置文件中有一個<Host>元素,一個<Host>元素用于建立一個WEB站點,使用多個<Host>元素則可以建立多個WEB站點。<Host>元素的父級元素為<Engine>元素,嵌套在同一個<Engine>元素中的多個<Host>元素的name屬性不能相同,<Host>元素的name屬性指定WEB站點所對應(yīng)的主機名稱。Tomcat的Server.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站點。例如,Tomcat的Server.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ù)器。所以,在建立基于主機名的虛擬主機時,除了要在Tomcat的server.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)建名稱為VirtualHost1和VirtualHost2兩個目錄,并在這兩個目錄中分別創(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)。
(5)在Windows 2000系統(tǒng)中,用記事本程序打開c:\winnt\System32\Drivers\Etc\Hosts文件,可以看到有如下一行內(nèi)容: 127.0.0.1 localhost 緊接這行文本的下面,用它復(fù)制出兩行文本,并將這兩行文本中的localhost分別修改成site1和site2,這樣,就使用Hosts文件為當(dāng)前計算機設(shè)置了多個主機名。如果要用site1和site2這個兩主機名訪問其他計算機上的WEB站點,則應(yīng)將127.0.0.1修改成其他計算機的實際IP地址。保存Hosts文件后,在命令行窗口中執(zhí)行“ping site1”和“ping site2”命令,查看該主機名是否被正確解析到了相應(yīng)的IP地址上。建立site1和site2與計算機IP地址的映射后,在IE瀏覽器地址欄中輸入http://localhost:8080/test.html、http://site1:8080/test.html和http://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)虛擬主機,這是因為使用SSL的HTTP請求有加密保護。主機頭字段是加密內(nèi)容的一部分,不能被解釋和路由到正確的站點。 |
從網(wǎng)上找的IE和FF下都兼容的加入收藏的代碼

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

注,我使用以上代碼在FF上并未執(zhí)行成功。

2

3

4

5

6

7

8

9

10

11

12

13

最近做一個安全系統(tǒng),需要對用戶的 ip 和 mac 地址進行驗證,這里用到獲取客戶端ip和mac地址的兩個方法,留存。 1.獲取客戶端ip地址( 這個必須從客戶端傳到后臺): 2.獲取客戶端mac地址 public String getMACAddress(String ip){ |
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這個站點的程序了!
用Js控制iframe內(nèi)表單提交
代碼如下:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31




32

33

34

35

36

37

38


2

3

4

5

6

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)閉)后。
|
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 < :myid"/><!--<轉(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
點擊“開始”—>“設(shè)置”——>“控制面板”—>“任務(wù)計劃”—>“添加任務(wù)計劃”—>讓后按照任務(wù)向?qū)гO(shè)置即可。


3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

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è)置 :)