爲什麼要使用JSP
Servlet存在以下缺陷:
1.Servlet的編碼、部署和調試任務繁瑣
2.生成動態網頁繁瑣,不利於項目分工
可以使用JSP來彌補Servlet的這些缺陷
什麼是JSP
JSP(Java Server Pages),是由HTML語句和嵌套在其中的Java代碼組成的一個普通文本文件,其擴展名爲.jsp。使用jsp技術編寫的頁面爲動態頁面
JSP通常用於簡化創建產生文本的Servlet,而Servlet更適合於發送原生字節到客戶端或需要用Java源代碼完全控制源代碼的場合。二者可以很好的分開
JSP引擎
容器廠商定義的一個類,用於幫助我們翻譯JSP文件,如:org.apache.jasper.servlet.JspServlet
Ps:所有的JSP翻譯後的類都必須實現HttpJspPage接口,而HttpJspPage接口是Servlet的子接口,所以從這個意義上來說,JSP的本質是Servlet
JSP生命週期
1. Web容器第一次接收到對某個JSP頁面的請求後,首先自動將該JSP頁面翻譯爲Servlet代碼
2. Web容器負責將Servlet代碼編譯爲字節碼。與源文件放在同一個目錄下
3. Web容器裝載新生成的servlet類
4. Web容器創建servlet實例
5. Web容器調用Servlet示例的jspInit()方法,JSP頁面裝載資源
6. 容器創建一個新線程來處理這個客戶的請求 ,servlet對象的_jspService()方法運行
7. 容器調用生成的servlet對象的jspDestroy()方法,銷燬裝載的資源
JSP隱式對象
實質上就是翻譯後的Servlet中的局部變量,一共有9個,其中
屬於作用域範疇的有4個:
pageContext – 代表pageContext對象,只在當前頁面有效
request – 代表HttpServletRequest對象,在一次請求中有效
session – 代表HttpSession對象,在一次會話中有效
application – 代表ServletContext對象,在整個web應用中有效
屬於輸出範疇的有2個
response -- 代表與響應相關的HttpServletResponse對象
out -- 代表與響應輸出流相關的JspWriter對象,可輸出字符流
其它有3個
config – 代表ServletConfig,用於配置servlet對象
page – 當前jsp對象,相當於this
exception – 代表Throwable對象,只能在JSP錯誤頁面中使用
腳本元素
聲明 <%! 聲明內容 %>
– 主要用於定義,可以定義全局變量、靜態變量和方法
腳本 <% Java程序代碼 %>
– 書寫Java代碼,豐富_jspService()方法
表達式 <%= 腳本表達式%>
– 等價於out.print(“腳本表達式”)
註釋
JSP註釋 <%-- 註釋內容 --%>
– 在服務器端翻譯後的代碼中和客戶端均不可見,安全性高
Html註釋 <!-- 註釋內容 -->
– 在服務器端翻譯後的代碼中和客戶端均可見
Java註釋 //
– 在服務器端翻譯後的代碼中可見,客戶端不可見
JSP指令
JSP指令用於提供整個JSP頁面的相關信息,用於JSP頁面與容器之間的通信,有三種類型的指令
Page指令
<%@ page attribute1=”value1” attribute2=”value2” %>
-- 用於設定整個JSP頁面的屬性和相關功能,page指令共有11個屬性,較常用的有:
contentType:設定MIME類型和JSP編碼
import:在JSP中引入Java的包和類,多個包之間以逗號隔開
session:指定當前頁面是否能獲得當前用戶的session對象
errorPage:如果當前頁面發生異常,網頁會重定向到errorPage所指定的頁面進行處理
isErrorPage:允許指定的JSP頁面爲錯誤處理頁面
include指令
表示在JSP編譯時插入一個包含文件或者代碼的文件,是一種靜態包含
<%@ include file="relativeURL" %>
Ps:1)include指令所包含的文件名不能是一個變量url,只能是靜態的文件名。
2)在被包含頁面中,一般不包含<html><body>標記,兩個頁面之間不能存在相同的局部變量
taglib指令
讓用戶能夠自定義標籤
<%@ taglib prefix="tagprefix" uri="url" %>
JSP標準動作
<jsp:include>動作
實現一種動態包含,把顯示的結果插入到當前頁面來顯示
<jsp:include page="localURL" flush="true"/>
page:表示一個相對路徑
flush:必需屬性,且只能爲真,表示當緩衝區滿時會自動清空
Ps:靜態包含與動態包含的區別:
1)靜態包含是文件原樣的拷貝,所以在被包含頁面中,一般不包含<html>和<body>標記,兩個頁面之間不能存在相同的局部變量;動態包含包含的是結果,在兩個頁面之間,可以存在相同的變量
2)靜態包含在編譯時發生,只能包含文件;動態包含在請求時發生,可包含JSP及Servlet請求的url
<jsp:forward>動作
相當於內部轉發
<jsp:forward page="relativeURL">
EL表達式
EL(expression_r_r Language) -- 表達式語言
語法:${...}
EL的主要目標是從JSP頁面中消除Java代碼,因此,EL表達式不能在腳本中定義變量。
EL表達式隱式變量:
類別 |
隱式變量名 |
描述 |
JSP | pageContext | 用來訪問JSP的隱式對象 |
作用域 | pageScope | 與page作用域屬性的名稱和值相關聯的Map類 |
requestScope | 與request作用域屬性的名稱和值相關聯的Map類 | |
sessionScope | 與session作用域屬性的名稱和值相關聯的Map類 | |
applicationScope | 與application作用域屬性的名稱和值相關聯的Map類 | |
請求參數 | param | 包含請求參數字符串的Map類 |
paramValues | 包含請求參數字符串數組(String[])的Map類 | |
請求頭 | header | 包含請求頭字符串的Map類 |
headerValues | 包含請求頭字符串數組(String[])的Map類 | |
Cookie | cookie | 按名稱存儲請求附帶的Cookie的Map類 |
自定義標籤
1.新建一個類繼承BodyTagSupport類,BodyTagSupport類實現了Tag接口,重寫需要實現的方法,一般是doEndTag()
2.在WEB-INF下面新建一個.tld文件,完成註冊
<?xml version="1.0" encoding="UTF-8"?>
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<uri>http://www.baidu.com</uri>
<tag>
<name>tagTast</name>
<tag-class>com.lovo.MyTag</tag-class>
</tag>
</taglib>
3.在jsp頁面添加taglib指令
<%@ taglib prefix="my" uri="com.lovo.MyTag">
4.在jsp頁面使用自定義標籤
爲自定義標籤設置屬性
1.定義屬性,並且生成get和set方法
2.在tld文件裏<tag>標籤內註冊
<attribute>
<name>屬性名<name>
<required>true</required>
</attribute>
3.在jsp頁面裏面設置標籤屬性的值
標準標記庫JSTL:
需要兩個Jar文件:jstl.jar、standard.jar;構建成功後須在JSP中添加如下指令;
< %@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
常用標記:
<c:if> -- 判斷
<c:forEach> -- 循環
在JSP中使用JavaBean:
1、<jsp:useBean>動作
語法:<jsp:useBean id="beanName" scope="page|request|session|applicaion" class="className">
id -- 對象的屬性名
scope -- 作用域
class -- 類的全路徑名。
2、<jsp:getProperty>動作
語法:<jsp:getProperty name="beanName" property="propertyName">
name -- 對應<jsp:useBean>裏的id。
property -- 要獲取的屬性名
3、<jsp:setProperty>動作
語法:<jsp:setProperty name="beanName" property="屬性名">
<jsp:setProperty name="beanName" property="屬性名" param="參數名">
<jsp:setProperty name="beanName" property="屬性名" value="屬性值"> //獲取請求參數
<jsp:setProperty name="beanName" property="*">