JSP概述
由sun公司提供的動(dòng)態(tài)web資源的開發(fā)技術(shù)。本質(zhì)上是一個(gè)servlet.
[toc]
1.JSP由來
JSP的出現(xiàn)是為了解決Servlet在響應(yīng)時(shí)不適合向外輸出頁面的問題.
- Servlet本質(zhì)上是一段java代碼,非常適合處理邏輯,但是處理的結(jié)果不太適合由Servlet向外輸出(不適合輸出完整的html頁面)。
- HTML是用于開發(fā)網(wǎng)頁的一門技術(shù),可以用來展示數(shù)據(jù)。但是HTML開發(fā)出來的頁面本質(zhì)上就是一個(gè)文檔(靜態(tài)資源),無法展示動(dòng)態(tài)的數(shù)據(jù)
- JSP非常適合編寫HTML代碼,適合作為響應(yīng)頁面向外輸出,同時(shí)JSP里可以寫java代碼,也可以展示動(dòng)態(tài)的數(shù)據(jù)
- 所以JSP的出現(xiàn)既可以解決Servlet不適合向外響應(yīng)一個(gè)完整的頁面又可以解決html無法展示動(dòng)態(tài)數(shù)據(jù)的問題
- JSP在第一次訪問時(shí),會(huì)被翻譯成一個(gè)Servlet,對(duì)JSP訪問后看到的頁面 其實(shí)就是翻譯后的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ù)制粘貼到對(duì)應(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文件保存時(shí)的編碼和pageEncoding指定的編碼保持一致。
(3)<%@ page session="true"%> -- 用來指定當(dāng)前頁面是否使用session,如果設(shè)置為true,則翻譯過來的servlet中將會(huì)有對(duì)session對(duì)象的引用,于是可以直接在JSP中使用session隱式對(duì)象。但
是這將導(dǎo)致一旦訪問JSP就會(huì)調(diào)用request.getSession()方法,可能導(dǎo)致不必要的空間浪費(fèi)。如果確定JSP中不需要session可以設(shè)為false.
(4)<%@ page errorPage="filepath"%> -- 為當(dāng)前JSP頁面指定友好錯(cuò)誤提示頁面,即當(dāng)前JSP如果拋出了異常,將會(huì)跳轉(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指令
可以實(shí)現(xiàn)頁面包含的效果
格式: ==<%@ include file="" %>==
(3)taglib指令
引入JSTL標(biāo)簽庫
4.JSP的九大隱式對(duì)象
JSP翻譯引擎在將JSP翻譯成servlet的過程中,在servlet里預(yù)先定義了九個(gè)對(duì)象,因此我們可以在JSP頁面中直接使用這九個(gè)對(duì)象
| 隱式對(duì)象 | info |
|---|---|
| page | this |
| request | ServletRequest |
| response | ServletResponse |
| application | ServletContext |
| config | ServletConfig |
| session | HttpSession |
| exception | |
| out | 等價(jià)于response.getWriter() |
| pageContext |
pageContext
代表當(dāng)前JSP頁面的運(yùn)行環(huán)境的對(duì)象,通過該對(duì)象可以訪問頁面中的共享數(shù)據(jù)
(1).pageContext對(duì)象可以獲取其他八大隱式對(duì)象
(2).pageContext是一個(gè)域?qū)ο?/h5>
| 方法 | 相關(guān)描述 |
|---|---|
| setAttribute(String name,Object value) | 添加一個(gè)域?qū)傩?/td> |
| getAttribute(String name) | 根據(jù)指定的屬性名獲取屬性值. |
| removeAttribute(String name) | 根據(jù)指定的屬性名刪除一個(gè)屬性. |
生命周期:當(dāng)訪問JSP開始時(shí)創(chuàng)建pageConext對(duì)象,當(dāng)訪問JSP結(jié)束時(shí)銷毀pageContext對(duì)象.
作用范圍: 整個(gè)JSP頁面
主要功能: 在整個(gè)JSP頁面中實(shí)現(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屬性的值, 如果找不到就什么
也不輸出!!
在尋找時(shí), 是按照從小到大的順序到四大域中尋找指定
名稱的屬性值!!
--%>
(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)簽
- 往域中添加一個(gè)域?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="#">您好, 請(qǐng)登錄...</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)信息的對(duì)象
| 參數(shù) | 相關(guān)描述 |
|---|---|
| first | Boolean,當(dāng)前被遍歷元素是否是第一個(gè) |
| last | Boolean,當(dāng)前被遍歷的元素是否是最后一個(gè) |
| count | 數(shù)值,當(dāng)前被遍歷元素是第幾個(gè) |
| index | 索引,當(dāng)前被遍歷元素的索引值() |