JSP

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)前被遍歷元素的索引值()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市翔始,隨后出現(xiàn)的幾起案子罗心,更是在濱河造成了極大的恐慌,老刑警劉巖城瞎,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渤闷,死亡現(xiàn)場離奇詭異,居然都是意外死亡全谤,警方通過查閱死者的電腦和手機(jī)肤晓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來认然,“玉大人,你說我怎么就攤上這事漫萄【碓保” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵腾务,是天一觀的道長毕骡。 經(jīng)常有香客問我,道長岩瘦,這世上最難降的妖魔是什么未巫? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮启昧,結(jié)果婚禮上叙凡,老公的妹妹穿的比我還像新娘。我一直安慰自己密末,他們只是感情好握爷,可當(dāng)我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著严里,像睡著了一般新啼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刹碾,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天燥撞,我揣著相機(jī)與錄音,去河邊找鬼。 笑死物舒,一個胖子當(dāng)著我的面吹牛辆布,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茶鉴,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼锋玲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了涵叮?” 一聲冷哼從身側(cè)響起惭蹂,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎割粮,沒想到半個月后盾碗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡舀瓢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年廷雅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片京髓。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡航缀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堰怨,到底是詐尸還是另有隱情芥玉,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布备图,位于F島的核電站灿巧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏揽涮。R本人自食惡果不足惜抠藕,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蒋困。 院中可真熱鬧盾似,春花似錦、人聲如沸家破。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汰聋。三九已至门粪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間烹困,已是汗流浹背玄妈。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拟蜻。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓绎签,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酝锅。 傳聞我的和親對象是個殘疾皇子诡必,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1.學(xué)習(xí)內(nèi)容 JSP技術(shù)入門和常用指令 JSP的內(nèi)置對象&標(biāo)簽介紹 EL表達(dá)式&EL的內(nèi)置對象 2.JSP技術(shù)入門...
    WendyVIV閱讀 2,125評論 1 18
  • JSP總結(jié)(經(jīng)典) day1 JSP 定義: 1)Java Server Page, Java EE 組件,本...
    java日記閱讀 3,421評論 0 13
  • Jsp技術(shù)總結(jié) 1. 什么是JSP JSP即Java Server Pages搔扁,它和servlet技術(shù)一樣...
    java日記閱讀 1,645評論 0 18
  • 1.什么是JSP (1)jsp全稱是Java Server Pages爸舒,它和Servlet技術(shù)一樣都是sun公司定...
    yjaal閱讀 3,642評論 5 99
  • 可樂開了/文 那些記憶歷久彌新! 那是輛生了銹的二八車稿蹲,黑色扭勉,外觀沒有特別之處,不過腳蹬因為時間久了常常整個掉下來...
    z錦w瑟y閱讀 449評論 0 2