JSP概述
由sun公司提供的動態(tài)web資源的開發(fā)技術(shù)剥汤。本質(zhì)上是一個servlet.
[toc]
1.JSP由來
JSP的出現(xiàn)是為了解決Servlet在響應(yīng)時不適合向外輸出頁面的問題.
- Servlet本質(zhì)上是一段java代碼故硅,非常適合處理邏輯,但是處理的結(jié)果不太適合由Servlet向外輸出(不適合輸出完整的html頁面)。
- HTML是用于開發(fā)網(wǎng)頁的一門技術(shù)碉输,可以用來展示數(shù)據(jù)。但是HTML開發(fā)出來的頁面本質(zhì)上就是一個文檔(靜態(tài)資源)箩兽,無法展示動態(tài)的數(shù)據(jù)
- JSP非常適合編寫HTML代碼沃疮,適合作為響應(yīng)頁面向外輸出,同時JSP里可以寫java代碼菌赖,也可以展示動態(tài)的數(shù)據(jù)
- 所以JSP的出現(xiàn)既可以解決Servlet不適合向外響應(yīng)一個完整的頁面又可以解決html無法展示動態(tài)數(shù)據(jù)的問題
- JSP在第一次訪問時缭乘,會被翻譯成一個Servlet,對JSP訪問后看到的頁面 其實就是翻譯后的Servlet在向外輸出
2.JSP執(zhí)行過程
3.JSP語法
模板元素
直接寫在jsp頁面中的html內(nèi)容稱之為jsp頁面的模板元素
模板元素在翻譯后的Servlet中琉用,直接被out.write原樣輸出到瀏覽器堕绩。
JSP表達(dá)式
格式: ==<%= 表達(dá)式 %>== 其中可以書寫常量、變量邑时、表達(dá)式
作用:JSP表達(dá)式在翻譯后的Servlet中是執(zhí)行表達(dá)式的值再原樣輸出到瀏覽器
<%= "Hello JSP" %>
<%= 153+231 %>
JSP腳本片段
格式:==<% java語句 %>==
作用:在翻譯過來的servlet中奴紧,腳本片段中的Java代碼被復(fù)制粘貼到對應(yīng)的位置執(zhí)行
<% for(int i = 0;i<10;i++){ %>
Hello JSP...<br/>
<% } %>
JSP注釋
格式:==<%-- JSP注釋 --%>==
注意: 注釋不能交叉嵌套!!
JSP指令
用于指揮JSP解析引擎如何來翻譯當(dāng)前JSP頁面中其它部分的內(nèi)容
(1)page指令
用來聲明當(dāng)前JSP頁面的基本屬性的,page指令可以寫在JSP頁面的任意位置晶丘,但是為了可讀性考慮黍氮,一般情況下最好放在JSP頁面的最前面
格式:==<%@ page ... %>==
(1)<%@ page language="java" %> -- 指定當(dāng)前JSP使用的語言是java.(了解即可)
(2)<%@ page pageEncoding="UTF-8"%> -- 用來通知JSP解析引擎使用指定的編碼來翻譯JSP。如果想防止JSP亂碼铣口,應(yīng)該要保證JSP文件保存時的編碼和pageEncoding指定的編碼保持一致滤钱。
(3)<%@ page session="true"%> -- 用來指定當(dāng)前頁面是否使用session,如果設(shè)置為true脑题,則翻譯過來的servlet中將會有對session對象的引用件缸,于是可以直接在JSP中使用session隱式對象。但
是這將導(dǎo)致一旦訪問JSP就會調(diào)用request.getSession()方法叔遂,可能導(dǎo)致不必要的空間浪費(fèi)他炊。如果確定JSP中不需要session可以設(shè)為false.
(4)<%@ page errorPage="filepath"%> -- 為當(dāng)前JSP頁面指定友好錯誤提示頁面,即當(dāng)前JSP如果拋出了異常已艰,將會跳轉(zhuǎn)到errorPage屬性指定的頁面痊末。
(5)<%@ page import="..."%> -- 為JSP翻譯后的Servlet指定所依賴的jar包
<%@page import="java.util.Date"%>
<%@page import="java.io.File" %>
<%@page import="java.sql.DriverManager"%>
(2)include指令
可以實現(xiàn)頁面包含的效果
格式: ==<%@ include file="" %>==
(3)taglib指令
引入JSTL標(biāo)簽庫
4.JSP的九大隱式對象
JSP翻譯引擎在將JSP翻譯成servlet的過程中,在servlet里預(yù)先定義了九個對象哩掺,因此我們可以在JSP頁面中直接使用這九個對象
隱式對象 | info |
---|---|
page | this |
request | ServletRequest |
response | ServletResponse |
application | ServletContext |
config | ServletConfig |
session | HttpSession |
exception | |
out | 等價于response.getWriter() |
pageContext |
pageContext
代表當(dāng)前JSP頁面的運(yùn)行環(huán)境的對象凿叠,通過該對象可以訪問頁面中的共享數(shù)據(jù)
(1).pageContext對象可以獲取其他八大隱式對象
(2).pageContext是一個域?qū)ο?/h5>
方法 | 相關(guān)描述 |
---|---|
setAttribute(String name,Object value) | 添加一個域?qū)傩?/td> |
getAttribute(String name) | 根據(jù)指定的屬性名獲取屬性值. |
removeAttribute(String name) | 根據(jù)指定的屬性名刪除一個屬性. |
生命周期:當(dāng)訪問JSP開始時創(chuàng)建pageConext對象,當(dāng)訪問JSP結(jié)束時銷毀pageContext對象.
作用范圍: 整個JSP頁面
主要功能: 在整個JSP頁面中實現(xiàn)數(shù)據(jù)的共享
四大作用域范圍: ServletContext > Session > Request > pageContext
5.JSP標(biāo)簽技術(shù)
于是在JSP的2.0版本中盒件,sun提出了JSP標(biāo)簽技術(shù)蹬碧,推薦使用標(biāo)簽來代替JSP頁面中java代碼,并且推薦炒刁,JSP2.0以后不要在JSP頁面中出現(xiàn)任何一行java代碼
EL表達(dá)式
EL表達(dá)式在JSP中可以非常方便的獲取數(shù)據(jù)恩沽,可以代替JSP頁面中的JSP表達(dá)式(<%= %>)
基本結(jié)構(gòu): ${ 表達(dá)式 }
EL只能獲取不能設(shè)置!!!
EL只能獲取不能遍歷!!!
(1) 獲取常量/變量(必須存入域中)/表達(dá)式的值
${ "Hello EL" }
${ 123+456 }
<br/>
<%= "Hello EL" %>
<%= 123+456 %>
<hr/>
<% String name = "趙云"; %>
<%= name %>
<%-- 上面通過JSP表達(dá)式獲取name, 是在當(dāng)前JSP運(yùn)行環(huán)境
中獲取名稱為name的變量的值 --%>
<%
request.setAttribute("name", "request張飛");
session.setAttribute("name", "session張飛");
%>
${ name }
<%-- 通過EL獲取name, 是在四大域中尋找名稱為name的屬性
值, 如果找到就返回name屬性的值, 如果找不到就什么
也不輸出!!
在尋找時, 是按照從小到大的順序到四大域中尋找指定
名稱的屬性值!!
--%>
(2)獲取域中數(shù)組或集合中的數(shù)據(jù)
<%
String[] names =
{ "王海濤", "齊雷", "陳子樞", "劉沛霞" };
request.setAttribute("names", names);
%>
${ names[0] }
${ names[1] }
${ names[2] }
${ names[3] }
(3)獲取域中map集合中的數(shù)據(jù)
<%
Map map = new HashMap();
map.put("name", "劉德華");
map.put("age", 18);
map.put("nickname", "Andy");
request.setAttribute("map", map);
%>
${ map.name }
${ map.age }
${ map.nickname }
JSTL標(biāo)簽庫
(1)c:set標(biāo)簽
- 往域中添加一個域?qū)傩?/li>
<c:set var="name" value="張三豐" scope="request"/>
${ name }
- 修改域中已有的域?qū)傩?/li>
<c:set var="name" value="張無忌" scope="request"/>
${ name }
- 修改域中map集合中的元素
<%
Map map = new HashMap();
map.put("name", "劉德華");
map.put("age", 18);
map.put("nickname", "Andy");
request.setAttribute("map", map);
%>
修改前:
${ map.name }
${ map.age }
${ map.nickname }
<hr/>
<c:set target="${map}" property="name" value="阿凡達(dá)"/>
<c:set target="${map}" property="nickname" value="小達(dá)達(dá)"/>
修改后:
${ map.name }
${ map.age }
${ map.nickname }
(2)c:if標(biāo)簽
<c:if test="${ 3>5 }">yes</c:if>
<c:if test="${ !(3>5) }">no</c:if>
<!-- 模擬判斷用戶是否登錄 -->
<%
session.setAttribute("user", "張三");
session.removeAttribute("user");
%>
<c:if test="${ user == null }">
<a href="#">您好, 請登錄...</a>
</c:if>
<c:if test="${ user != null }">
歡迎, ${ user } 回來...
</c:if>
(3)c:forEach標(biāo)簽
- 遍歷域中的數(shù)組或集合中的元素
<%
List list = new ArrayList();
list.add("張三");
list.add("李四");
list.add("王五");
list.add("劉能");
request.setAttribute("list", list);
for(Object o : list){
System.out.println(o);
}
%>
<c:forEach items="${list}" var="o">
${ o }<br/>
</c:forEach>
- 遍歷域中的map集合中的元素
<%
Map<Object, Object> map = new HashMap();
map.put("name", "劉德華");
map.put("age", 18);
map.put("nickname", "Andy");
request.setAttribute("map", map);
for(Map.Entry<Object,Object> e : map.entrySet()){
System.out.print(e.getKey() + " : ");
System.out.println(e.getValue());
}
%>
<c:forEach items="${map}" var="entry">
<%-- ${ entry.getKey() } : ${ entry.getValue() } <br/> --%>
${ entry.key } : ${ entry.value } <br/>
</c:forEach>
- varStatus 用于指定表示循環(huán)狀態(tài)信息的對象
參數(shù) | 相關(guān)描述 |
---|---|
first | Boolean,當(dāng)前被遍歷元素是否是第一個 |
last | Boolean,當(dāng)前被遍歷的元素是否是最后一個 |
count | 數(shù)值,當(dāng)前被遍歷元素是第幾個 |
index | 索引,當(dāng)前被遍歷元素的索引值() |