javaweb學習筆記(十二):JSP(2)
jsp(2)
目錄
1.Jsp指令
JSP指令(directive)是為JSP引擎而設計的,它們並不直接產生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其餘部分。
1.1 include指令
include指令用於引入其它JSP頁面,如果使用include指令引入了其它JSP頁面,那麼JSP引擎將把這兩個JSP翻譯成一個servlet。所以include指令引入通常也稱之為
注:1)原理就是把被包含的頁面(header.jsp)的內容翻譯到包含頁面(index.jsp)中,合併翻譯成一個java原始檔,再編譯執行!
- 如果使用靜態引入,被包含頁面中不需要出現全域性的html標籤了!(如html、head、body)。
- file屬性用於指定被引入檔案的相對路徑。 file屬性的設定值必須使用相對路徑,如果以“/”開頭,表示相對於當前WEB應用程式的根目錄(注意不是站點根目錄),否則,表示相對於當前檔案。
例:在header.jsp檔案中,寫入:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%-- 被包含頁面不需要出現全域性的HTML標籤,如:HTML、head、body等--%>
<h1>這是網頁的頭部</h1>
在index.jsp檔案中,寫入:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>jsp指令之 include</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <%--匯入 --%> <%-- <%@include file="header.jsp" %> --%> <%@include file="/header.jsp" %><!-- web應用程式的根目錄,即webRoot --> <h1>這是網頁的主體</h1> </body> </html>
瀏覽器檢視:
JSP引擎將把這兩個JSP翻譯成一個servlet,具體可以檢視,index_jsp.java原始檔
可以看到,header.jsp中的內容,被寫到了index.jsp中的)_jspService方法中,即合併在了一起,通過out.write()方法寫出到瀏覽器。
1.2 page指令
page指令用於定義JSP頁面的各種屬性,無論page指令出現在JSP頁面中的什麼地方,它作用的都是整個JSP頁面,page指令最好是放在整個JSP頁面的起始位置。
<%@ page
language="java"; 告訴伺服器使用什麼動態語言來翻譯jsp檔案。
import="java.util.* , java.io.*; 告訴伺服器java檔案匯入的包,多個包之間用逗號。
session="true | false" 是否開啟session功能。false,不能用session隱式對 象;true,可以使用session隱式物件。
buffer="none | 8kb | sizekb" jsp頁面的快取區大小。
autoFlush="true | false"
isThreadSafe="true | false"
info="text"
errorPage="relative_url" 指定當前jsp頁面的錯誤處理頁面。
isErrorPage="true | false" 指定當前頁面是否為錯誤處理頁面。false,不是錯誤處理 頁面,不能使用exception隱式物件;true,是錯誤處理 頁面,可以使用exception隱式物件。
pageEncoding="ISO-8859-1" 告訴伺服器用什麼編碼翻譯.jsp到.java檔案。
contentType="text/html ; charset=ISO-8859-1" 伺服器傳送瀏覽器的資料型別和內容編碼
注:在開發工具中,只需要設定pageEncoding即可解決中文亂碼問題。
isELIgnored="true | false" 是否忽略EL表示式。
%>
注:①對import="java.util.**; JSP引擎自動匯入的包:java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*
②errorPage屬性的設定值必須使用相對路徑,如果以“/”開頭,表示相對於當前WEB應用程式的根目錄(注意不是站點根目錄),否則,表示相對於當前頁面。
可以在web.xml檔案中為整個WEB應用程式設定錯誤處理頁面。如果設定了某個JSP頁面的errorPage屬性,那麼在web.xml檔案中設定的錯誤處理將不對該頁面起作用。即符合就近原則。
配置全域性的錯誤處理頁面:
<!-- 全域性錯誤處理頁面配置 -->
<web-app>
<error-page>
<error-code>500</error-code>
<location>/common/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/common/404.html</location>
</error-page>
</web-app>
例:
<%@ page language="java"
import="java.util.*"
pageEncoding="utf-8"
session="true"
errorPage="error.jsp"
%>
<%-- jsp之 page指令--%>
<html>
<head>
<title>jsp之page指令</title>
</head>
<body>
session id:<%=session.getId() %>
<% String name=null;
%>
<% name.charAt(1); %>
</body>
</html>
<!--this file is error.jsp -->
<%@ page language="java"
import="java.util.*"
pageEncoding="utf-8"
session="true"
errorPage="error.jsp"
%>
<%-- jsp之 page指令--%>
<html>
<head>
<title>頁面出錯了</title>
</head>
<body>
不好意思,主頁君掉線了
</body>
</html>
1.3 taglib指令
用於在JSP頁面中匯入標籤庫
2. Jsp的隱式物件
Sun公司設計Jsp時,在jsp頁面載入完畢之後就會自動幫開發者建立好這些物件,而開發者只需要直接使用這些物件呼叫方法即可。
隱式物件名 型別
pageContext PageContext
request HttpServletRequest
session HttpSession
application ServletContext
response HttpServletResponse
config ServletConfig
exception Throwable
page Object(this)
out JspWriter
2.1 out物件
out物件型別是JspWriter類,相當於帶快取的PrintWriter。
注:①設定JSP頁面的page指令的buffer屬性可以調整它的快取大小,甚至關閉它的快取。
②只有向out物件中寫入了內容,且滿足如下任何一個條件時,out物件才去呼叫ServletResponse.getWriter方法,並通過該方法返回的PrintWriter物件將out物件的緩衝區中的內容真正寫入到Servlet引擎提供的緩衝區中:1)設定page指令的buffer屬性關閉了out物件的快取功能2)out物件的緩衝區已滿3)整個JSP頁面結束4)重新整理緩衝區。
out隱式物件的工作原理圖:
2.2 pageContext物件
pageContext物件的型別是PageContext,它叫jsp的上下文物件。
1)可以獲取其他八個內建物件
HttpServletRequest request=pageContext.getRequest();
HttpSession session=pageContext.getSession();
ServletContext application=pageContext.getServletContext();
HttpServletResponse response=pageContext.getResponse();
ServletConfig config=pageContext.getServletConfig();
Throwable exception=pageContext.getException();
Object page=pageContext.getPage();
JspWriter out=pageContext.getOut();
使用場景: 在自定義標籤的時候,PageContext物件頻繁使用到!
2)本身是一個域物件。
pageContext PageContext page域:只能在當前jsp頁面中使用(當前頁面)
request HttpServletRequest request域:只能在同一個請求中使用(轉發)
session HttpSession session域:只能在同一個會話(session物件)中使用
application ServletContext application域:只能在同一個web應用中使用。
即jsp中有四個域物件。servlet中只有後三個域物件。
①pageContext物件的方法 (預設在page域)
public void setAttribute(java.lang.String name, java.lang.Object value)
public java.lang.Object getAttribute(java.lang.String name)
public void removeAttribute(java.lang.String name)
②pageContext物件中還封裝了訪問其它域的方法
public void setAttribute(java.lang.String name, java.lang.Object value, int scope)
public java.lang.Object getAttribute(java.lang.String name, int scope)
public void removeAttribute(java.lang.String name, int scope)
其中,代表各個域的常量(scope):
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext..SESSION_SCOPE
PageContext.APPLICATION_SCOPE
③自動在四個域中搜索資料
pageContext.findAttribute(String name);
順序: page域 -> request域 -> session域- >application域
3)引入和跳轉到其他資源
pageContext.forward(String relativeUrlPath);
pageContext.include(String relativeUrlPath);
pageContext.include(String relativeUrlPath, boolean flush);
分別簡化和替代RequestDispatcher.forward()方法和include()方法。傳遞給這些方法的資源路徑,如果路徑以“/”開頭,表示相對於當前WEB應用程式的根目錄,否則,表示相對於當前JSP所對映到的訪問路徑。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>pageContext物件</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
//1.獲取其他八個內建隱式物件
response.getWriter().write("同一個物件? "+(out==pageContext.getOut()));
%>
<hr/>
<%
//2.作為域物件
pageContext.setAttribute("name", "xiaohua");//預設儲存在page域
pageContext.setAttribute("name","xiaohua in request",PageContext.REQUEST_SCOPE);//指定儲存到request域
//等價於:request.setAttribute("name","xiaohua in request");
//獲取資料
String name=(String) pageContext.getAttribute("name");//預設獲取page域
String name2=(String)pageContext.getAttribute("name",PageContext.REQUEST_SCOPE);
out.write(name2);
%>
<hr/>
<%--自動搜尋 順序:page域->request域->session域->application域 --%>
<%= pageContext.findAttribute("name") %>
</body>
</html>
瀏覽器,檢視: