天天看點

JSP & EL & JSTL

目錄

  • JSP
    • 怎麼用JSP
    • JSP動作标簽
    • JSP内置對象
  • EL表達式
    • 使用:
  • EL表達式的11個内置對象
  • JSTL
    • 使用
    • 常用标簽

JSP

  • Java Server Page
  • 什麼是jsp
​ 從使用者角度看待 ,就是是一個網頁 , 從程式員角度看待 , 其實是一個java類, 它繼承了servlet,是以可以直接說jsp 就是一個Servlet.
  • 為什麼會有jsp?
html 多數情況下用來顯示靜态内容 , 一成不變的。 但是有時候我們需要在網頁上顯示一些動态資料, 比如: 查詢所有的學生資訊, 根據姓名去查詢具體某個學生。 這些動作都需要去查詢資料庫,然後在網頁上顯示。 html是不支援寫java代碼 , jsp裡面可以寫java代碼。

怎麼用JSP

  • 指令寫法
    <%@ 指令名字%>
               
  • page指令
    • language
      表明jsp頁面可以寫java代碼
    • contentType
      其實即使說這個檔案是什麼類型,告訴浏覽器我是什麼内容類型,以及使用什麼編碼
    contentType="text/html; charset=UTF-8"
    text/html  MIMEType 這是一個文本,html網頁
               
    • pageEncoding jsp内容編碼
    • extends 用于指定jsp翻譯成java檔案後,繼承的父類是誰,一般不用改。
    • import 導包使用的,一般不用手寫。
      • 在eclipse中使用 : 使用

        alt+/

        不過要在剛寫完類名後敲alt+/ ;如Person (alt+/) person=newPerson();即在寫完Person後敲alt+/ 才生效。
    • session

      可選的有true or false .

      用于控制在這個jsp頁面裡面,能夠直接使用session對象。

      具體的差別是,請看翻譯後的java檔案 如果該值是true , 那麼在代碼裡面會有getSession()的調用,如果是false : 那麼就不會有該方法調用,也就是沒有session對象了。在頁面上自然也就不能使用session了。

    • errorPage:指的是錯誤的頁面,值需要給錯誤的頁面路徑
    • isErrorPage:上面的errorPage用于指定錯誤的時候跑到哪一個頁面去,name這個isErrorPage,就是聲明某一個頁面到底是不是錯誤的頁面.
    • include : 包含另一個jsp的内容進來
    <%@ include file="other02.jsp"%>
               
    • 細節:
    把另外一個頁面的所有内容拿過來一起輸出.所有的标簽元素都包含進來.
    • taglib
    <%@ taglib prefix=""  uri=""%>  
    uri: 标簽庫路徑
    prefix : 标簽庫的别名
               

    JSP動作标簽

    <jsp:include page=""></jsp:include>
    <jsp:param value="" name=""/>
    <jsp:forward page=""></jsp:forward>
               
  • jsp:include
<jsp:include page="other02.jsp"></jsp:include>
<!--包含指定的頁面, 這裡是動态包含。 也就是不把包含的頁面所有元素标簽全部拿過來輸出,而是把它的運作結果拿過來 -->
           
  • jsp:forward
<jsp:forward page=""></jsp:forward>
<!-- 前往哪一個頁面 -->
           
  • jsp:param
<jsp:forward page="other02.jsp">
<jsp:param value="beijing" name="address"/>
</jsp:forward>
	在other02.jsp中擷取參數
	<br>收到的參數是:<br>
	<%= request.getParameter("address")%>
           

JSP内置對象

  • 所謂的内置對象,就是我們可以直接在jsp的頁面中使用這些對象,不用建立.
    • pageContext
    • request
    • session
    • application
    以上四個是作用域對象
  • 作用域
    • 表示這些對象可以存值,他們的取值範圍有限定.setAttribute和getAttribute
    使用作用域來存儲資料<br>
    
        <%
            pageContext.setAttribute("name", "page");
            request.setAttribute("name", "request");
            session.setAttribute("name", "session");
            application.setAttribute("name", "application");
        %>
    
        取出四個作用域中的值<br>
    
        <%=pageContext.getAttribute("name")%>
        <%=request.getAttribute("name")%>
        <%=session.getAttribute("name")%>
        <%=application.getAttribute("name")%>
               
    • 作用域範圍大小:

    pageContext -- request --- session -- application

  • 四個作用域的差別
    • pageContext 【PageContext】

    作用域僅限于目前的頁面。

    還可以擷取到其他八個内置對象.

    • request 【HttpServletRequest】
    作用域僅限于一次請求, 隻要伺服器對該請求做出了響應。 這個域中存的值就沒有了。
    • session 【HttpSession】
    作用域限于一次會話(多次請求與響應) 當中。
    • application 【ServletContext】
    整個工程都可以用通路,伺服器關閉後就不能通路了...
    • out【JspWriter】
    • exception 【Throwable】page
      • 【Object】 ---就是這個jsp翻譯成的java類的執行個體對象
      • config 【ServletConfig】

EL表達式

  • 是為了簡化咱們的jsp代碼,具體一點就是為了簡化在jsp裡面寫的那些java代碼。
  • 寫法格式
