Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
、《JSP頁(yè)面實(shí)際上就是Servlet》
2、《JSP頁(yè)面中最常使用的腳本元素》
3、《JSP頁(yè)面隱藏了哪些對(duì)象》
Page指令
我們?cè)谡f(shuō)《JSP頁(yè)面中最常使用的腳本元素》的時(shí)候,提到了指令標(biāo)簽
而Page指令,就是一種極其常見(jiàn)的指令
之前使用的例子:
Page指令可以在頁(yè)面內(nèi)隨便放置,一般是放在頁(yè)首的位置。
里面有很多使用:
(1)language:
language屬性有默認(rèn),寫(xiě)成別的編譯不了
寫(xiě)法是:<%@ page language="java"%>
(2)extends:
標(biāo)明JSP編譯時(shí)需要加入的Class的全名,最好不使用它,它會(huì)限制JSP的編譯能力.
寫(xiě)法是: <%@ page extends="package.class"%>
(3)import:
import屬性,寫(xiě)了之后會(huì)自動(dòng)添加到servlet的import語(yǔ)句中,但不進(jìn)行包存在性的檢查;
寫(xiě)法:<%@ page import="java.util.*"%>
(4)session:
Session對(duì)象是否參與會(huì)話,session="false"就沒(méi)有session對(duì)象了
寫(xiě)法:<%@ page session="false"%>
(5)buffer:
buffer屬性指定out對(duì)象(JspWriter)使用的緩沖區(qū)大小,以kb為單位,默認(rèn)8kb
寫(xiě)法:<%@ page buffer="none"%>
(6)autoFlush:
autoFlush屬性控制當(dāng)緩沖區(qū)滿了后,是自動(dòng)清空輸出緩沖區(qū)(默認(rèn)true),還是在緩沖區(qū)溢出后拋出異常(false)。
寫(xiě)法:<%@ page autoFlush="true"%>
(7)isThreadSafe:
isThreadSafe問(wèn)你的應(yīng)用是否是線程安全的,缺省為true,表示應(yīng)用是線程安全的,可以同時(shí)響應(yīng)多個(gè)請(qǐng)求;如果設(shè)置為false,那么一次只能處理一個(gè)用戶(hù)請(qǐng)求。
寫(xiě)法:<%@ page isThreadSafe="false"%>
(8)info:
定義一個(gè)可以在servlet中通過(guò)getServletInfo方法獲取的字符串。 jsp容器做的是在servlet中生成getServletInfo方法返回info屬性指定的String
寫(xiě)法:<%@ page info="infotext"%>
(9)errorPage:
errorPage="relativeURL" 設(shè)置處理異常事件的JSP文件。
isErrorPage="true | false" 設(shè)置此頁(yè)是否為出錯(cuò)頁(yè),如果被設(shè)置為true,你就能使用exception對(duì)象
寫(xiě)法:<%@ page errorPage="error.jsp"%>、、<%@ page isErrorPage="true"%>
(10)isELIgnored:
isELIgnored忽略el表達(dá)式
寫(xiě)法:<%@ page isELIgnored="true"%>
(11)contentType:
contentType屬性設(shè)置發(fā)送到客戶(hù)端文檔的響應(yīng)報(bào)頭的類(lèi)型和字符編碼。多個(gè)使用;號(hào)分開(kāi)。 pageEncodeing屬性只用于更改字符編碼
寫(xiě)法:<%@ page contentType="text/html; charset=UTF-8"%>
Charset設(shè)置的是頁(yè)面的字符集、pageEncoding定義的輸出流的字符集
我們寫(xiě)整理這些,里面的內(nèi)容會(huì)在學(xué)習(xí)的過(guò)程中不斷擴(kuò)展,這次我們就做一個(gè)小例子
我們?cè)谖覀冎暗捻?yè)面寫(xiě)一個(gè)明顯的錯(cuò)誤
然后我們運(yùn)行服務(wù)器
然后訪問(wèn)頁(yè)面
點(diǎn)擊提交
頁(yè)面就會(huì)出現(xiàn)錯(cuò)誤
但是這個(gè)看的人有點(diǎn)暈。特別是用戶(hù)他不知道這是什么
我們寫(xiě)一個(gè)錯(cuò)誤頁(yè)面
我們寫(xiě)內(nèi)容
然后在錯(cuò)誤頁(yè)面引入
然后就看到我們寫(xiě)的內(nèi)容了,這樣就不會(huì)出現(xiàn)前面用戶(hù)看不懂的情況,我們可以寫(xiě)我們想寫(xiě)的
這個(gè)例子最后一個(gè),也出現(xiàn)了Exception中的隱藏對(duì)象,記到筆記了,又遇到一個(gè)。
ageEncoding:設(shè)置JSP源文件本身和響應(yīng)正文中的字符集編碼。
ContentType 屬性指定響應(yīng)的 HTTP 內(nèi)容類(lèi)型。如果未指定 ContentType,默認(rèn)為 text/HTML。
語(yǔ)法 Response.ContentType [= ContentType ]
contentType:設(shè)置JSP源文件和響應(yīng)正文的字符集編碼及MIME類(lèi)型。
contentType的charset:設(shè)置服務(wù)器發(fā)送給客戶(hù)端時(shí)的內(nèi)容的編碼。
JSP要經(jīng)過(guò)兩次的“編碼”,第一階段會(huì)用pageEncoding,第二階段會(huì)用utf-8的.java文件至utf-8的.class文件,第三階段就是由Tomcat傳回瀏覽器的網(wǎng)頁(yè), 用的是contentType。
JSP要經(jīng)過(guò)兩次的“編碼”,第一階段會(huì)用pageEncoding,第二階段會(huì)用utf-8至utf-8,第三階段就是由Tomcat出來(lái)的網(wǎng)頁(yè), 用的是contentType。
第一階段是jsp編譯成java
它會(huì)根據(jù)pageEncoding的設(shè)定讀取jsp,結(jié)果是由指定的編碼方案翻譯成統(tǒng)一的UTF-8 JAVA源碼(即.java),如果pageEncoding設(shè)定錯(cuò)了,或沒(méi)有設(shè)定,出來(lái)的就是中文亂碼。
第二階段是由JAVAC的JAVA源碼至java byteCode的編譯
不論JSP編寫(xiě)時(shí)候用的是什么編碼方案,經(jīng)過(guò)這個(gè)階段的結(jié)果全部是UTF-8的encoding的java源碼。
JAVAC用UTF-8的encoding讀取java源碼,編譯成UTF-8 encoding的二進(jìn)制碼(即.class),這是JVM對(duì)常數(shù)字串在二進(jìn)制碼(java encoding)內(nèi)表達(dá)的規(guī)范。
第三階段是Tomcat(或其的application container)載入和執(zhí)行階段二的來(lái)的JAVA二進(jìn)制碼
輸出的結(jié)果,也就是在客戶(hù)端見(jiàn)到的,這時(shí)隱藏在階段一和階段二的參數(shù)contentType就發(fā)揮了功效
pageEncoding 和contentType的預(yù)設(shè)都是 ISO8859-1. 而隨便設(shè)定了其中一個(gè), 另一個(gè)就跟著一樣了(TOMCAT4.1.27是如此). 但這不是絕對(duì)的, 這要看各自JSPC的處理方式. 而pageEncoding不等于contentType, 更有利亞洲區(qū)的文字 CJKV系JSP網(wǎng)頁(yè)的開(kāi)發(fā)和展示, (例pageEncoding=GB2312 不等于 contentType=utf-8)。
jsp文件不像.java,.java 在被編譯器讀入的時(shí)候默認(rèn)采用的是操作系統(tǒng)所設(shè)定的locale所對(duì)應(yīng)的編碼,比如中國(guó)大陸就是GBK,臺(tái)灣就是BIG5或者M(jìn)S950。而一般我們不管 是在記事本還是在ue中寫(xiě)代碼,如果沒(méi)有經(jīng)過(guò)特別轉(zhuǎn)碼的話,寫(xiě)出來(lái)的都是本地編碼格式的內(nèi)容。所以編譯器采用的方法剛好可以讓虛擬機(jī)得到正確的資料。
但是jsp文件不是這樣,它沒(méi)有這個(gè)默認(rèn)轉(zhuǎn)碼過(guò)程,但是指定了pageEncoding就可以實(shí)現(xiàn)正確轉(zhuǎn)碼了。
舉個(gè)例子:
1.<%@ page contentType="text/html;charset=utf-8" %>
大都會(huì)打印出亂碼,因?yàn)檩斎氲摹澳愫谩笔莋bk的,但是服務(wù)器是否正確抓到“你好”不得而知。
但是如果更改為
1.<%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK" %>
這樣就服務(wù)器一定會(huì)是正確抓到“你好”了。
需要將文檔移動(dòng)到一個(gè)新的位置時(shí),就需要使用JSP重定向了。
最簡(jiǎn)單的重定向方式就是使用response對(duì)象的sendRedirect()方法。這個(gè)方法的簽名如下:
public void response.sendRedirect(String location)throws IOException
這個(gè)方法將狀態(tài)碼和新的頁(yè)面位置作為響應(yīng)發(fā)回給瀏覽器。您也可以使用setStatus()和setHeader()方法來(lái)得到同樣的效果:
....String site = "http://www.runoob.com" ;response.setStatus(response.SC_MOVED_TEMPORARILY);response.setHeader("Location", site); ....
實(shí)例演示
這個(gè)例子表明了JSP如何進(jìn)行頁(yè)面重定向:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%><%@ page import="java.io.*,java.util.*" %><html><html><head><title>頁(yè)面重定向</title></head><body><h1>頁(yè)面重定向</h1><%
// 重定向到新地址
String site = new String("http://www.runoob.com");
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", site); %></body></html>
將以上代碼保存在PageRedirecting.jsp文件中,然后訪問(wèn)http://localhost:8080/PageRedirect.jsp,它將會(huì)把您帶至http://www.runoob.cc/。
如您還有不明白的可以在下面與我留言或是與我探討QQ群{{308855039}},我們一起飛!
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。