JSP筆記,java的伺服器頁面,雖然說要淘汰了,但沒說已經不使用了,學吧
目錄
jsp中的out輸出和response.getWriter輸出的區別
-
什麼是JSP?
-
jsp全稱是java server pager(java的伺服器頁面)
-
-
JSP的作用
-
主要作用是代替Servlet程式回傳HTML頁面的資料
-
以前Servle程式迴轉HTML頁面資料是一件非常繁瑣的事情,開發成本和維護成本極高
-
-
jsp如何訪問?
-
jsp頁面和HTML頁面一樣,都是存放在web目錄下,訪問也是一樣的方式
-
-
jsp的本質
-
jsp頁面是一個serlet程式
-
當我們第一次訪問jsp頁面的時候,Tomcat伺服器會把jsp頁面翻譯為一個jsbs原始檔,並且對它進行編譯稱為.class位元組碼程式
-
檢視原始碼可以發現有HttpJspBase類,這個類直接繼承了HttpServlet類。也就是說jsp翻譯出來的java類,間接繼承來HttpServlet類。也就是說所翻譯出來的是一個Servlet程式
-
總結:通過翻譯的java原始碼可以得出結論,jsp是一個Servlet程式
-
-
jsp頭部的page指令
-
jsp的page指令可以修改jsp頁面中的一些重要的屬性或行為
-
<%@ page contenType="text/html;charset=UTF-8" language="java" %>
-
屬性
-
language屬性 表示jsp翻譯後的原始碼是什麼語言,目前只支援Java
-
contentType屬性 表示jsp傳送的資料型別是什麼,也是原始碼中response.serContentType()引數值
-
pageEncoding屬性 表示當前jsp頁面檔案本身的字符集
-
import屬性 用來導包,或者導類
-
============================以下兩個屬性是給out輸出流使用==========================
-
autoFlush屬性 設定當前out輸出流緩衝區滿了之後是否自動重新整理衝級區。預設值是true
-
buffer屬性 表示out緩衝區的大小,預設是8kb
out緩衝區滿了之後不能自動重新整理就會報錯:java.io.IOException:Error:JSP Buffer overflow
============================……=========================
-
errorPage屬性 設定當前jsp頁面出錯時,自動跳轉去的頁面(一般是提示出錯頁面)的路徑
-
errorPage表示錯誤後自動跳轉的路徑。這個路徑通常是以“/”開頭,表示請求的地址是http://ip:port/工程路徑/。對映導程式碼的web目錄
-
-
isErrorPage屬性 設定當前jsp頁面是否是錯誤資訊頁面,預設是false,如果是true可以獲取錯誤資訊
-
session屬性 設定訪問當前jsp頁面是否會建立HttpSession物件,預設是true
-
extends屬性 設定jsp翻譯出來的Java預設繼承誰(設定父類)
-
jsp常用指令碼
-
宣告指令碼:<%! 宣告java程式碼 %>
-
基本不使用
-
作用:宣告指令碼可以給jsp翻譯出來的java類定義屬性和方法,甚至是靜態程式碼塊、內部類
-
-
<%--宣告指令碼練習1、宣告類屬性--%> <%! private Integer id; private String name; private static Map<String, Object> map; %>
-
表示式指令碼:<%= 表示式 %>
-
常用
-
作用:表示式指令碼的作用是在jsp頁面上輸出資料
-
特點:
-
所有的表示式指令碼都會被翻譯到_jspService()輸出到頁面上
-
表示式指令碼都會被翻譯成為out.print()輸出到頁面上
-
由於表示式指令碼翻譯的內容都在_jspService()方法中,所以_jspService()方法中的物件都可以直接使用
-
表示式指令碼中的表示式不能以分號結束
-
-
-
<%--表示式指令碼練習1、輸出整型--%> <%= 12 %>
-
程式碼指令碼:<% Java語句 %>
-
作用:程式碼指令碼的作用是可以在jsp頁面編寫java語句實現想要的功能
-
特點:
-
程式碼指令碼翻譯之後都在_jspService方法中
-
程式碼指令碼由於翻譯到_jspService()方法中,所以在_jspService方法中現有的物件都可以直接使用
-
程式碼指令碼還可以由多個程式碼塊組合完成一個Java語句
-
程式碼指令碼可以和表示式指令碼一起組合使用,在jsp頁面上輸出資料
-
-
-
<%--程式碼指令碼練習1:if語句--%> <% int i = 12; if (i > 10) { System.out.println("大於10"); } else { System.out.println("不大於10"); } %>
-
jsp的三種註釋
-
html註釋
-
<!-- 註釋 -->
-
html註釋會被翻譯到Java程式碼中,在_jspService方法裡,以out.writer輸出到客戶端
-
-
java註釋
-
// 單行註釋
-
/* 多行註釋 */
-
-
jsp註釋
-
<%--jsp註釋--%>
-
jsp註釋的優先順序最高,可以把其他兩種註釋註釋掉
-
-
-
jsp的9大內建物件
-
request 請求物件
-
response 響應物件
-
pageContext jsp的上下文物件
-
session 會話物件
-
application ServletContext物件
-
config ServletConfig物件
-
out jsp輸出流物件
-
page 指向當前jsp物件
-
exception 異常物件
-
-
jsp4大域物件
-
域物件是可以像Map一樣存取資料的物件,四個域物件功能一樣,不同的是它們對資料的採取範圍不一樣
-
4大域物件
-
pageContext
-
jsp的上下文物件
-
PageContextImpl類
-
範圍:當前jsp頁面範圍內有效
-
-
response
-
響應物件
-
HttpServleRequest類
-
範圍:一次請求內有效
-
-
session
-
會話物件
-
HttpSession類
-
範圍:一次會話範圍內有效(瀏覽器從開啟到關閉是一次會話)
-
-
application
-
ServletContext物件
-
ServletContext類
-
範圍:整個web工程範圍內有效
(只要web工程不停止,資料都在)
-
往域中存值:
-
域物件.setAttribute("key", "value");
-
在域中取值
-
使用順序
-
雖然四個域物件都可以存取資料,但是在使用上它們是有優先順序的。
-
優先順序如下(從小到大):
-
pageContext ==> response ==>session ==> application
<body> <h1>scope.jsp頁面</h1> <% // 往四個域中分別儲存資料 pageContext.setAttribute("key", "pageContext"); request.setAttribute("key", "request"); session.setAttribute("key", "session"); application.setAttribute("key", "application"); %> pageContext域是否有值:<%= pageContext.getAttribute("key") %><br> request域是否有值:<%= request.getAttribute("key") %><br> session域是否有值:<%= session.getAttribute("key") %><br> application域是否有值:<%= application.getAttribute("key") %><br> <% request.getRequestDispatcher("/scope2.jsp").forward(request, response); %> </body>
-
-
-
-
-
jsp中的out輸出和response.getWriter輸出的區別
-
response中表示響應,我們經常用於設定返回客戶端的內容(輸出)
-
out也是給使用者做輸出使用的
-
當jsp頁面的所有程式碼執行完成後,會進行下面兩個操作
-
執行out.flush()操作,該操作會把out緩衝區的資料追加寫入到response緩衝區末尾
-
執行response的重新整理操作,把全部資料寫給客戶端
-
<body> <% out.write("out輸出1<br/>"); out.write("out輸出2<br/>"); response.getWriter().write("response輸出1<br/>"); response.getWriter().write("response輸出2<br/>"); %> </body>
<body> <% out.write("out輸出1<br/>"); out.flush();// 把out追加到response末尾(提前追加一次) out.write("out輸出2<br/>"); response.getWriter().write("response輸出1<br/>"); response.getWriter().write("response輸出2<br/>"); %> </body>
-
上面兩段程式碼的輸出結果如下
-
注意:由於jsp翻譯之後,底層原始碼都是使用out進行輸出。所以一般情況下,我們在jsp頁面統一使用out進行輸出,避免輸出順序被打亂
-
out.write()輸出和out.print()輸出
-
out.write()只能用來輸出字串
-
out.print()可以用來輸出任意型別的資料(會把資料轉換為字串再呼叫out.write()輸出)
-
注意:深入原始碼,淺出結論:在jsp頁面中,可以統一使用out.print()來進行輸出
-
-
靜態包含
-
靜態包含的特點:
-
靜態包含不會翻譯被包含的jsp頁面
-
靜態包含其實是把包含的jsp頁面的程式碼拷貝到包含的位置執行輸出
-
-
語法:
-
file屬性指定你要包含的jsp
頁面的路徑
-
地址中的第一個"/"表示為"http://ip:port/工程路徑/"對映到程式碼的web目錄
<%@include file="..."%> <body> 頭部資訊<br> 主體內容<br> <%@include file="/include/footer.jsp"%> </body>
0
-
-
-
-
-
多型包含
-
多型包含可以像靜態包含一樣,把被包含的內容輸出到包含的位置
-
特點:
JspRuntimeLibrary.include(request,response,"/include/footer.jsp", out,false)
-
多型包含會把包含的jsp頁面也翻譯成為java程式碼(個人理解是:先執行翻譯的Java程式碼,再把執行結果顯示在網頁上)
-
動態包含底層程式碼如下,使用該程式碼去呼叫被包含的jsp頁面執行輸出
-
-
動態包含可以傳遞引數
- 語法:
- page屬性是指定你要包含的jsp頁面的路徑
<jsp:include page="..."></jsp:include> <!--或--> <jsp:include page="..."><jsp:param name="..." value="..."/></jsp:include>
- page屬性是指定你要包含的jsp頁面的路徑
-
-
請求轉發
-
語法
-
page屬性設定請求轉發的路徑
-
-
-
<jsp:forward page="..."></jsp:forward>
<jsp:forward page="/scope2.jsp"></jsp:forward>
Listener監聽器
-
Listener監聽器是JavaWeb的三大元件之一(三大元件分別是:Servlet程式,Filter過濾器,Listener監聽器)
-
Listener它是javaEE的規範,也就是介面
-
作用:
-
監聽某事物的變化,然後通過回撥函式(也就是程式)反饋給客戶去進行一些對應的操作
-
-
ServletContextListener監聽器
-
ServletContextListener監聽器可以監聽ServletContext物件的建立和銷燬
-
ServletContext物件在web工程啟動的時候建立,在web工程結束的時候銷燬。監聽到建立和銷燬之後會分別呼叫ServletContextListener監聽器的方法反饋
-
-
兩個方法
public interface ServletContextListener extends EventListener { // 在servletContext物件建立之後馬上呼叫,做初始化 public void contextInitialized(ServletContextEvent sce); // 在ServletContext物件銷燬之後呼叫 public void contextDestroyed(ServletContextEvent sce); }
- 如何使用servletContextListener監聽器的servletContext物件
-
使用步驟:
-
編寫一個類去實現servletContextListener
-
實現其兩個方法(contextInitialized、contextDestroyed)
-
到web.xml中配置監聽器
-
-
展示:
- 編寫一個MyServletContextListenerImp1類實現介面及兩個方法
-
-
public class MyServletContextListenerImp1 implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext物件被建立");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext物件被銷燬");
}
}
<!-- 配置監聽器-->
<listener>
<listener-class>com.atguigu.listener.MyServletContextListenerImp1</listener-class>
</listener>
相關文章
- 驀然回首,Java 已經 24 歲了!Java
- JSP筆記-頁面重定向JS筆記
- 驀然回首:Java已經過時了嗎?Java
- 你說說對Java中SPI的理解吧Java
- 學習韓順平細說Servlet/Jsp視訊筆記(一)ServletJS筆記
- 狂神說Java Web學習筆記_CookieJavaWeb筆記Cookie
- .NET自定義認證雖然簡單,但好用
- 狂神說Java Web學習筆記_TomcatJavaWeb筆記Tomcat
- 說說自己的程式小迷信吧。。。
- 【雲週刊】第123期:AlphaGo雖然贏了,但有人卻說它其實挺“笨”的Go
- 說它是通訊系統的“永動機”,沒異議吧?
- 說區塊鏈-學習筆記區塊鏈筆記
- Ubuntu Edge雖然夭折 但依然備受消費者期待Ubuntu
- 瀏覽器說:雖然都叫event loop,但是我和node不一樣瀏覽器OOP
- 聽說"快應用"了沒?
- AI面臨產業大考:落地雖難,但產業化路徑已日漸清晰AI產業
- Xamarin 學習筆記 - Page(頁面)筆記
- 在jsp中已經獲取到list了,但為什麼foreach迴圈中一直沒有顯示JS
- 美團一面:說說synchronized的實現原理?問麻了。。。。synchronized
- 外媒評iPhone X:雖然價格不菲 但還是不錯iPhone
- 雖然生活成本高,但程式設計師留在矽谷很明智程式設計師
- 說說如何使用 vue-router 實現頁面跳轉Vue
- 面試官讓說出8種建立執行緒的方式,我只說了4種,然後掛了。。。面試執行緒
- 用了這麼多年分頁PageHelper,為什麼有人說Java開發不再吃香Java
- 提高 Java 效率的 35 個小技巧,用了的都說好!Java
- 用了這個jupyter外掛,我已經半個月沒開啟過excel了Excel
- 說說java的反射Java反射
- Java中的執行緒池用過吧?來說說你是怎麼理解執行緒池吧?Java執行緒
- 學習筆記487—PDF頁面拼接後大小不統一【已解決!】筆記
- 漫談程式設計師系列:別說“我已經很努力了”程式設計師
- 壽命最長的蘋果手機,配置已經落後但依舊很多人說好用蘋果
- JavaScript學習筆記(七)—— 再說函式JavaScript筆記函式
- JVM狂神說視訊學習筆記JVM筆記
- Git最新教程通俗易懂----狂神說Java -- ---學習筆記GitJava筆記
- PHP面試:說說你理解的二叉樹吧PHP面試二叉樹
- 面試官:說說資料庫事務吧面試資料庫
- 美團一面:說一說Java中的四種引用型別?Java型別
- 不要再學 JSP 了,學 SpringBoot + Thymeleaf + Vue吧JSSpring BootVue