JSP

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)前被遍歷元素的索引值()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容