天天看點

Javaweb複習鞏固

第六天:JSP  EL表達式   jstl标簽

1.Jsp原理:

Jsp本質上是一個Servlet,項目中的jsp頁面在使用者第一次通路的時候會被翻譯成java類,這個java(org.apache.jasper.runtime.HttpJspBase)類會繼承httpServlet

 什麼是JSP:

* Java Server Pages(Java伺服器端的頁面)

為什麼要學習JSP:

* SUN公司推出的Servlet自身有缺陷,沒有辦法與ASP,PHP進行競争.推出了動态網頁開發技術JSP.

使用JSP:

* JSP = HTML + Java代碼 + JSP自身的東西.

執行JSP的過程:

* JSP翻譯成Servlet,編譯這個Servlet的類,生成class檔案.得到執行.

JSP的腳本

  • <%!   %> 聲明腳本   :翻譯成Servlet中的成員内容. 定義變量,方法,類. -- 不建議.
  • <%    %> 代碼塊腳本 :翻譯成Servlet中service方法内部的内容. 定義類,變量
  • <%=   %> 輸出腳本 :翻譯成Servlet中service方法中out.print();

 JSP的注釋

  • HTML的注釋 :<!-- 注釋 -->   

在jsp翻譯的時候會被翻譯到servelt代碼中使用輸出語句輸入到浏覽器中

  • Java代碼的注釋 :// 單行注釋 /*多行注釋*/ /** 文檔注釋 */
  • JSP的注釋 :<%-- JSP的注釋 --%>

内容不會被翻譯

JSP的指令:

  1. 指令的文法:

<%@ 指令名稱 屬性名稱=”屬性值” 屬性名稱=”屬性值” ...%>

JSP中有三個指令:page指令, include指令, taglib指令.

  1. JSP中page指令:<%@ page %> -- 設定JSP的.

* language :JSP腳本中使用的語言.現在隻能寫java.

* contentType :設定浏覽器打開這個JSP的時候采用的預設的字元集的編碼.

* pageEncoding :設定檔案儲存到本地硬碟,以及生成Servlet後,Servlet儲存到硬碟上的編碼.

* import :在JSP中引入類對象.但是import可以出現多次.

* isELIgnored :設定在JSP中是否忽略EL表達式.預設值是false不忽略.

* errorPage :設定錯誤友好頁面的提示.指定目前頁面出錯之後跳轉的錯誤頁面

* isErrorPage :通過這個設定顯示JSP的錯誤資訊.  如果值設定成true,那麼在這個頁面中可以直接使用一個execption對象擷取錯誤資訊

  1. JSP中的include指令:訓示JSP包含其他的頁面.

<%@ include file="logo.jsp" %>

<%@ include file="menu.jsp" %>

<h1>BODY部分</h1>

<%@ include file="footer.jsp" %>

  1. JSP中的taglib指令:訓示JSP引入标簽庫.

<%@ taglib uri="标簽的URI的路徑" prefix="标簽的别名" %>

JSP的内置對象(重點)

  1. JSP的内置對象:在JSP中可以直接使用的對象.
  2. JSP中有9大内置對象:
  3. page内置對象 :真實對象是Object,就是JSP翻譯成Servlet後的類的引用.
  4. out内置對象 :out和response.getWriter是不是同一個對象?差別是什麼?

* 不是out真實對象JspWriter ,response獲得Writer是PrintWriter.

  1. pageContext内置對象 :

* 獲得其他的8個内置對象 :編寫通用性代碼或者架構的時候.

* 向JSP的四個域中存取資料 :

    JSP的四個域範圍:

    * PageScope:目前頁面中有效.pageContextPageContext

    * RequestScope:一次請求範圍.requestHttpServletRequest

    * SessionScope:一次會話範圍.sessionHttpSession

    * ApplicationScope:應用範圍applicationServletContext

2. EL表達式:

Jsp  +   javaBean(jsp開發模式一)

問題:前端代碼和伺服器代碼耦合(項目難以維護)

          要解決這個問題,我們就要盡量的在jsp頁面中少寫java代碼(jsp中不要寫java代碼)

 EL的概述

  • 什麼是EL:
  • 為什麼學習EL:

