• 下載頻道 http://www.bjxfcs.com/down/
  • 關于JSP主要內容基本概述和解決問題方案

    發布日期:2019-02-01 08:38:00
    •   我們學習JSP時就必須得認認真真的從頭開始,就像我們學習語文數學英語一樣,老師總是會從簡單的開始教育我們,而且必須對每一個詞語每一個公式都要做出一個詳細的教程,不僅讓同學們學起來啊也簡單而且還能更強度的加深你們的學習記憶。

        一. JSP的執行過程與編碼設定概述

        在JSP/Servlet中,主要有以下四種方式可以設置編碼,其中前兩個只能應用于JSP中,而后兩個可以用于 JSP 和 Servlet 中。

        pageEncoding=”UTF-8”;

        contentType=”text/html;charset=UTF-8”;

        request.setCharacterEncoding(“UTF-8”) ;

        response.setCharacterEncoding(“UTF-8”)。

        事實上,一個JSP的源文件需要經過三個階段,兩次編碼,才能完成一次完整的輸出,這三個階段是:

        第一階段:轉譯(.jsp -> .java;pageEncoding -> UTF-8)。將jsp編譯成Servlet(.java)文件,用到的指令是pageEncoding。在編譯過程中,根據pageEncoding=“XXX”的指示,找到編碼的規則為“XXX”,然后服務器將JSP文件編譯成.java文件時會根據pageEncoding的設定讀取jsp,結果是由指定的編碼方案翻譯成統一的UTF-8編碼的JAVA源碼(即.java)。

        第二階段:編譯(.java -> .class;UTF-8 -> UTF-8)。從Servlet文件(.java)到Java字節碼文件(.class),從UTF-8到UTF-8。在這一階段中,不論JSP編寫時候用的是什么編碼方案,經過這個階段的結果全部是UTF-8的encoding的java源碼。JAVAC用UTF-8的encoding讀取java源碼,編譯成UTF-8編碼的二進制碼(即.class),這是JVM對常數字串在二進制碼(Java encoding)內表達的規范。這一過程是由JVM的內在規范決定的,不受外界控制。

        第三階段:編譯(UTF-8 -> contentType)。從服務器到瀏覽器,這在一過程中用到的指令是contentType。服務器載入和執行由第二階段生成出來JAVA二進制碼,輸出的結果,也就是在客戶端可見到的結果,在這次輸出過程中,由contentType屬性中的charset來指定,將UTF8形式的二進制碼以charset的編碼形式來輸出。如果沒有人為設定,則默認的是ISO-8859-1的形式。

        特別需要注意的是,pageEncoding 的默認值是 “ISO-8859-1”, contentType 的默認值是 “text/html;ISO-8859-1”。

        Ps: 第一、三兩個階段的轉碼個人感覺聯想到Sting轉碼更容易理解些,例如 :new String(name.getBytes(“ISO-8859-1”), “utf-8”)。

        二. pageEncoding=”UTF-8”

        pageEncoding=”UTF-8” 的作用是設置JSP編譯成Servlet時使用的編碼。通常,在JSP內部定義的字符串(直接在JSP中定義,而不是從瀏覽器提交的數據)出現亂碼時,很多都是由于該參數設置錯誤引起的。例如,你的 JSP文件中含有中文字符,而在JSP中卻指定pageEncoding=”iso-8859-1”,就會導致中文字符顯示異常。看下面的例子:

        在其編譯為Servlet后,其源碼(片段)

        訪問該頁面,頁面顯示

        我們可以看到,由于pageEncoding被指定為”iso-8859-1”,導致其在由服務器將JSP文件編譯成.java文件過程中,在使用 “iso-8859-1” 讀取jsp并翻譯成統一的UTF-8編碼的JAVA源碼時,所有的中文字符被轉成亂碼,并使得其呈現給用戶的響應也包含亂碼。特別地,該屬性還有一個功能,就是在JSP中不指定contentType參數,也不使用response.setCharacterEncoding方法時,指定對服務器響應的內容進行編碼。

        三. contentType=”text/html;charset=UTF-8”

      代碼

        contentType=”text/html;charset=UTF-8” 的作用是將上述第二階段所生成的UTF8形式的二進制碼以charset的編碼形式來輸出到客戶端,如果設置不當的話,會出現亂碼.

        在其編譯為Servlet后,其源碼(片段)

        訪問該頁面,頁面顯示

        四. request.setCharacterEncoding(“UTF-8”)

        request.setCharacterEncoding(“UTF-8”)用來指定對瀏覽器發送來的數據以特定的字符集進行重新編碼,常用于對 POST 請求參數進行解碼。

        五. response.setCharacterEncoding(“UTF-8”)

        response.setCharacterEncoding(“UTF-8”)的作用是:在服務器將響應返回到瀏覽器前,對響應使用指定字符集進行重新編碼。一旦使用了該種方式,即使該響應頁面指定了具體的 contentType,也將失效。

        在其編譯為Servlet后,其源碼(片段

        訪問該頁面

        六. 四種編碼設定方式之間的相互影響以及作用的優先級

        根據上文內容,我們得出以下三點:

        在指定JSP編譯成Servlet時使用的編碼時,優先級為: pageEncoding=”UTF-8” > contentType=”text/html;charset=UTF-8”

        在指定服務器對響應內容的編碼時,優先級為:response.setCharacterEncoding(“UTF-8”) > contentType=”text/html;charset=UTF-8” > pageEncoding=”UTF-8”

        request.setCharacterEncoding(“UTF-8”) 只用來指定對瀏覽器發送來的請求數據的解碼方式。

        七. JSP頁面與JSP源文件亂碼

        在介紹JSP頁面與JSP源文件的亂碼問題前,首先我們必須對JSP頁面中文亂碼問題與JSP源文件中文亂碼問題有一個清晰的概念,即:

        JSP頁面中文亂碼問題是指用戶在瀏覽器看到的服務器所返回的jsp頁面中,中文字符不能正常顯示;

        JSP源文件中文亂碼問題是指在編輯器保存JSP源文件后,中文字符不能正常顯示。因此,這是兩個不同層面的問題。接下來,我們分別解決這兩個問題。

        1、JSP頁面亂碼

        我們先在記事本中編寫一個JSP程序,如下:

        上面這個JSP程序是在頁面顯示幾句中文而且標題也是中文,運行后在瀏覽器中顯示

        原因在于沒有在JSP中指定 頁面顯示的編碼,消除亂碼的解決方案就是將上面代碼中的page命令修改

        再次運行中文正常顯示,原理就是 向頁面指定編碼為utf-8,那么頁面就會按照此編碼來顯示,于是亂碼消失。

        2、JSP源文件亂碼

        1). JSP源文件亂碼 與 Eclipse/MyEclipse 對JSP的默認編碼設置

        如果我們在Eclipse/MyEclipse中打開上面示例1的jsp源文件,由于Eclipse/MyEclipse中默認的JSP編碼格式為ISO-8859-1,所以當打開由其他編輯器編輯的JSP文件時會出現亂碼

        對于這個問題,我們只需要更改一下 Eclipse/MyEclipse 中對JSP的默認編碼并update就可以了,修改的地方(我的MyEclipse版本為 10)

        修改后,對于在Eclipse/MyEclipse所創建的任何一個JSP源文件,其默認編碼方式均為 UTF-8

        如果不做上述修改,如果我們在Eclipse/MyEclipse中編輯的JSP中存在中文字符,那么當我們保存該頁面時,會彈出以下對話框:

        但是,我們如果我們提前按如上步驟設置后,JSP源文件就能正常保存、編譯。

        2). Eclipse/MyEclipse 創建 JSP時 pageEncoding 的默認值設置

        我們在編輯的JSP文件時,尤其在包含中文字符時,一定要在page編譯指令中恰當地指明 pageEncoding 的值,否則在瀏覽器訪問該JSP頁面時,其中的中文就會顯示為亂碼。因為一旦缺省 pageEncoding 時,其值就會被默認指定為 “iso-8859-1”,該字符集不支持中文。此外,使用 Eclipse/MyEclipse 進行開發的伙伴們都知道,這兩個的默認值是“iso-8859-1”。為方便開發,我們可以更改Eclipse/MyEclipse生成JSP模板時pageEncoding的默認值,修改的地方(我的MyEclipse版本為10)

        這樣,通過以上兩步的設置,當我們在 Eclipse/MyEclipse 中創建一個新的JSP文件時,該源文件在Eclipse/MyEclipse中的默認編碼方式為utf-8,因此就不會導致 JSP源文件亂碼;并且其 pageEncoding 的值會被自動設為“utf-8”,這就不會導致JSP頁面亂碼。

        本篇文章不僅僅只包含JSP主要內容和基本概述的論述論證以外呢在文章的下部分我們還有關于JSP代碼等等各種各樣問題的解決方案,相信你在看完本篇文章以后一定會恍然大悟然后沾沾自喜,愿你能夠解決你的問題。

    次元立方 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
    本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
    香港最快开奖现场直播结果