JAVA基礎之JSP與EL技術、JSTL技術

  要牢記jsp四大做用域(pageContext域:當前jsp頁面範圍      request域:一次請求   session域:一次會話   application域:整個web應用)以及九大內置對象。而後JSP其實就是個Servlet,能夠理解成能很好的結合HTML代碼的Servlet文件!知道其最好的安全的註釋是用JSP註釋。在JSP裏面輸出信息,除非用response輸出,其餘的都默認是out輸出的,可是順序是在response後面。(固然能夠關閉out緩衝區)在jsp中能夠實現頁面包含,靜態包含和動態包含的結果是顯示同樣的,可是動態包含會去要包含的文件中去讀取,也就是會生成.java文件!html

  EL技術就是爲了簡化在jsp中的java代碼的。${key}java

  JSTL技術就是在JSP頁面內用標籤來簡寫if和for循環語句的!須要注意的是裏面必須是寫el表達式,不然是字符串了。每一個頁面使用的時候必須使用taglib指令導入核心標籤庫!web

 

1、JSP技術:apache

一、運行原理:安全

Jsp本質就是Servlet!session

jsp在第一次被訪問時會被Web容器翻譯成servlet,在執行過程:app

第一次訪問--->helloServlet.jsp---->helloServlet_jsp.java---->編譯運行.classjsp

PS:被翻譯後的servlet在Tomcat的work目錄中能夠找到(先翻譯成java文件,後轉成class)網站

二、腳本:ui

1)<%java代碼%> ----- 內部的java代碼翻譯到service方法的內部(能夠定義變量、不能定義方法)

2)<%=java變量或表達式%> ----- 會被翻譯成service方法內部out.print()往客戶端輸出

3)<%!java代碼%> ---- 會被翻譯成servlet的成員的內容(能夠是成員變量或者成員方法)

三、註釋:

不一樣的註釋可見範圍是不一樣

1)Html註釋:<!--註釋內容--> ---可見範圍 jsp源碼、翻譯後的servlet、頁面        顯示html源碼

2)java註釋://單行註釋  /*多行註釋*/ --可見範圍 jsp源碼 翻譯後的servlet

3)jsp註釋:<%--註釋內容--%> ----- 可見範圍 jsp源碼可見(只能在源文件中看見,安全!!)

四、jsp指令:

jsp的指令是指導jsp翻譯和運行的命令,jsp包括三大指令:

1)page指令 --- 屬性最多的指令(實際開發中page指令默認)

屬性最多的一個指令,根據不一樣的屬性,指導整個頁面特性

格式:<%@ page 屬性名1= "屬性值1" 屬性名2= "屬性值2" ...%>

經常使用屬性以下:

language:jsp腳本中能夠嵌入的語言種類

pageEncoding:設置當前jsp文件的自己編碼---

內部能夠包含contentType(能夠省略)

contentType:response.setContentType(text/html;charset=UTF-8)

session:是否jsp在翻譯時自動建立session(默認屬性值爲true)在第一行設置false

false的話:須要加第一句。默認不須要加(不須要獲取session)

<%
        HttpSession session=request.getSession();-
        session.setAttribute("goods","naiping");
    %>

import:導入java的包

errorPage:噹噹前頁面出錯後跳轉到哪一個頁面(跳轉至)

isErrorPage:當前頁面是一個處理錯誤的頁面(聲明是個錯誤頁面)

 

2)include指令

頁面包含(靜態包含)指令,能夠將一個jsp頁面包含到另外一個jsp頁面中

格式:<%@ include file="被包含的文件地址"%>

<%@ include file="header.jsp" %>
這是內容
<%@ include file="footer.jsp" %>

3)taglib指令

在jsp頁面中引入標籤庫(jstl標籤庫、struts2標籤庫)

格式:<%@ taglib uri="標籤庫地址" prefix="前綴"%>

五、jsp內置/隱式對象(9個)

jsp被翻譯成servlet以後,service方法中有9個對象定義並初始化完畢,咱們在jsp  腳本中能夠直接使用這9個對象:

1)out對象:

out的類型:JspWriter

out做用就是向客戶端輸出內容----out.write()

out緩衝區默認8kb 能夠設置成0 表明關閉out緩衝區 內容直接寫到respons緩衝器.

(Tomcat引擎只能從response緩衝區內取數據,因此response緩衝區會先從out緩衝區內把數據取出來,放到它裏面,而後纔開始往外調數據。這樣就造成了先輸出response輸出的數據。)

2)pageContext對象:

jsp頁面的上下文對象(域對象),做用以下:

page對象與pageContext對象不是一回事

  pageContext是一個域對象

setAttribute(String name,Object obj)

getAttribute(String name)

removeAttrbute(String name)

    pageContext能夠向指定的其餘域中存取數據

setAttribute(String name,Object obj,int scope)---加了個範圍

getAttribute(String name,int scope)

removeAttrbute(String name,int scope)

findAttribute(String name)

---依次從pageContext域,request域,session域,application域中獲   取屬性,在某個域中獲取後將不在向後尋找

  能夠得到其餘8大隱式對象

例如: pageContext.getRequest()

pageContext.getSession()

六、jsp標籤(動做)

1)頁面包含(動態包含):<jsp:include page="被包含的頁面"/>

2)請求轉發:<jsp:forward page="要轉發的資源" />-通常都用Servlet轉發

靜態包含與動態包含的區別?

結果顯示是同樣的!

靜態包含是把你被包含的頁面直接全盤複製粘貼在本身的頁面中;(不生成)

