1. 程式人生 > >JSP學習-01

JSP學習-01

turn buffer lin 除了 出現 頁表 fix 格式 ive

JSP(全稱Java Server Pages)

JSP 技術是以 Java 語言作為腳本語言的,JSP 網頁為整個服務器端的 Java 庫單元提供了一個接口來服務於HTTP的應用程序。

JSP文件後綴名為 *.jsp 。標簽通常以<%開頭以%>結束。

JSP開發的WEB應用可以跨平臺使用,既可以運行在 Linux 上也能運行在 Windows 上。本質上就是 Java servlet.主要用於實現Java web應用程序的用戶界面部分。網頁開發者們通過結合HTML代碼、XHTML代碼、XML元素以及嵌入JSP操作和命令來編寫JSP。

JSP通過網頁表單獲取用戶輸入數據、訪問數據庫及其他數據源,然後動態地創建網頁。

JSP標簽有多種功能,比如訪問數據庫、記錄用戶選擇信息、訪問JavaBeans組件等,還可以在不同的網頁中傳遞控制信息和共享信息。

JSP程序與CGI程序有著相似的功能,但和CGI程序相比,JSP程序的優勢

  • 性能更加優越,因為JSP可以直接在HTML網頁中動態嵌入元素而不需要單獨引用CGI文件。
  • 服務器調用的是已經編譯好的JSP文件,而不像CGI/Perl那樣必須先載入解釋器和目標腳本。
  • JSP 基於Java Servlet API,因此,JSP擁有各種強大的企業級Java API,包括JDBC,JNDI,EJB,JAXP等等。
  • JSP頁面可以與處理業務邏輯的 Servlet 一起使用,這種模式被Java servlet 模板引擎所支持。

JSP是Java EE不可或缺的一部分,是一個完整的企業級應用平臺。這意味著JSP可以用最簡單的方式來實現最復雜的應用。

JSP的優勢

以下列出了使用JSP帶來的其他好處:

  • 與ASP相比:JSP有兩大優勢。首先,動態部分用Java編寫,而不是VB或其他MS專用語言,所以更加強大與易用。第二點就是JSP易於移植到非MS平臺上。
  • 與純 Servlet 相比:JSP可以很方便的編寫或者修改HTML網頁而不用去面對大量的println語句。
  • 與SSI相比:SSI無法使用表單數據、無法進行數據庫鏈接。
  • 與JavaScript相比:雖然JavaScript可以在客戶端動態生成HTML,但是很難與服務器交互,因此不能提供復雜的服務,比如訪問數據庫和圖像處理等等。
  • 與靜態HTML相比:靜態HTML不包含動態信息。

JSP 結構

網絡服務器需要一個 JSP 引擎,也就是一個容器來處理 JSP 頁面。容器負責截獲對 JSP 頁面的請求。

JSP 容器與 Web 服務器協同合作,為JSP的正常運行提供必要的運行環境和其他服務,並且能夠正確識別專屬於 JSP 網頁的特殊元素。

下圖顯示了 JSP 容器和 JSP 文件在 Web 應用中所處的位置。

技術分享圖片

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 有效。這使得整個流程與其他腳本語言相比要高效快捷一些。總的來說,JSP 網頁就是用另一種方式來編寫 Servlet 而不用成為 Java 編程高手。除了解釋階段外,JSP 網頁幾乎可以被當成一個普通的 Servlet 來對待。

JSP 生命周期

理解JSP底層功能的關鍵就是去理解它們所遵守的生命周期。

JSP生命周期就是從創建到銷毀的整個過程,類似於servlet生命周期,區別在於JSP生命周期還包括將JSP文件編譯成servlet。

如下是JSP的生命階段

編譯階段:

Servlet容器編譯Servlet源文件 生成Servlet類。

初始階段:

加載與JSP對應的servlet 創建其實例並調用它的初始化方法。

執行階段:

調用與JSP對應的Servlet實例服務方法。

銷毀階段:

調用與JSP對應的Servlet實例的銷毀方法。然後銷毀Servlet實例。

JSP的生命周期和Servlet的很相識

技術分享圖片

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

解析JSP文件

將JSP文件轉移為Servlet

編譯Servlet

JSP初始化

容器載入JSP文件後,它會在為請求提供任何服務前調用jspInit()方法

