1. 程式人生 > >java 之 jsp詳解

java 之 jsp詳解

jsp所需環境

eclipse JSP/Servlet 環境 

jsp處理

以下步驟表明了 Web 伺服器是如何使用JSP來建立網頁的:

  • 就像其他普通的網頁一樣,您的瀏覽器傳送一個 HTTP 請求給伺服器。

  • Web 伺服器識別出這是一個對 JSP 網頁的請求,並且將該請求傳遞給 JSP 引擎。通過使用 URL或者 .jsp 檔案來完成。

  • JSP 引擎從磁碟中載入 JSP 檔案,然後將它們轉化為 Servlet。這種轉化只是簡單地將所有模板文字改用 println() 語句,並且將所有的 JSP 元素轉化成 Java 程式碼。

  • JSP 引擎將 Servlet 編譯成可執行類,並且將原始請求傳遞給 Servlet 引擎。

  • Web 伺服器的某元件將會呼叫 Servlet 引擎,然後載入並執行 Servlet 類。在執行過程中,Servlet 產生 HTML 格式的輸出並將其內嵌於 HTTP response 中上交給 Web 伺服器。

  • Web 伺服器以靜態 HTML 網頁的形式將 HTTP response 返回到您的瀏覽器中。

  • 最終,Web 瀏覽器處理 HTTP response 中動態產生的HTML網頁,就好像在處理靜態網頁一樣。

以上提及到的步驟可以用下圖來表示:

一般情況下,JSP 引擎會檢查 JSP 檔案對應的 Servlet 是否已經存在,並且檢查 JSP 檔案的修改日期是否早於 Servlet。如果 JSP 檔案的修改日期早於對應的 Servlet,那麼容器就可以確定 JSP 檔案沒有被修改過並且 Servlet 有效。這使得整個流程與其他指令碼語言(比如 PHP)相比要高效快捷一些。

總的來說,JSP 網頁就是用另一種方式來編寫 Servlet 而不用成為 Java 程式設計高手。除了解釋階段外,JSP 網頁幾乎可以被當成一個普通的 Servlet 來對待。

 

jsp的生命週期

 

jsp的生命週期就是從建立到銷燬和servlet的生命週期相似

以下是JSP生命週期中所走過的幾個階段:

  • 編譯階段:

    的servlet容器編譯servlet的原始檔,生成的servlet類

  • 當瀏覽器請求JSP頁面時,JSP引擎會首先去檢查是否需要編譯這個檔案。如果這個檔案沒有被編譯過,或者在上次編譯後被更改過,則編譯這個JSP檔案。

    編譯的過程包括三個步驟:

    • 解析JSP檔案。
    • 將JSP檔案轉為servlet的。
    • 編譯的servlet。
  • 初始化階段:

    載入與JSP對應的servlet的類,建立其例項,並呼叫它的初始化方法 

      • 容器載入JSP檔案後,它會在為請求提供任何服務前呼叫jspInit()方法如果您需要執行自定義的JSP初始化任務,複寫jspInit()方法就行了,就像下面這樣:
      • public void jspInit(){
          //初始化程式碼
        }
  • 執行階段:

    呼叫與JSP對應的servlet的例項的服務方法

      •    

        這一階段描述了JSP生命週期中一切與請求相關的互動行為,直到被銷燬。

        當JSP網頁完成初始化後,JSP引擎將會呼叫_jspService()方法。

        _jspService()方法需要一個HttpServletRequest的物件和一個HttpServletResponse的物件作為它的引數,就像下面這樣:

        •   
          void _jspServiceHttpServletRequest請求,
                           HttpServletResponse響應)
          {
             //服務端處理程式碼
          }
        • _jspService()方法在每個請求中被呼叫一次並且負責產生與之相對應的響應,並且它還負責產生所有7個HTTP方法的迴應,比如GET,POST,DELETE等等。
  • 銷燬階段:

    呼叫與JSP對應的servlet的例項的銷燬方法,然後銷燬的servlet例項

    •   

      JSP生命週期的銷燬階段描述了當一個JSP網頁從容器中被移除時所發生的一切。

      jspDestroy()方法在JSP中等價於小服務程式中的銷燬方法。當您需要執行任何清理工作時複寫jspDestroy()方法,比如釋放資料庫連線或者關閉資料夾等等。

      jspDestroy()方法的格式如下:

    • public void jspDestroy()
      {
         //清理程式碼
      }

事例程式碼

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
<title>life.jsp</title>
</head>
<body>

<%! 
  private int initVar=0;
  private int serviceVar=0;
  private int destroyVar=0;
%>
  
<%!
  public void jspInit(){
    initVar++;
    System.out.println("jspInit(): JSP被初始化了"+initVar+"次");
  }
  public void jspDestroy(){
    destroyVar++;
    System.out.println("jspDestroy(): JSP被銷燬了"+destroyVar+"次");
  }
%>

<%
  serviceVar++;
  System.out.println("_jspService(): JSP共響應了"+serviceVar+"次請求");

  String content1="初始化次數 : "+initVar;
  String content2="響應客戶請求次數 : "+serviceVar;
  String content3="銷燬次數 : "+destroyVar;
%>
<h1>jsp 測試例項</h1>
<p><%=content1 %></p>
<p><%=content2 %></p>
<p><%=content3 %></p>

</body>
</html>

jsp語法

指令碼語法格式:

<%  java 程式碼 %>

或者

<jsp:scriptlet>
   程式碼片段
</jsp:scriptlet>

中文編碼問題
將字符集改為UTF-8
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

jsp宣告

一個宣告語句可以宣告一個或多個變數、方法,供後面的Java程式碼使用。在JSP檔案中,您必須先宣告這些變數和方法然後才能使用它們。

JSP宣告的語法格式:

<%! declaration; [ declaration; ]+ ... %>
或者
<jsp:declaration>
   程式碼片段
</jsp:declaration>

事例:
<%! int i = 0; %> 
<%! int a, b, c; %> 
<%! Circle a = new Circle(2.0); %> 

JSP表示式

 

一個JSP表示式中包含的指令碼語言表示式,先被轉化成String,然後插入到表示式出現的地方。

由於表示式的值會被轉化成String,所以您可以在一個文字行中使用表示式而不用去管它是否是HTML標籤。

表示式元素中可以包含任何符合Java語言規範的表示式,但是不能使用分號來結束表示式。

JSP表示式的語法格式:

<%= 表示式 %>

事例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>index</title>
</head>
<body>
<p>
   今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
</p>
</body> 
</html> 

JSP註釋

JSP指令

jsp行為

 

JSP行為標籤使用XML語法結構來控制servlet引擎。它能夠動態插入一個檔案,重用JavaBean元件,引導使用者去另一個頁面,為Java外掛產生相關的HTML等等。

行為標籤只有一種語法格式,它嚴格遵守XML標準:

<jsp:action_name attribute="value" />


jsp九個隱含的物件

jsp運算子優先順序

 

JSP 字面量

JSP語言定義了以下幾個字面量:

  • 布林值(boolean):true 和 false;
  • 整型(int):與 Java 中的一樣;
  • 浮點型(float):與 Java 中的一樣;
  • 字串(string):以單引號或雙引號開始和結束;
  • Null:null。