一、網站系統的組成只要在一臺計算機上安裝了WEB服務器軟件,從功能上講,這臺計算機就可以稱為WEB服務器。一個網站的規模可大可小,功能可多可少,最簡單的網站只需要一臺Web服務器即可對外提供網頁瀏覽服務。復雜的網站包括多臺WEB服務器組成的群集系統、負載均衡設備、具有緩存功能的代理服務器(可以有多級,甚至包括放置在服務器端的緩存系統)、數據庫系統等,如圖2.2所示。
www.sina.com網站系統采用的基本上就是圖2.2所示的架構,不同地區的人們在訪問www.sina.com站點時,瀏覽器實際上所訪問的服務器是不一樣的,例如,吉林省的用戶訪問的服務器實際是sina放在吉林地區的代理服務器,湖北省的用戶訪問的服務器實際是sina放在湖北地區的代理服務器。各地區的瀏覽器訪問www.sina.com站點的過程如圖2.3所示。
為了能夠讓瀏覽器透明地訪問到WEB站點,讓用戶感覺不到是在訪問區域代理服務器,在DNS系統中需要將www.sina.com主機名指向所有的區域代理服務器的IP地址。在瀏覽器訪問www.sina.com站點中的頁面而向DNS服務器請求解析www.sina.com主機名時,DNS服務器根據訪問者的地理位置信息返回他附近的區域代理服務器的IP地址,這樣,瀏覽器的訪問請求將發送給該區域代理服務器。只有當區域代理服務器中沒有瀏覽器要訪問的頁面時,區域代理服務器才去從真正的www.sina.com站點服務器上獲取該頁面并進行緩存,以后該區域的其他瀏覽器就都可以就近從區域代理服務器中訪問到該頁面了,從而大大提高了訪問效率和減少了網絡流量。
二、基于主機名的虛擬主機WEB瀏覽器與WEB服務器建立連接后,除了將請求URL中的資源路徑發送給WEB服務器外,還會將URL中的主機名部分作為HTTP請求消息的Host頭發送給WEB服務器。例如,在瀏覽器地址欄中輸入http://www.it315.org,瀏覽器發送給www.it315.org主機上的WEB服務器的請求消息內容如下: GET / HTTP/1.1<回車> Host: www.it315.org<回車> <回車> WEB服務器接收到瀏覽器的訪問請求消息后,根據Host頭字段中所設置的主機名,就知道該選擇哪個WEB站點來進行響應,因此,可以使用不同的主機名來作為區分同一個WEB服務器上的不同站點的標識信息。 Tomcat的Server.xml配置文件中有一個<Host>元素,一個<Host>元素用于建立一個WEB站點,使用多個<Host>元素則可以建立多個WEB站點。<Host>元素的父級元素為<Engine>元素,嵌套在同一個<Engine>元素中的多個<Host>元素的name屬性不能相同,<Host>元素的name屬性指定WEB站點所對應的主機名稱。Tomcat的Server.xml配置文件中初始設置的<Host>元素內容如下: <Host name="localhost" appBase="webapps" …> … </Host> <Host>元素中的appBase屬性指定了一個路徑,該路徑將作為嵌套在它里面的<Context>元素的docBase屬性中設置的相對路徑的基準路徑。 當Tomcat接收到訪問請求時,將比較請求消息中的Host頭字段的值與<Host>元素的name屬性值,并以匹配的<Host>元素所創建的WEB站點來響應。如果Server.xml文件中沒有與請求消息的Host頭字段匹配的<Host>元素,Tomcat將以默認的WEB站點來響應。只要<Engine>元素的defaultHost屬性設置為嵌套在它里面的某個<Host>元素的name屬性值,該<Host>元素所創建的WEB站點就成了該引擎的默認WEB站點。例如,Tomcat的Server.xml文件中的<Engine>元素的默認設置如下: <Engine name="Standalone" defaultHost="localhost" debug="0"> … <Host name="localhost" appBase="webapps" …> … </Host> … </Engine> 上面的這段配置信息說明,該引擎的默認WEB站點為嵌套在<Engine>元素中的name屬性為“localhost”的<Host>元素所創建的WEB站點。 在同一臺計算機上建立了多個基于主機名的虛擬主機后,WEB瀏覽器要訪問其中的某個虛擬主機的資源時,在訪問URL中必須采用主機名,而不能采用IP地址。這是因為WEB瀏覽器要將URL中的主機名部分作為HTTP請求消息的Host頭發送給WEB服務器,如果URL中的主機名部分使用的是IP地址,那么,瀏覽器發出的請求消息中的Host頭字段的值就是這個IP地址,而在同一臺計算機上建立的多個基于主機名的虛擬主機共享同一個IP地址,在Host頭字段使用IP地址根本就無法區分不同的站點。 即使在URL中指定的是主機名時,WEB瀏覽器還是要先獲得該主機名所對應的IP地址,然后再使用這個IP去連接WEB服務器。所以,在建立基于主機名的虛擬主機時,除了要在Tomcat的server.xml文件中進行設置外,還需要在整個網絡系統中建立主機名與IP地址的映射關系,即必須將主機名添加到名稱解析系統,以便WEB瀏覽器能夠從名稱解析系統中查詢出主機名所對應的IP地址。建立主機名與IP地址的映射關系的慣用方式有兩種:一是使用客戶機本地的Hosts 文件,二是使用DNS(Domain Name System,域名系統)服務器。Hosts 文件和DNS的作用都是允許用戶使用“友好”的、文本格式的主機名稱,而不是數字格式的IP地址來訪問網絡中的計算機。Hosts文件可用于小型的Intranet(企業內部網),網絡中的所有計算機上都需要使用Hosts文件。DNS通常用于大型的網絡,特別是Internet上對外提供服務的計算機都是通過DNS來建立其主機名與IP地址的映射關系。客戶機首先在本地的Hosts文件中查找主機名稱所映射的IP地址,如果沒有找到,再去查詢DNS服務器。為了簡單起見,這里僅介紹一下Hosts文件。對于Windows 2000系統,Hosts 文件位于操作系統根目錄(取決操作系統所在的分區,通常是c:\winnt)下的System32\Drivers\Etc子目錄中,默認情況下,該文件中有如下一行內容: 127.0.0.1 localhost 這行文本的作用就是將IP地址(127.0.0.1)映射成主機名(localhost),這也就是在IE瀏覽器地址欄中可以使用localhost訪問本地WEB服務器的原因。如果要增加更多的主機名與IP地址的映射,可以在Hosts文件中增加更多的行,然后參照上面這行內容的格式在每行中填寫IP地址和相應的主機名。 :動手體驗:使用Tomcat建立基于主機名的虛擬主機 (1)用UltraEdit打開<Tomcat主目錄>/conf目錄下的Server.xml文件,使用“查找”菜單查找內容為“</Host>”的行,緊接該行下面增加一對<Host></Host>標簽。參照前面的<Host>標簽的屬性設置情況,設置新增的<Host>標簽的屬性,并在它里面嵌套一個設置該WEB站點根目錄的<Context>元素,最終的內容如下: <Host name="site1" debug="0" appBase="d:\VirtualHost1"> <Context path="" docBase="." debug="0"/> </Host> 這樣,將創建一個新的WEB站點。上面的<Context>元素的docBase屬性值被設置為一個點(.),即表示使用<Host>元素的appBase屬性中所設置的路徑作為這個<Context>所映射的目錄。 (2)在上面新增的<Host></Host>標簽對下面再增加一對<Host></Host>標簽,并將它設置為如下形式: <Host name="site2" debug="0" appBase="d:\VirtualHost2"> <Context path="" docBase="." debug="0"/> </Host> 這又創建了一個新的WEB站點,該站點的主機名稱為site2,根目錄對應的本地文件系統目錄為d:\VirtualHost2。 (3)在d:盤下創建名稱為VirtualHost1和VirtualHost2兩個目錄,并在這兩個目錄中分別創建一個名為test.html的文件,在d:\VirtualHost1\test.html文件中寫入如下一行內容: 這是d:\VirtualHost1目錄中的test.html文件 在d:\VirtualHost2\test.html文件中寫入如下一行內容: 這是d:\VirtualHost2目錄中的test.html文件 (4)保存修改后的Server.xml文件,重新啟動Tomcat WEB服務器程序。打開一個新的命令行窗口中,并在這個命令行窗口中執行如下命令: telnet 127.0.0.1 8080 接著在連接成功的telnet程序命令窗口中,輸入如下內容: GET /test.html HTTP/1.1<回車> Host:<空格>site1<回車> <回車> 這時在telnet程序窗口中可以看到,WEB服務器返回內容的正文部分為d:\VirtualHost1\test.html文件中的內容。接著WEB服務器返回內容的下邊,輸入如下內容: GET /test.html HTTP/1.1<回車> Host:<空格>site2<回車> <回車> 在telnet程序窗口中又可以看到,WEB服務器這次返回內容的正文部分為d:\VirtualHost2\test.html文件中的內容。接著WEB服務器返回內容的下邊,輸入如下內容: GET /test.html HTTP/1.1<回車> Host:<空格><回車> <回車> 在telnet程序窗口中又可以看到,WEB服務器這次返回內容的正文部分為d:\test\test.html文件中的內容。接著WEB服務器返回內容的下邊,再次輸入如下內容: GET /test.html HTTP/1.1<回車> Host:<空格>xxx<回車> <回車> 在telnet程序窗口中又可以看到,WEB服務器這次返回內容的正文部分仍然為d:\test\test.html文件中的內容。 上面的整個交互過程如圖2.34所示,Tomcat根據第1次和第2次請求中所指定Host頭的值,查找Server.xml文件中與之相匹配的<Host>元素的name屬性值,并以匹配的<Host>元素所設置的WEB站點來響應;在第3次和第4次請求中所指定Host頭的值,在Server.xml文件中沒有與之對應的<Host>元素的name屬性值,Tomcat將以默認的WEB站點來響應。
(5)在Windows 2000系統中,用記事本程序打開c:\winnt\System32\Drivers\Etc\Hosts文件,可以看到有如下一行內容: 127.0.0.1 localhost 緊接這行文本的下面,用它復制出兩行文本,并將這兩行文本中的localhost分別修改成site1和site2,這樣,就使用Hosts文件為當前計算機設置了多個主機名。如果要用site1和site2這個兩主機名訪問其他計算機上的WEB站點,則應將127.0.0.1修改成其他計算機的實際IP地址。保存Hosts文件后,在命令行窗口中執行“ping site1”和“ping site2”命令,查看該主機名是否被正確解析到了相應的IP地址上。建立site1和site2與計算機IP地址的映射后,在IE瀏覽器地址欄中輸入http://localhost:8080/test.html、http://site1:8080/test.html和http://site2:8080/test.html,可以看到瀏覽器將顯示出各自站點中的test.html網頁文件的內容。
可見,使用主機名的方式在同一臺WEB服務器上創建多個虛擬主機后,在WEB瀏覽器中使用主機名訪問Web服務器時,Web服務器將選擇與該主機名關聯的WEB站點進行響應。通過這種方式,多個WEB站點可以共享同一個IP地址和相同的端口號,唯一不足的就是WEB瀏覽不能通過IP地址去訪問這些WEB站點。基于主機名的虛擬主機是目前Internet上的大多數虛擬主機業務提供商所通常采用的方式。只要找出幾個小型公司或個人的網站,如果在WEB瀏覽器地址欄中輸入“http://主機名”可以訪問到該WEB站點,接著在命令行窗口中執行“ping 主機名”,查看到該域名對應的IP地址,然后在WEB瀏覽器地址欄中輸入“http://IP地址”時,卻無法訪問這個WEB站點了,那么,這個WEB站點就是一個基于主機名的虛擬主機,它與其他一些WEB站點共享一臺WEB服務器,而不是自己獨享一臺WEB服務器。
注意:當使用安全套接字層 (SSL) 時,不能使用主機頭字段來實現虛擬主機,這是因為使用SSL的HTTP請求有加密保護。主機頭字段是加密內容的一部分,不能被解釋和路由到正確的站點。 |
從網上找的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上并未執行成功。

