天天看點

JSP/EL/JSTL - JavaWeb

一. JSP

1.1 Jsp腳本

  1. <%代碼片段%>

    java腳本片段, 生成在service方法中, 每次請求的時候都會執行

  2. <%! 代碼 %>

    聲明片段, 在java代碼中聲明成員, 放在jsp生成java檔案中的成員位置

  3. <%= 代碼 %>

    輸出腳本片段, 在jsp頁面上進行輸出, 源碼 out.print(“代碼”). 注意: 輸出表達式不能以分号結尾

舉例:

<!-- 代碼片段 -->
<%
  if(3>4) {
    out.print("真");
  } else {
    out.print("否");
  }
%>
<%
  int i = 1;
%>

<!-- 聲明片段 -->
<%!
  // 聲明成員變量j
  int j = 3;
  // 聲明一個方法
  public void add() {
    System.out.println("This is a method");
  }
%>

<!-- 輸出片段: 在jsp頁面做輸出操作, 調用out.print(i)-->
<%=i%>      
Jsp注釋: ​

​<%-- 注釋内容 --%>​

​​ html注釋: ​

​<!-- 注釋内容 -->​

1.2 Jsp指令

格式: ​

​<%@jsp指令 屬性名="屬性值" 屬性名1="屬性名1" %>​

三大指令:

  1. page配置jsp, 兌入jsp頁面上需要的類

    ​<%@ page import="java.util.List'' %>​

<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" session="false"
     isELIgnored="true" errorPage="error/500.jsp" isErrorPage="false" %>

<%--
  contentType: 相當于 response.setContentType(); 并且可以指定目前頁面的編碼
  lanuage: 聲明jsp中腳本是什麼類型, 隻有一個值: java
  pageEncoding: 用來聲明目前jsp頁面的編碼, 一般不寫
  session: 用來聲明在目前jsp頁面上是否可以使用session對象
  isELIgnored: 用來聲明在目前頁面上是否忽略el表達式, 預設值: false
  import: 聲明目前jsp頁面導入了哪些類
  errorPage: 聲明目前頁面運作時若産生了異常 轉到哪個頁面值
  isErrorPage: 聲明目前頁面是否是一個錯誤頁面 預設值: false, 一旦聲明為true, 在頁面是可以使用exception對象擷取錯誤資訊
--%>      
  1. include 将其他的jsp頁面包含到目前頁面上

    ​​

    ​<%@include file="inclue/footer.jsp" %>​

  2. taglib 導入标簽庫

    ​​

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

    ​ -> 導入jstl标簽庫

1.3 Jsp内置對象

* jsp一共有9個内置對象
    變量名               真實類型                  作用
    pageContext         PageContext              目前頁面中共享資料,擷取其他的内置對象
    request             HttpServletRequest       一次請求中共享資料
    session             HttpSession              一次會話中共享資料
    application         ServletContext           整個web應用共享資料
    response            HttpServletResponse      響應對象
    page                Object                   目前頁面(servlet)對象
    out                 JspWriter                輸出對象
    config              ServletConfig            servlet配置對象
    exception           Throwable                異常對象       

* 常用
    1. pageContext
    2. request
    3. response
    4. out 用來在jsp頁面上直接通過java代碼輸入内容      
JSP/EL/JSTL - JavaWeb

1.4 PageContext

  • 擷取其他内置對象 getXxx方法 .例如:pageContext.getRequest()方法
  • 域對象,在目前頁面上可以共享資料
  • 可以操作其他的三個域對象
  • setAttribute(String key,String value,int 哪個域)
  • getAttribute(String key,int 哪個域)
  • removeAttribute(String key,int 哪個域)
  • findAttribute(String key)
  • 依次從jsp的四個域中從小到大(域的範圍)挨個查找指定的key.若找到直接傳回,終止查找,若沒有傳回null
  • jsp的四個域:
  • page:隻是在目前頁面中
  • request:在一次請求中
  • session:在一次會話中
  • application:在項目中
<%--設定值--%>
<%
  request.setAttribute("msg", "request域中的值");
  // 放在session域中
  session.setAttribute("msg", "session域中的值");
  // 放在目前頁面域中
  pageContext.setAttribute("msg", "page域中的值");
%>

<%--擷取并輸出值--%>
<%=request.getAttribute("msg") %>
<%=session.getAttribute("msg") %>
<%=pageContext.getAttribute("msg") %>