* 簡化JSP的代碼,而且減少<%%>

  • 使用EL表達式:

* 文法:${ EL表達式 }

1.1 EL的常用功能:

1.1.1 EL擷取資料

注意:El表達式隻能擷取域對象中的資料

PageContext

Request

Session

 Application(ServeltContext)

1.存取是普通的單值資料

<%=pageContext.getAttribute("name") %>

<%=request.getAttribute("name") %>

<%=session.getAttribute("name") %>

<%=application.getAttribute("name") %>

${ pageScope.name }

${ requestScope.name }

${ sessionScope.name }

${ applicationScope.name }

注意:

1. 通過域對象調用方法如果值沒有擷取的是null對象,El表達式擷取資料如果沒有擷取到傳回””

2. ${ name }類似findAttribute("name") 先從pageContext域中查找,沒找到去request域中查詢,沒有找到去session域中找,沒有找到就去application域中找

2. 擷取數組(List集合)的資料

${ arrs[0] }

${ arrs[1] }

${ arrs[2] }

${ arrs[3] }

3. 擷取Map集合的資料  

4. 擷取對象的資料

${ user.id }

${ user.username }

${ user.password }

注意:el表達式擷取對象屬性值的時候,如果屬性找不到,會直接報錯

5. 擷取對象的集合的資料

<%

User user1 = new User(1,"aaa","123");

User user2 = new User(2,"bbb","123");

User user3 = new User(3,"ccc","123");

List<User> userList = new ArrayList<User>();

userList.add(user1);

userList.add(user2);

userList.add(user3);

pageContext.setAttribute("userList", userList);

%>

${ userList[0].id } - ${ userList[0].username } - ${ userList[0].password }<br/>

${ userList[1].id } - ${ userList[1].username } - ${ userList[1].password }<br/>

${ userList[2].id } - ${ userList[2].username } - ${ userList[2].password }<br/>

pageContext     用來擷取request對象  在jsp頁面中動态擷取項目的虛拟路徑

 ${pageContext.request.contextPath}

3.JSTL

1.1 JSTL的概述

  1. 什麼是JSTL:
  1. 為什麼學習JSTL:

* JSTL和EL結合 替換頁面中<%%>

  1. JSTL版本:

* JSTL1.0 :不支援EL表達式.

* JSTL1.1 和 1.2 :支援EL表達式.

  1. JSTL的标簽庫:包含了五類标簽.

* core(核心标簽),fmt(國際化标簽),xml(XML标簽),sql(SQL标簽),fn(JSTL提供EL函數庫)

  1. 使用JSTL:

* 1.引入JSTL的相關的依賴jar包.

* 在頁面中引入标簽庫.<%@ taglib uri=”” prefix=””%>

 JSTL的核心标簽的用法

* if--條件判斷

* forEach---循環周遊

例子:

<%--
  Created by IntelliJ IDEA.
  User: lz
  Date: 2021/12/17
  Time: 12:29
  To change this template use File | Settings | File Templates.
--%>
<%--jsp指令聲明--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--EL表達式擷取資料 域對象可以共享資料,他們都有setAttribute和getAttribute方法用來設定資料和擷取資料--%>
${requestScope.username}
<%--jstl是要結合el表達式的--%>
<c:if test="${not empty username}">
    歡迎您,${username}
</c:if>
<c:forEach var="i" begin="0" end="11" step="2">
    ${i} <br/>
</c:forEach>
</body>
</html>      
package com.swlz.jsp;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/servletJSPDemo1")
public class ServletJSPDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
             request.setAttribute("username","jackson");//域對象(共享資料)
             request.getRequestDispatcher("/user.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doPost(request,response);
    }
}      

今日學習感受:人生的路很長,需要自己一點一滴去慢慢創造屬于自己的人生,選擇自己的人生,自己既然選擇了一條路,無論如何都要堅持下去,加油,追夢人!!!最後一句話:天生我材必有用!!!!