public void jspInit(){
//初始代碼 }

一般來講程序只初始化一次,servlet也是如此

JSP執行

當JSP網頁完成初始化後,JSP引擎將會調用_jspService()方法。_jspService()方法需要一個HttpServletRequest對象和一個HttpServletResponse對象作為它的參數

 public void _jspService(HttpServletRequest request,
                 HttpServletResponse response)
{
   // 服務端處理代碼
}

_jspService()方法在每個request中被調用一次並且負責產生與之相對應的response,並且它還負責產生所有7個HTTP方法的回應,比如GET、POST、DELETE等等。

JSP銷毀

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

jspDestroy()方法在JSP中等價於servlet中的銷毀方法。當需要執行任何清理工作時復寫jspDestroy()方法,比如釋放數據庫連接或者關閉文件夾等等。

public void jspDestroy()
{
   // 清理代碼
}

JSP 語法

JSP開發中的基礎語法。

腳本程序的語法格式:

<% 代碼片段 %>//
或者是
<jsp:scriptlet>
   代碼片段
</jsp:scriptlet>

任何文本、HTML標簽、JSP元素必須寫在腳本程序的外面。

<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>

技術分享圖片

中文編碼問題

如果要在頁面正常顯示中文,我們需要在 JSP 文件頭部添加以下代碼:<>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

JSP聲明

JSP聲明的語法格式:

 <%!.....%>  //聲明時要加"!",屬於類成員,最先加載,可寫於任何位置;不加則是腳本的局部變量,必須調用前寫。
<%!String hello="hello,Word!"%>//變量聲明
<%=hello%>//變量的調用
<%! private int count=0;
pujblic int counter(){//函數的聲明
return count++;
}
%>

JSP表達式

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

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

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

JSP表達式的語法格式:

<%= 表達式 %>

JSP註釋

JSP註釋主要有兩個作用:為代碼作註釋以及將某段代碼註釋掉。

JSP註釋的語法格式:<%-- 該部分註釋在網頁中不會被顯示--%>

語法描述
<%-- 註釋 --%> JSP註釋,註釋內容不會被發送至瀏覽器甚至不會被編譯
<!-- 註釋 --> HTML註釋,通過瀏覽器查看網頁源代碼時可以看見註釋內容
<\% 代表靜態 <%常量
%\> 代表靜態 %> 常量
\‘ 在屬性中使用的單引號
\" 在屬性中使用的雙引號

JSP指令

JSP指令用來設置與整個JSP頁面相關的屬性。

JSP指令語法格式:

<%@ directive attribute="value" %>

這裏有三種指令標簽:

指令描述
<%@ page ... %> 定義頁面的依賴屬性,比如腳本語言、error頁面、緩存需求等等
<%@ include ... %> 包含其他文件
<%@ taglib ... %> 引入標簽庫的定義,可以是自定義標簽

Page指令

Page指令為容器提供當前頁面的使用說明。一個JSP頁面可以包含多個page指令。

Page指令的語法格式:

<%@ page attribute="value" %>

或者

<jsp:directive.page attribute="value" />

下表列出與Page指令相關的屬性:

屬性描述
buffer 指定out對象使用緩沖區的大小
autoFlush 控制out對象的 緩存區
contentType 指定當前JSP頁面的MIME類型和字符編碼
errorPage 指定當JSP頁面發生異常時需要轉向的錯誤處理頁面
isErrorPage 指定當前頁面是否可以作為另一個JSP頁面的錯誤處理頁面
extends 指定servlet從哪一個類繼承
import 導入要使用的Java類
info 定義JSP頁面的描述信息
isThreadSafe 指定對JSP頁面的訪問是否為線程安全
language 定義JSP頁面所用的腳本語言,默認是Java
session 指定JSP頁面是否使用session
isELIgnored 指定是否執行EL表達式
isScriptingEnabled 確定腳本元素能否被使用

Include指令

JSP可以通過include指令來包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是該JSP文件的一部分,會被同時編譯執行。

Include指令的語法格式如下:

<%@ include file="文件相對 url 地址" %>

include 指令中的文件名實際上是一個相對的 URL 地址。

如果您沒有給文件關聯一個路徑,JSP編譯器默認在當前路徑下尋找。

等價的XML語法:

<jsp:directive.include file="文件相對 url 地址" />

Taglib指令

JSP API允許用戶自定義標簽,一個自定義標簽庫就是自定義標簽的集合。

Taglib指令引入一個自定義標簽集合的定義,包括庫路徑、自定義標簽。

Taglib指令的語法:

<%@ taglib uri="uri" prefix="prefixOfTag" %>

uri屬性確定標簽庫的位置,prefix屬性指定標簽庫的前綴。

等價的XML語法:

<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />

JSP學習-01