1. 程式人生 > >十一 JSP&EL&JSTL

十一 JSP&EL&JSTL

1 什麼是JSP?

從使用者角度看待,是一個網頁
從程式設計師角度,其實是一個Java類,他繼承了Servlet,所以可以直接說JSP就是一個Servlet

為什麼會有JSP?
html多數情況下用來顯示靜態內容,是一程不變的,不支援Java程式碼。
jsp支援Java,動態網頁


2 jsp三大指令  page include  taglib

  page指令: pageCoding:jsp內容編碼
               extends: 用於指定jsp翻譯成java檔案後,繼承的父類是誰
               import:導包
               session: true or false ,用於這個jsp頁面能否直接使用session物件。
                                      在程式碼的體現:有無getSession方法的呼叫,也就是有無session物件
               errorPage:錯誤介面,
               exception:需要開啟isErrorPage為true
  include指令:包含另外一個jsp進來,例如:<%@ include file="index.jsp" %>
  taglib指令:uri:標籤庫路徑   prefix:標籤庫的別名
   

 

3 jsp動作標籤:

   <jsp:include page=""/>
   <jsp:param value="" name=""/>
   <jsp:forward page=""/>

jsp:include:動態包含,不包含元素,而是把它的執行結果拿過來
jsp:param:跳轉頁面的時候把引數帶過去
jsp:forward:前往哪個個頁面


4 JSP四個作用域和五個內建物件(重點)


所謂內建物件 ,就是我們可以直接在jsp頁面<%%>中使用這些物件,不用建立,
      
四大作用域的使用:      
      使用作用域來存取資料<br>
   <%
     pageContext.setAttribute("name", "pageContext");
     request.setAttribute("name", "request");
     session.setAttribute("name", "session");
     application.setAttribute("name", "application");
   %>
      取出四個作用域的值<br>
   <%=pageContext.getAttribute("name")%><br>
   <%=request.getAttribute("name")%><br>
   <%=session.getAttribute("name")%><br>
   <%=application.getAttribute("name")%><br>
   
     四個作用域的區別:
pageContext:作用域限於當前頁面,在當前頁面設定請求轉發,跳轉到另外一個頁面後發現getAttribute為null
request:作用域限於一次請求,在當前頁面使用重定向兩次請求,第一次請求存的值,第二次跳轉後發現getAttribute為null
session:作用域限於一次會話(多次請求與響應),重啟瀏覽器,直接跳轉04頁面,第二次會話,setAttrubute為null
application:作用域限於整個工程,但伺服器關閉就不能訪問了
以上是四個作用域物件:可以存取資料,他們的取值範圍有限定 setAttribute  getAttribute

五大內建物件:
out(JspWriter)
response(HttpResponse)

exception(throwable)
config(ServletConfig)
page(object)   就是這個jsp翻譯成java類的例項物件


5 EL表示式:${}   為了簡化jsp程式碼,簡化jsp裡面的java程式碼,EL表示式沒有提示      

  用EL表示式取出四個作用域中存放的值:<br>
  ${ pageScope.name}<br>
  ${ requestScope.name}<br>
  ${ sessionScope.name}<br>
  ${ applicationScope.name}
 <br>--------------------------------<br>
  <%
    String[] a = {"aa","bb","cc","dd"};
    pageContext.setAttribute("array", a);
  %>
   使用EL表示式取出作用域陣列的值<br>
  ${array[0]},${array[1]},${array[2]},${array[3]}
  <%%>
   <br>-------------集合資料-------------------<br>
   <%
      List list = new ArrayList();
      list.add("aa");
      list.add("1");
      list.add("2");
      list.add("aa");
      pageContext.setAttribute("array", list);
   %>
    使用EL表示式取出作用域集合的值<br>
    ${array[0]}, ${array[1]}, ${array[2]}, ${array[3]}
   <br>-------------Map資料-------------------<br>
   <%
      Map map = new HashMap();
      map.put("name","zhangsan");
      map.put("age",18);
      map.put("address.aa","北京1");
      pageContext.setAttribute("map", map);
   %>
    使用EL表示式取出作用域Map的值<br>
    ${map.name},${map.age},${map["address.aa"]}

取值方式與次序:

<!--     從域中取值,先要存值 -->
  <%
//      pageContext.setAttribute("name", "pageContext");
//      request.setAttribute("name", "request");
     session.setAttribute("name", "session");
//      application.setAttribute("name", "application");
   %>
<!--    直接指定,去這個作用域找name<br> -->
   ${pageScope.name}<br>
<!--    先從page找,然後是request、session、application找<br> -->
   ${name}<br>
<!--    指定從session找 -->
   ${sessionScope.name}
   
<br>-------------domain.User-------------------<br>   
   <%
      User user = new User("zhangsan",18);
      session.setAttribute("u", user);
   %>
   ${u.name},
   ${u.age}
<!--    判斷是否為空 -->
   ${empty user }       

一般使用EL表示式,取出的都是從一個物件中取出它的屬性值,比如取出一個學生的姓名

6 EL表示式的11個隱式物件,可以直接操作

${物件名.成員}
pageContext,例項對應於當前頁面的處理

以下全是map相關的
四個作用域:
pageScope
requestScope
sessionScope
applicationScope

請求頭:
header
headerValues
請求引數:
param
params

Cookie:
cookie

初始化引數:
initParam

 


7 JSTL表示式  JSP Standard Tab Library  jsp標準標籤庫


簡化jsp的程式碼編寫,替換<%%>,一般與EL表示式配合,EL只能做取值的工作,JSTL可以做遍歷等操作

注意:如果要使用EL表示式,那麼要使用1.1版本,1.0版本不支援EL表示式
引入標籤庫<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="s"%>

常用標籤庫
 
<c:set></c:set>         :聲明瞭一個變數,存到域裡面,域可以指定,預設為page
<c:if test=""></c:if>   : 判斷test裡面,如果符合條件,就輸出中間的內容
<c:forEach></c:forEach> : forEach遍歷,其中items屬性必須寫EL表達${}


<!-- 相當於聲明瞭一個String型別的變數,存到域裡面,域可以指定,預設為page -->
<c:set var="name" value="zhangsan" scope="session" ></c:set>
${sessionScope.name }

<br>-----------------<br>
<c:set value="18" var="age"></c:set>
<c:set value="15" var="age1"></c:set>
<c:if test="${age>16}">
 年齡大於16歲
</c:if>
<c:if test="${age1<16}">
年齡小於16歲
</c:if>
<br>-----------------<br>
<c:forEach var="i" begin="1" end="10" step="2">
${i }
</c:forEach>

<c:forEach var="user" items="${list}">
  ${user.name}----${user.age}<br>
</c:forEach>