2

3

4

5

6

7

8

9

10

11

12

13

最近做一個安全系統,需要對用戶的 ip 和 mac 地址進行驗證,這里用到獲取客戶端ip和mac地址的兩個方法,留存。 1.獲取客戶端ip地址( 這個必須從客戶端傳到后臺): 2.獲取客戶端mac地址 public String getMACAddress(String ip){ |
Tomcat6.0配置(虛擬目錄的設置+多域名綁定)
Tomcat6.0配置(虛擬目錄的設置+多域名綁定)
優點:tomcat6.0可以自動更新類和頁面,當然如果修改了配置文件,或者web.xml和lib,則需要重啟tomcat才可以.
配置更方便,開設站點只需修改一個conf文件。
Step 1 JDK安裝
----------------------------------------------------------------------------------
1.1 點擊jdk-6u1-windows-i586-p.exe文件安裝Jdk,選擇目錄(假使E:\jdk1.6),一路回車,安裝完成
1.2 添加JAVA環境變量(我的電腦右鍵->屬性->高級->環境變量->系統變量)
CLASSPATH 設置變量值 .;%JAVA_HOME%/bin;%JAVA_HOME%/jre/bin;%JAVA_HOME%/lib;%JAVA_HOME%/lib/tools.jar;%JAVA_HOME%/lib/dt.jar
JAVA_HOME 設置變量值 C:\Program Files\Java\jdk1.6.0
PATH 設置變量值 .;%JAVA_HOME%;%JAVA_HOME%/bin;(原來里面有內容的話 最后加入就行)
1.3 在DOS命令行狀態下測試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的文件,內容如下
public class HelloWorld {
public static void main(String arg[]) {
System.out.println("Hello World!這是Java測試程序,說明你已成功安裝了Java -- Jarry!");
}
}
在命令行輸入javac HelloWorld.java,編譯一下,然后再執行java HelloWorld,就能看到正常的輸出了。
出現錯誤一般是環境變量或大小寫等有問題,仔細檢查就沒有問題了。
Step 2 Tomcat安裝
----------------------------------------------------------------------------------
2.1 點擊apache-tomcat-6.0.10.exe文件安裝Tomcat,選擇目錄(假使d:\Tomcat)安裝完成后
2.2 添加TOMCAT環境變量(我的電腦右鍵->屬性->高級->環境變量->系統變量)
TOMCAT_HOME 設置變量值 d:/Tomcat
2.3 從程序菜單或是服務里啟動Tomcat,然后你在瀏覽器輸入http://localhost:8080/就可以看到Tomcat歡迎頁面。
正常情況下都會成功,如果啟動失敗,請檢查jakarta_service_日期.log日志,通過它一般可以解決問題。
比如出現類似報錯:
[947 prunsrv.c] [error] Failed creating java
看一下系統盤windows/system32/下是否丟失msvcr71.dll文件,如果缺失,需要從別的機器拷貝一個過來。
打開瀏覽器 進入http://localhost:8080/,當看見Tomcat小貓的圖標了,這樣表示安裝成功。
至此,JSP服務器就搭建完成了,用于學習和測試沒有問題了,如果想要更高級的配置,可以往下面繼續看。
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就可以訪問了
======================================================================================================================
域名綁定與虛擬目錄設置:
server.xml 的修改方式如下:
(一)多域名綁定
1.如果你要綁定網站,首先是要把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就可以了,其他的參數不變
2.接下來就是重點了哈哈...
單個域名綁定:
原始:
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false" />
</Engine>
當然這里我把注釋代碼統統刪除掉了,省的礙眼
修改后:
<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>
這里面的參數還有很多,我也不是很清楚,不過這樣做確實可以實現多域名綁定哈哈.而且網站頁面修改了只要直接覆蓋就可以了,tomcat可以自動更新類和頁面,當然如果修改了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標記是用來配置虛擬主機的,就是可以多個域名指向一個tomcat,格式只要參考默認的就
可以了。
<context>是Host標記的子元素吧,表示一個虛擬目錄,它主要有兩個屬性,path就相當于虛擬目錄名字,
而 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>
這樣設置以后,輸入域名可以訪問這個站點程序了(Context path="/"這里不同)
(2)
沒有指定默認站點,所以直接輸入IP的時候,無法訪問。如何讓輸入ip就可以訪問指定的站點呢?
修改server.xml的 <Engine name="Catalina" defaultHost="chengqun.202. com">
這樣就可以實現了輸入ip訪問chengqun.202. com這個站點的程序了!
用Js控制iframe內表單提交
代碼如下:

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就直接跳過去,加載下面的內容,然后再回來加載iframe,當然也可以理解成遇到iframe又開了一個線程來加載iframe,但是因為涉及到新的IO操作比較耗時,所以如果在iframe下寫了js操作的話,會提示錯誤。可以采用onload來觸發js操作執行。
在注意:(知道的就不要看了)
onload指整個頁面加載完成后再執行init()函數,而不是當頁面加載到<body>時就開始執行。
同樣,onunload指整個頁面卸載完成(關閉)后。
|
HQL是個中立的語言,即它跟任何數據庫都沒關系,你如果使用HQL的話通過數據庫方言都會翻譯成相應的數據庫的SQL語句,包括[排序,子查詢,調用SQL中的函數].
HQL中關鍵字是不區分大小寫的,但是屬性和類型是區分大小寫的。
1>.簡單屬性查詢
1>).單一屬性查詢,返回結果集屬性列表,元素類型和實體類中相應的屬性類型一致。如:
session = HibernateUtils.getSession();
session.beginTransaction();
//返回結果集屬性列表,元素類型和實體類中相應的屬性類型一致
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>).多個屬性查詢,返回的集合元素是對象數組,數組元素的類型和對
應的屬性在實體類中的類型一致,數組的長度取決于select中屬性的個數。如:
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>).如果認為返回數組不夠對象化,可以采用HQL動態實例化Student對象,
但是Strudent類中必須提供相應的構造函數。如:
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的區別?
我們知道,session.createQuery()得到個Query,而從Hibernate API中我們可
以發現Query有兩個方法list()和iterator()用于返回結果集。它們的區別在
于:
*list每次都會發出sql語句,list會向緩存中放入數據,而不利用緩存中的數據
*iterator在默認情況下利用緩存數據,但如果緩存中不存在數據有可能出現N+1問題
5>).N+1問題
在默認情況下,使用query.iterator()查詢,有可能出現N+1問題
1: 首先發出一條查詢對象id列表的sql語句
N: 根據id列表到緩存中查詢,如果緩存中不存在與之匹配的數據,那么會根據
id發出相應的sql語句
如:
Iterator iter = session.createQuery("from Student").iterate();
while(iter.hasNext()) {
Student student = (Student)iter.next();
System.out.println(student.getName());
}
3>.條件查詢
1>).可以采用拼字符串的方式傳遞參數。如:
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>).可以使用?方式傳遞參數,參數的索引從0開始;傳遞的參數值如果是字符型的,不用
單引號引起來;可以使用方法鏈編程。如:
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>).可以使用 :參數名稱 的方式傳遞參數值。如:
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>).如果傳遞多個參數,可以使用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中可以使用數據庫的函數,像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>).查詢某個日期段的數據。如:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//查詢2008-01-10到2008-02-15創建的學生
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>標簽來定義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>).在影射文件中定義過濾器參數。如:
<filter-def name="filtertest">
<filter-param name="myid" type="integer"/>
</filter-def>
2>).在類的影射中使用這些參數。如:
<filter name="filtertest" condition="id < :myid"/><!--<轉義字符"<"-->
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每頁顯示多少條數據。如:
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>.對象導航查詢
Hibernate支持對象的,因此可以用對象導航查詢。如:
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>).內連接:只是把兩邊都有的記錄查出來,可以省略inner,并且只要影射文件中已經設好了表之間的關系,無須用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>.統計查詢
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風格的操作(盡量少用,因為緩存不同步)
update和delete只會更新數據庫中的數據,而緩存中不會改,此時如果取得該數據還是緩存中的,而不會是更新后的,因此緩
存中的數據就成了臟數據了。如果批量更新的話,還會給內存帶來很大壓力。如:
session.createQuery("update Student s set s.name=? where s.id < ?")
.setParameter(0, "李四")
.setParameter(1, 5)
.executeUpdate();
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/yangfeitarena/archive/2009/04/17/4086334.aspx
點擊“開始”—>“設置”——>“控制面板”—>“任務計劃”—>“添加任務計劃”—>讓后按照任務向導設置即可。


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 下不會有這個啊。。我到網上找了一下才明白。。</P>
解決方法如下:</P>
Internet 信息服務(IIS)管理器>>網站站點>>屬性>>主目錄選項卡>>配置》選項》勾上"啟用父路徑"的復選框即可.
默認不啟用啟用父路徑估計是一項安全設置 :)