動態包含就是去你的頁面中尋找內容(會讀取你的文件,生成.java文件)

2、El技術:

一、EL 表達式概述

EL(Express Lanuage)表達式能夠嵌入在jsp頁面內部,減小jsp腳本(java代碼)的編寫,EL  出現的目的是要替代jsp頁面中腳本的編寫。(替代java代碼的編寫)

二、EL從域中取出數據(EL最重要的做用):

jsp腳本:<%=request.getAttribute(name)%>

EL表達式替代上面的腳本:${requestScope.name}

 

EL最主要的做用是得到四大域中的數據,格式${EL表達式}

EL得到pageContext域中的值:${pageScope.key};

EL得到request域中的值:${requestScope.key};

EL得到session域中的值:${sessionScope.key};

EL得到application域中的值:${applicationScope.key};

三、EL從四個域中得到某個值${key};

---一樣是依次從pageContext域,request域,session域,application域中   獲取屬性,在某個域中獲取後將不在向後尋找

四、<!-- 獲取web應用名稱 -->

${pageContext.request.contextPath}

五、EL執行表達式

例如:

${1+1}

${empty user}   判斷 域對象的key值  是否爲空  是空爲真/假(能夠前面加!使用)

${user==null?true:false}  判斷key所對應的值是否爲空

3、JSTL技術;

一、JSTL概述:

  JSTL(JSP Standard Tag Library),JSP標準標籤庫,能夠嵌入在jsp頁面中使用標籤的形式完成業務邏輯等功能。jstl出現的目的同el同樣也是要代替jsp頁面中的腳本代碼。JSTL標準標準標籤庫有5個子庫,但隨着發展,目前常使用的是他的核心庫:

二、JSTL的下載和導入:

  從Apache的網站下載JSTL的JAR包。進入    「http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/」網址下載    JSTL的安裝包。jakarta-taglibs-standard-1.1.2.zip,而後將下載好的JSTL安裝包 進行解壓,此時,在lib目錄下能夠看到兩個JAR文件,分別爲jstl.jar和standard.jar。

其中,

jstl.jar文件包含JSTL規範中定義的接口和相關類,

standard.jar文件包含用於實現JSTL的.class文件以及JSTL中5個標籤庫描述符文件(TLD)

①、將兩個JAR 包導入到咱們的項目的lib下-build Path;
②、使用jsp的taglib指令導入核心的標籤庫(這個只在當前頁面中有用,每一個頁面都須要添加!

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

三、JSTL核心庫的經常使用標籤

①、<c:if test=」」>標籤   替代IF語句 裏面必須是el表達式,不然會翻譯成字符串!

須要注意的是:這裏面是沒有else(能夠在裏面取反代替else)

用el表達式判斷條件

其中test是返回boolean的條件

    <%-- <c:if test="${1==1 }">
    正確
    </c:if>
    <c:if test="${1!=1 }">
    錯誤
    </c:if> --%>        
<c:if test="${empty user }">
    <a href="login.jsp">登錄</a>
    <a href="register.jsp">註冊</a>
</c:if>
<!-- 用戶已經登錄 -->
<c:if test="${!empty user }">
    <span>${user.name }</span>
    <a href="#">退出</a>
</c:if>

②、<c:forEach>標籤:

<!--普通for循環  -->
    <c:forEach begin="0" end="10" var="i">
        ${ i }
    </c:forEach>
    <br>
    <!-- 如下會直接打印11個i -->
    <c:forEach begin="0" end="10" var="i">
         i 
    </c:forEach>
    <%
        //建立List<User>
        User user1 = new User();
        user1.setAge(8);
        user1.setName("張三");
        User user2 = new User();
        user2.setAge(11);
        user2.setName("李四");
        ArrayList<User> list = new ArrayList<User>();
        list.add(user1);
        list.add(user2);
        request.setAttribute("UserList", list);
        //建立Map<String,User>
        Map<String, User> map = new HashMap<String, User>();
        map.put("1", user1);
        map.put("2", user2);
        application.setAttribute("UserMap", map);
        //建立List<String>
        ArrayList<String> arr = new ArrayList<String>();
        arr.add("a");
        arr.add("b");
        session.setAttribute("str", arr);
        //建立Map<User,Map<String,User>>
        Map<String, User> map1 = new HashMap<String, User>();
        map1.put("1", user1);
        map1.put("2", user2);
        Map<String, User> map2 = new HashMap<String, User>();
        map2.put("1", user1);
        map2.put("2", user2);
        Map<User, Map<String, User>> map0 = new HashMap<User, Map<String, User>>();
        map0.put(user1, map1);
        map0.put(user2, map2);
        application.setAttribute("UserMap", map0);
    %>
<!-- items聲明您要遍歷的哪一個容器 -->
<c:forEach items="${ str }" var="s">
    ${s }
</c:forEach>
    <br>
<c:forEach items="${ UserList }" var="s1">
    ${s1.name }...
    ${s1.age }
</c:forEach>
    <br>
<c:forEach items="${ UserMap }" var="entry">
    ${entry.key }...${entry.value.name }...${entry.value.age }
</c:forEach>
    <br>
<c:forEach items="${UserMap }" var="entry">
    ${entry.key.name }
    ${entry.key.age }
    <c:forEach items="${entry.value }" var="entry2">
        ${entry2.key }
        ${entry2.value.name }
        ${entry2.value.age }
    </c:forEach>
</c:forEach>
相關文章
相關標籤/搜索