1. 程式人生 > >javaweb學習筆記(十二):JSP(2)

javaweb學習筆記(十二):JSP(2)

jsp(2)

目錄

jsp(2)

1.Jsp指令

1.1 include指令

1.2 page指令

1.3 taglib指令

2. Jsp的隱式物件

2.1 out物件

2.2 pageContext物件


1.Jsp指令

JSP指令(directive)是為JSP引擎而設計的,它們並不直接產生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其餘部分。

1.1 include指令

include指令用於引入其它JSP頁面,如果使用include指令引入了其它JSP頁面,那麼JSP引擎將把這兩個JSP翻譯成一個servlet。所以include指令引入通常也稱之為

靜態引入 語法: <%@  include file="header.jsp" %>

:1)原理是把被包含的頁面(header.jsp)的內容翻譯到包含頁面(index.jsp)中,合併翻譯成一個java原始檔,再編譯執行!

  1. 如果使用靜態引入,被包含頁面中不需要出現全域性的html標籤了!(如html、head、body)
  2. 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>

瀏覽器,檢視: