JSP (1): 安裝,簡單demo,如何檢視java原始碼,jsp的工作原理以及轉碼編碼方式
安裝
首先下好tomcat和eclipse,eclipse建議使用比較新的版本,舊版本編寫jsp需要安裝外掛十分麻煩。
可能出現的問題:tomcat閃退(建議按照裡面的步驟看看自己的tomcat能否成功在電腦上執行再配置)
基礎知識
預設會一點 java 和 html。
新手一般都在<body>...</body>中進行編寫程式碼的操作,我們目前就只討論<body></body>中的內容。
介紹下必須掌握的註釋方式和表示式:
<!-- --> : html註釋,我一般是喜歡用這個的,用瀏覽器的開發人員工具看得見這個註釋,直接shift+ctrl+?讓eclipse自行判斷 該用什麼註釋就好了。
<%! %> : 只能變數的宣告,方法的定義。在這裡宣告的變數相當於全域性變數。而在指令碼段<% %> 中的變數屬於區域性變數
<% %> : 指令碼段:裡面寫java程式碼。可以和html的標籤混合使用...
如果不使用這個,直接在<body></body>中寫java程式碼,那麼就直接原樣輸出,這段java程式碼,並不會執行 。
<%= %> :輸出表達式:java變數或者有返回值的方法名稱
<br> : 換行符號
注意:1、上面的 jsp 表示式不要隨意打破格式!比如<% %>,中間可以隨便加空格,但是<和%是絕對不能加空格的,否則格式不對會出現報錯異常的。2、上面的表示式都是相互獨立的,不要巢狀在一起使用,比如不要<% <% %> %>這樣使用。除了註釋和輸出表達式(取某變數值的表示式,多應用在動作元素中)以外。避坑指南
直接上程式碼可能更好理解~
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!--注意點1--> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <%! int a=0; %> <!--注意點2--> <% int b=0; %> <!--注意點2--> <% a++; b++; %> <%= "a的值是:"+a %> <br> <%= "b的值是: "+b %> <!-- <%="b的值是: "+b %>等價於<% out.println("b的值是: "+b); %> --> </body> </html>
輸出: a的值是:1
b的值是: 1
注意點1:為了防止中文亂碼問題,最好將charset=ISO-8859-1"pageEncoding=" ISO-8859-1" 換成 charset=UTF-8" pageEncoding="UTF-8"
注意點2:現在請點選一下左上角的重新整理按鈕,會發現這時候a開始自加,而b總是1,不變的。
注意到了麼?a是在<%! %>宣告中定義的,而b是在指令碼段<% %>中定義的。a是一個全域性變數,b是區域性的。每次重新整理一次頁面,即重新執行一次<% %>和<%= >中的內容。全域性變數是不會因為重新整理而消失,重新賦值的。而區域性變數就沒那麼好運了,每次他都會重新初始化。這就是為什麼a變化,b不變的原因。
檢視jsp編譯好的java原始碼
不相信我說的?那我們可以去到我們安裝tomcat的檔案目錄下檢視java程式碼看看a是不是全域性變數 :
以我的路徑為例:D:\2018new\aha\apache-tomcat-8.5.29\work\Catalina\localhost\ROOT\org\apache\jsp
開啟後發現下面有一個class和java檔案,我們剛剛執行的jsp程式碼轉換成 java檔案就是這樣的,開啟java檔案後我們會發現:
我們可以看到變數a在java中的確是一個全域性變數,而b則是在方法中實現的區域性變數。
補個小知識點:關於jsp的轉碼編碼問題
工作原理如下圖:
任何JSP檔案本質上是一個Java Servlet程式,類的名稱為將JSP檔案中的“.”轉變成為下劃線(可以去看看java檔案)
每個JSP頁面就是一個Servlet例項——JSP頁面由系統編譯成Servlet,Servlet再負責響應使用者請求。JSP在伺服器上是要先被編譯成Servlet的。
pageEncoding:指定JSP頁面自身的字元編碼,作用是設定JSP編譯成Servlet時使用的編碼。
即要告訴編譯器:我們想用什麼編碼去程式設計
contentType:指定伺服器端向瀏覽器端傳送資料時採用的MIME型別和字元編碼
即要告訴伺服器:你要用什麼樣的編碼顯示介面
一個JSP的原始檔需要經過 三個階段,兩次編碼,才能完成一次完整的輸出。
第一階段:jsp->java。將jsp編譯成Servlet(.java)檔案。用到的指令是pageEncoding,根據pageEncoding=“XXX”的指示,找到編碼的規則為“XXX”,伺服器在將JSP檔案編譯成.java檔案時會根據pageEncoding的設定讀取jsp,結果是由指定的編碼方案翻譯成統一的UTF-8編碼的JAVA原始碼(即.java)
第二階段:從UTF-8到UTF-8。在這一階段中,不論JSP編寫時候用的是什麼編碼方案,經過這個階段的結果全部是UTF-8的encoding的java原始碼。這一過程是由JVM的內在規範決定的,不受外界控制。
第三階段:從伺服器到瀏覽器