1. 程式人生 > >JSP (1): 安裝,簡單demo,如何檢視java原始碼,jsp的工作原理以及轉碼編碼方式

JSP (1): 安裝,簡單demo,如何檢視java原始碼,jsp的工作原理以及轉碼編碼方式

安裝

首先下好tomcat和eclipse,eclipse建議使用比較新的版本,舊版本編寫jsp需要安裝外掛十分麻煩。

可能出現的問題:tomcat閃退(建議按照裡面的步驟看看自己的tomcat能否成功在電腦上執行再配置)

基礎知識

預設會一點 java 和 html。

新手一般都在<body>...</body>中進行編寫程式碼的操作,我們目前就只討論<body></body>中的內容。

介紹下必須掌握的註釋方式和表示式:

<!-- -->     : html註釋,我一般是喜歡用這個的,用瀏覽器的開發人員工具看得見這個註釋,直接shift+ctrl+?讓eclipse自行判斷                    該用什麼註釋就好了。

<%-- --%>: jsp的註釋,使用者使用瀏覽器開發人員工具看不到這個註釋
<%! %>     : 只能變數的宣告,方法的定義。在這裡宣告的變數相當於全域性變數。而在指令碼段<%  %> 中的變數屬於區域性變數
<%  %>     : 指令碼段:裡面寫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的內在規範決定的,不受外界控制。

第三階段:從伺服器到瀏覽器