JavaWeb學習之JSP學習
JSP
JSP的介紹
- jsp全稱為java server page ,也即java的伺服器頁面。主要用於伺服器代替Servlet程式向客戶端回傳html頁面的資料。實際上,jsp就是Servlet程式。
- 由於使用Servlet程式向瀏覽器回傳html頁面非常繁瑣,所需的開發維護成本很高,因此使用jsp代替Servlet執行。
//使用Servlet回傳Html頁面資料的操作
public class PrintHtmlServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException , IOException{
//通過響應的輸出流回傳HTML頁面資料
resp.setContentType("text/html;charset=UTF-8");
Writer writer = resp.getWriter();
writer.write("<!DOCTYPE html>\r\n");
writer.write(" <html lang=\"en\">\r\n" );
writer.write(" <head>\r\n");
writer.write(" <meta charset=\"UTF-8\">\r\n");
writer.write(" <title>Title</title>\r\n");
writer.write(" </head>\r\n");
writer.write(" <body>\r\n");
writer.write (" 這是 html 頁面資料 \r\n");
writer.write(" </body>\r\n");
writer.write("</html>\r\n");
writer.write("\r\n");
}
}
由上可以看出使用Servlet回傳頁面非常繁瑣
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>使用jsp回傳html頁面<title>
<head>
<body>
這是html頁面資料
<body>
<html>
jsp頁面與html頁面十分相似,書寫起來只需要參照html頁面的格式即可。
- jsp如何訪問
jsp頁面和html頁面一樣,都存放在工程的web目錄下,因此訪問時的方法也和html頁面一致
a.htmlhttp://ip:port/工程路徑/.../a.html
b.jsphttp://ip:port/工程路徑/.../b.jsp
JSP的本質
實際上JSP頁面本質是一個Servlet程式。當第一次訪問JSP頁面時,Tomcat會將JSP頁面翻譯稱為一個java原始檔,並編譯為.class位元組碼檔案,開啟java原始檔發現這是一個繼承了HttpJspBase的以JSP頁面名稱命名的Servlet程式。而其底層對於html頁面的輸出也是基於響應獲取輸出流從而將頁面資料傳送給客戶端的。
JSP的三種語法
-
jsp頭部的page指令
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
,這是jsp頁面的標誌之一,通過page指令可以修改jsp頁面中一些重要的屬性及行為- language屬性:表示jsp經過伺服器翻譯後使用的語言型別,目前只支援java
- contentType屬性:表示jsp返回的資料型別,即原始碼中的response.setContentType()
- pageEncoding屬性:表示當前jsp頁面使用的字符集
- import屬性:用於匯入包和類,與java中的使用類似
- autoFlush屬性:給jsp中的out輸出流物件使用,設定當out輸出流緩衝區滿後是否執行自動重新整理操作,預設為true
- buffer屬性:給jsp中的out輸出流物件使用,設定out緩衝區的大小。預設是8kb
- errorPage屬性:設定當jsp頁面執行出錯時自動跳轉去的頁面路徑
- isErrorPage屬性:設定當前jsp頁面是否是錯誤資訊頁面,預設為false。如果是true可以獲取異常資訊。
- session屬性:設定訪問當前的jsp頁面,是否會建立HttpSession物件。預設是true。
- extends屬性:設定jsp翻譯出來的java類預設繼承誰
-
jsp中的常用指令碼
- 宣告指令碼
<%! 宣告java程式碼 %>
可以給jsp翻譯出來的java類定義屬性和方法甚至是靜態程式碼塊、內部類等(也就是說為了方便需要使用jsp頁面寫成html頁面,然後在html頁面裡寫java程式碼…) - 表示式指令碼
<%=表示式%>
在jsp頁面上輸出資料。所有的表示式指令碼都會被翻譯到_jspService()方法中;表示式指令碼都會被翻譯成為out.print()輸出到頁面上;由於表示式指令碼翻譯的內容都在_jspService()中,因此該方法中的物件都可以在表示式指令碼中直接使用;表示式指令碼中的表示式不能以分號結尾 - 程式碼指令碼
格式為:
<%
java語句
%>
程式碼指令碼的作用是——可以在jsp頁面中,根據需要編寫java語句來實現功能。同樣表示式指令碼會被翻譯到_jspService()方法中,給方法中的物件均可使用。還可以有多個程式碼指令碼塊或者表示式指令碼組合使用,在jsp頁面上輸出資料
- 宣告指令碼
-
jsp中的三種註釋
- html註釋
<!-- 這是html註釋 -- >
- java註釋(在表示式指令碼中書寫)
- jsp註釋
<%-- 這是jsp註釋 --%>
- html註釋
jsp中的九大內建物件
jsp中的九大內建物件是指Tomcat在翻譯jsp頁面成為Servlet程式後,內部自動提供的九大物件,叫做內建物件(需要注意的是,JSP本質上是Servlet程式,因此Servlet中應該有或者說可以有的物件,JSP都會自動提供)
- request :請求物件
- response:響應物件
- pageContext:jsp的上下文物件
- session:會話物件
- application:ServletContext物件
- config:ServletConfig物件
- out:jsp輸出流物件
- page:指向當前的jsp物件
- exception:異常物件,可以通過page指令的isErrorPage屬性設定
jsp四大域物件
jsp中的四大域物件分別是:
- pageContext :當前jsp頁面範圍內有效
- request :一次請求有效
- session : 一次會話範圍內有效
- application : 整個web工程範圍內有效
域物件可以像Map一樣存取資料,四個域物件不同的是他們對資料的存取範圍不同。在使用上,四個域物件的優先順序為他們從小到大的範圍順序,即優先使用pageContext,最後使用application。
jsp中的out輸出和response.getWriter輸出的區別
Servlet中的resp.getWriter()用於獲取輸出流,而jsp中的out也是輸出流。這兩個輸出流的區別在於jsp翻譯之後,會先執行out.flush操作,將out緩衝區的所有資料寫入response緩衝區的末尾,隨後進行response緩衝區的重新整理操作,將資料寫給客戶端。因此在jsp頁面中,應當統一使用out輸出流進行資料的輸出,避免資料順序出現差錯。
- out.write():可以輸出字串資料
- out.print():會將資料統一轉化為字串後呼叫write輸出,因此可以輸出任意型別的資料。
因此在jsp頁面中,應當統一使用out.print()方法來進行資料的輸出
jsp中的常用標籤
-
靜態包含
<%@ include file="" %>
就是靜態包含的格式
file屬性用於指定要包含的jsp頁面的路徑- 靜態包含不會翻譯被包含的jsp頁面
- 靜態包含會將被包含的jsp頁面程式碼直接拷貝到相關位置執行輸出
(通常用於一些頁首頁尾、友情連結等公共的重複性的頁面部分輸出)
-
動態包含
<jsp:include page=""></jsp:include>
是動態包含的格式
動態包含可以像靜態包含一樣將包含的內容執行輸出到指定位置,page屬性即為需要執行動態包含的jsp頁面路徑- 動態包含會吧jsp頁面翻譯為java程式碼
- 底層會使用
JspRunTimeLibrary.include(request,response,url,out,false);
來進行呼叫執行頁面輸出 - 動態包含可以傳遞引數
- 動態包含會將執行包含頁面的request、response、out等內建物件以及動態包含自身傳遞的引數傳遞給被包含頁面使用
<jsp:include page="">
<!-- 即為動態包含傳遞的引數 -->
<jsp:param name="" value="">
<jsp:param name="" value="">
</jsp:include>
- jsp標籤-請求轉發
<jsp:forward page=""></jsp:forward>
改標籤的功能就是請求轉發,page屬性用於設定請求轉發的目標路徑
Listener監聽器
-什麼是Listener監聽器
- Listener監聽器是JavaWeb三大元件之一
- 是JavaEE的規範,也就是介面
- 監聽器的作用是監聽某種事物的變化,然後通過回撥函式反饋給程式做一些相應的處理
- ServletContextListener監聽器
ServletContextListener監聽器可以用於監聽ServletContext物件的建立和銷燬,監聽到建立和銷燬之後都會分別呼叫ServletContextListener監聽器的方法反饋
public interface ServletContextListener extends EventListener{
//在ServletContext物件建立後馬上呼叫
public void contextInitialized(ServletContextEvent sce);
//在ServletContext物件銷燬之後立即呼叫
public void contextDestroyed(ServletContextEvent sce);
}
使用ServletContextListener監聽器監聽ServletContext物件的步驟如下
- 編寫一個類實現介面ServletContextListener
- 實現其中的兩個回撥函式,做相關處理
- 在web.xml中配置Listener
<listener>
<listener-class>com.jarvis.listener.ServletContextListenerImplTest</listener-class>
</listener>