<%--查找值--%>
<%=pageContext.findAttribute("msg") %>
<%=pageContext.findAttribute(msg1") %>      

二. EL

EL: Expression Language, 可以替代JSP頁面中的JAVA代碼

servlet(增加資料)-> JSP(顯示資料)

2.1 擷取值(域中)

  • el表達式隻能從域對象(4個域)中擷取資料
  • 文法
  • ${pageScope.鍵名} //從page域中擷取指定鍵名對應的值
  • ${requestScope.鍵名} //從request域中擷取指定鍵名對應的值
  • ${sessionScope.鍵名} //從session域中擷取指定鍵名對應的值
  • ${applicationScope.鍵名} //從application域中擷取指定鍵名對應的值

簡化寫法:${鍵名}

​依次從小到大四個域中查找指定屬性的名字,找到了馬上傳回且終止查找;若找不到傳回""​

EL示例:

${requestScope.student.address.schoolAddress}

${域對象.域對象中的屬性.屬性.屬性.級聯屬性}

2.2 EL操作符:

  • 點操作符 ​

    ​.​

    ​ --使用友善
  • 中括号操作符 ​

    ​[]​

    ​ --功能強大: 可以包含特殊字元(. 、 -), 可以通路資料, 擷取變量值

例如存在變量name, 則可以${requestScope[name] }

EL表達式的隐式對象(不需要new就能使用的對象, 自帶的對象)

  • a. 作用于通路對象(EL域對象): pageScope requestScope sessionScope applicationScope

如果不指定域對象, 則預設會根據 從小到大的順序 依次取值

  • b. 參數通路對象: 擷取表單資料( request.getParameter() ->​

    ​${param.name}​

    ​​、request.getParameterValues() -> ​

    ​${paramValues.name[0]}​

    ​ )

也可以傳 超連結中的值: a.jsp?a=b&c=d 或者 位址欄中的值 a.jsp?a=b&c=d

  • c. JSP隐式對象: pageContext 擷取其他的jsp隐式對象; 是以如果要在EL中使用JSP的隐式對象, 可以通過pageContext間接擷取, 例如​

    ​${pageContext.request}​

擷取的方法:(去掉get 首字母小寫 去掉括号 即可)

  • ${pageContext.getSession()} -> ${pageContext.session}
  • ${pageContext.getResponse} -> ${pageContext.response}`
擷取指定cookie的值: ${cookie.cookie的name屬性.value}
在jsp頁面上擷取項目的虛拟路徑:${pageContext.request.contextPath}      

eg:

<body>
擷取指定cookie的value:${cookie.JSESSIONID.value}<br>
擷取項目的虛拟路徑:${pageContext.request.contextPath}<br/>
</body>      

三. JSTL

核心标簽庫: 通用标簽庫, 條件标簽庫, 疊代标簽庫

3.1 a. 通用标簽庫

<c:set>指派

i: 在某個作用于之中(4個範圍對象), 給某個變量指派

​<c:set var="變量名" value="變量值" scope="4個範圍對象的作用于" />​

eg: <c:set var=“name” value=“zhangsan” scope=“request” />

ii: 在某個作用于之中(4個範圍對象), 給某個對象的屬性指派(此種寫法, 不能指定scope屬性)

​<c:set target="對象" property="對象的屬性" value="指派" />​

​​

eg: <c:set target="${requestScope.student}" property=“sname” value"zxx" />

給map對象指派:

<c:set target="${requestScope.countries}" property=“cn” value=“中國” />

注意: <c:set>可以給不存在的變量指派 (但不能給不存在的對象指派)

<c:out>取值

傳統EL: ​

​${requestScope.student }​

c:out方式: <c:out value="${requestScope.student }" />

c:out顯示不存在的資料并設定預設值:

<c:cout value="${requestScope.stu }" default=“zs-sss” />

<c:out value=’<a href=“https://www.baidu.com”>百度` escapeXml=“true” />

<c:out value=’<a href=“https://www.baidu.com”’>百度 escapedXml=“false” />

JSP/EL/JSTL - JavaWeb

<c:remove>移除

<c:remove var=“a” scope=“request” />

3.2 條件标簽庫

**注意: 後面的test引号中不要加多餘的空格!**比如EL表達式之後加個空格->将會當做字元串處理

\<c:if test="${10>2}" var="result" scope="request">

${requestScope.result}

\</c:if>      
<c:choose>
    <c:when test="..."> </c:when>
    <c:when test="..."> </c:when>
    <c:otherwise> </c:otherwise>
</c:choose>      

3.3 疊代标簽庫

<c:forEach begin="0" end="5" step="1" varStatus="status">
    ${status.index}
</c:forEach>
---
<%--
varStatus:記錄循環狀态
    count屬性:序号
--%>
---
<c:forEach var="name" items="${requestScope.names}">
    ${name}
</c:forEach>
---
<c:forEach var="student" items="${requestScope.students }">
    ${student.sname}-${student.sno}
</c:forEach>