${表達式 }
           
如果從作用域中取值,會先從小的作用域開始取,如果沒有,就往下一個作用域取。 一直把四個作用域取完都沒有, 就沒有顯示。

使用:

  1. 取出4個作用域中存放的值。
<%
        pageContext.setAttribute("name", "page");
        request.setAttribute("name", "request");
        session.setAttribute("name", "session");
        application.setAttribute("name", "application");
    %>

    按普通手段取值<br>

    <%= pageContext.getAttribute("name")%>
    <%= request.getAttribute("name")%>
    <%= session.getAttribute("name")%>
    <%= application.getAttribute("name")%>

    <br>使用EL表達式取出作用域中的值<br>

    ${ pageScope.name }
    ${ requestScope.name }
    ${ sessionScope.name }
    ${ applicationScope.name }
           
  • 如果域中所存的是數組
<%
    String [] a = {"aa","bb","cc","dd"};
    pageContext.setAttribute("array", a);
%>

使用EL表達式取出作用域中數組的值<br>

${array[0] } , ${array[1] },${array[2] },${array[3] }
           
  • 如果域中所存的是集合
使用EL表達式取出作用域中集合的值<br>

${li[0] } , ${li[1] },${li[2] },${li[3] }

<br>-------------Map資料----------------<br>
<%
    Map map = new HashMap();
    map.put("name", "zhangsna");
    map.put("age",18);
    map.put("address","北京..");

    map.put("address.aa","深圳..");


    pageContext.setAttribute("map", map);
%>
           
  • 取出Map集合的值
<% Map map = new HashMap(); map.put("name", "zhangsna"); map.put("age",18); map.put("address","北京..");

map.put("address.aa","深圳..");
pageContext.setAttribute("map", map);
%> 使用EL表達式取出作用域中Map的值
${map.name } , ${map.age } , ${map.address } , ${map["address.aa"] }
           
  • 取值細節:
    1. 從域中取值。 得先存值。
    <%
    //pageContext.setAttribute("name", "zhangsan"); session.setAttribute("name", "lisi..."); %>
    直接指定說了,到這個作用域裡面去找這個name
    ${ pageScope.name }
    
    //先從page裡面找,沒有去request找,去session,去application 
    ${ name }
    
    指定從session中取值
    ${ sessionScope.name }
               
    1. 取值方式
    如果這份值是有下标的,name直接使用[]
    <%
        String [] array = {"aa","bb","cc"}
        session.setAttribute("array",array);
    %>
    
    
    ${ array[1] } --> 這裡array說的是attribute的nam
               
    如果沒有下标,那麼使用.的方式去取
    <%
        User user = new User("zhangsan",18);
    
        session.setAttribute("u", user);
    %>
    
    ${ u.name }  , ${ u.age } 
               
    一般使用EL表達式,用的比較多的,都是從一個對象中取出它的屬性值,比如取出某一個學生的姓名

EL表達式的11個内置對象

${ 對象名.成員 }

  • ${ 對象名.成員 }

作用域相關對象 - pageScope - requestScope - sessionScope - applicationScope

頭資訊相關對象 - header - headerValues

參數資訊相關對象 - param - paramValues

  • cookie 全局初始化參數
  • initParagm

JSTL

全稱: JSP Standard Tag Library jsp标準标簽庫

簡化jsp的代碼編寫。 替換 <%%> 寫法。 一般與EL表達式配合

使用

  1. 導入jar檔案到工程的WebContent/Web-Inf/lib jstl.jar standard.jar
  2. 導入jar檔案到工程的WebContent/Web-Inf/lib jstl.jar standard.jar
  3. 注意: 如果想支援 EL表達式,那麼引入的标簽庫必須選擇1.1的版本,1.0的版本不支援EL表達式。

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

常用标簽

<c:set></c:set> <c:if test=""></c:if> <c:forEach></c:forEach>
           
  • c:set
<!-- 聲明一個對象name, 對象的值 zhangsan , 存儲到了page(預設) , 指定是session -->
<c:set var="name" value="zhangsan" scope="session"></c:set>

${sessionScope.name }
           
  • s:if
<c:set var="age" value="18" ></c:set>
    <c:if test="${ age > 26 }">
        年齡大于了26歲...
    </c:if>

    <c:if test="${ age <= 26 }">
        年齡小于了26歲...
    </c:if>


    ------------------------------

    定義一個變量名 flag  去接收前面表達式的值,然後存在session域中

    <c:if test="${ age > 26 }" var="flag" scope="session">
        年齡大于了26歲...
    </c:if>
           
  • c:forEach
從1 開始周遊到10 ,得到的結果 ,指派給 i ,并且會存儲到page域中, step , 增幅為2, 
<c:forEach begin="1" end="10" var="i" step="2">
    ${i }
</c:forEach>


-----------------------------------------------

<!-- items : 表示周遊哪一個對象,注意,這裡必須寫EL表達式。 
var: 周遊出來的每一個元素用user 去接收。 -->
<c:forEach var="user" items="${list }">
    ${user.name } ----${user.age }
</c:forEach>