前面講解了Servlet,瞭解了Servlet的繼承結構,生命週期等,而且在其中的ServletConfig和ServletContext對象有了一些比較詳細的瞭解,可是咱們會發如今Servlet中編寫一些HTML代碼,是很不方便的一件事情,每次都須要out.println(HTML); 所以就出現了JSP,來解決這樣的問題,JSP中的內容就是html,可是可以嵌套java語言,如今來詳細瞭解一下JSP。html
--WZYjava
1、JSPweb
一、什麼是JSP?express
JSP(Java Server Pages):是以Java語言爲基礎的動態網頁開發技術,apache
特色:api
Servlet特色:在Java源碼中嵌入html源碼瀏覽器
JSP特色:在html源碼中嵌入java代碼緩存
JSP就是Servlettomcat
一、tomcat得到JSP文件後,先將JSP轉成servlet,變成xxx.java(servlet源碼),安全
D:\java\tomcat7.0\apache-tomcat-7.0.53\apache-tomcat-7.0.53\work\Catalina\localhost\test01\org\apache\jsp
|------------------------------------------------------------------------| |---------|----------|-------|-----------------|
tomcat安裝目錄 引擎 主機 項目 固定包名 這個之下就是存放着jsp變成的servlet文件.java和編譯文件.class
二、tomcat將java文件編譯成class文件
三、tomcat運行class文件,並將結果輸出到瀏覽器,
實例:
建立一個jsp。查看其轉換後的servlet代碼。
NewFile.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 hahaha 11 </body> 12 </html>
NewFile_jsp.java
1 /* 2 * Generated by the Jasper component of Apache Tomcat 3 * Version: Apache Tomcat/7.0.53 4 * Generated at: 2017-02-22 02:09:08 UTC 5 * Note: The last modified time of this file was set to 6 * the last modified time of the source file after 7 * generation to assist with modification tracking. 8 */ 9 package org.apache.jsp; 10 11 import javax.servlet.*; 12 import javax.servlet.http.*; 13 import javax.servlet.jsp.*; 14 15 public final class NewFile_jsp extends org.apache.jasper.runtime.HttpJspBase 16 implements org.apache.jasper.runtime.JspSourceDependent { 17 18 private static final javax.servlet.jsp.JspFactory _jspxFactory = 19 javax.servlet.jsp.JspFactory.getDefaultFactory(); 20 21 private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; 22 23 private javax.el.ExpressionFactory _el_expressionfactory; 24 private org.apache.tomcat.InstanceManager _jsp_instancemanager; 25 26 public java.util.Map<java.lang.String,java.lang.Long> getDependants() { 27 return _jspx_dependants; 28 } 29 30 public void _jspInit() { 31 _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); 32 _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); 33 } 34 35 public void _jspDestroy() { 36 } 37 38 public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) 39 throws java.io.IOException, javax.servlet.ServletException { 40 41 final javax.servlet.jsp.PageContext pageContext; 42 javax.servlet.http.HttpSession session = null; 43 final javax.servlet.ServletContext application; 44 final javax.servlet.ServletConfig config; 45 javax.servlet.jsp.JspWriter out = null; 46 final java.lang.Object page = this; 47 javax.servlet.jsp.JspWriter _jspx_out = null; 48 javax.servlet.jsp.PageContext _jspx_page_context = null; 49 50 51 try { 52 response.setContentType("text/html; charset=UTF-8"); 53 pageContext = _jspxFactory.getPageContext(this, request, response, 54 null, true, 8192, true); 55 _jspx_page_context = pageContext; 56 application = pageContext.getServletContext(); 57 config = pageContext.getServletConfig(); 58 session = pageContext.getSession(); 59 out = pageContext.getOut(); 60 _jspx_out = out; 61 62 out.write("\r\n"); 63 out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n"); 64 out.write("<html>\r\n"); 65 out.write("<head>\r\n"); 66 out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n"); 67 out.write("<title>Insert title here</title>\r\n"); 68 out.write("</head>\r\n"); 69 out.write("<body>\r\n"); 70 out.write("\thahaha\r\n"); 71 out.write("</body>\r\n"); 72 out.write("</html>"); 73 } catch (java.lang.Throwable t) { 74 if (!(t instanceof javax.servlet.jsp.SkipPageException)){ 75 out = _jspx_out; 76 if (out != null && out.getBufferSize() != 0) 77 try { out.clearBuffer(); } catch (java.io.IOException e) {} 78 if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); 79 else throw new ServletException(t); 80 } 81 } finally { 82 _jspxFactory.releasePageContext(_jspx_page_context); 83 } 84 } 85 }
能夠看到public final class NewFile_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent
NewFile_jsp.java繼承自HttpJspBase。來看看HttpJspBase的源碼
HttpJspBase.java
1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.jasper.runtime; 19 20 import java.io.IOException; 21 22 import javax.servlet.ServletConfig; 23 import javax.servlet.ServletException; 24 import javax.servlet.http.HttpServlet; 25 import javax.servlet.http.HttpServletRequest; 26 import javax.servlet.http.HttpServletResponse; 27 import javax.servlet.jsp.HttpJspPage; 28 29 import org.apache.jasper.compiler.Localizer; 30 31 /** 32 * This is the super class of all JSP-generated servlets. 33 * 34 * @author Anil K. Vijendran 35 */ 36 public abstract class HttpJspBase extends HttpServlet implements HttpJspPage { 37 38 private static final long serialVersionUID = 1L; 39 40 protected HttpJspBase() { 41 } 42 43 @Override 44 public final void init(ServletConfig config) 45 throws ServletException 46 { 47 super.init(config); 48 jspInit(); 49 _jspInit(); 50 } 51 52 @Override 53 public String getServletInfo() { 54 return Localizer.getMessage("jsp.engine.info"); 55 } 56 57 @Override 58 public final void destroy() { 59 jspDestroy(); 60 _jspDestroy(); 61 } 62 63 /** 64 * Entry point into service. 65 */ 66 @Override 67 public final void service(HttpServletRequest request, HttpServletResponse response) 68 throws ServletException, IOException 69 { 70 _jspService(request, response); 71 } 72 73 @Override 74 public void jspInit() { 75 } 76 77 public void _jspInit() { 78 } 79 80 @Override 81 public void jspDestroy() { 82 } 83 84 protected void _jspDestroy() { 85 } 86 87 @Override 88 public abstract void _jspService(HttpServletRequest request, 89 HttpServletResponse response) 90 throws ServletException, IOException; 91 }
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage
看到了一個熟悉的類,HttpServlet,咱們編寫Servlet時就是繼承自該類,這裏也是繼承HttpServlet,而且HttpJspBase的源碼會發現,生命週期也是有init()方法,service()方法,destory()方法,至關於_jspService()方法就是servlet的service()方法的執行,因此說JSP也是一個servlet。
咱們在JSP寫的全部html代碼,都會被轉換爲servlet中的out.write(html)代碼來輸出。看圖
小總結:
對於jsp轉換成的servlet源碼,以後咱們會在進行詳細分析,如今只須要知道jsp中的內容在servlet中被轉換成什麼了,在哪裏被轉換了便可。其中_jspService()方法的詳細內容下面會講解
注意:jsp 生成java源碼,默認第一次生成,以後直接執行,除非內容修改,具體點說,因爲JSP只會在客戶端第一次請求的時候被編譯,所以第一次請求JSP時會感受比較慢,而以後的請求由於不會編譯JSP,因此速度就快多了,若是將Tomcat保存的JSP編譯後的class文件刪除,Tomcat也會從新編譯JSP。在開發Web程序的時候常常須要修改JSP,Tomcat可以自動檢測到JSP程序的改動,若是檢測到JSP源代碼發生了改動,Tomcat會在下次客戶端請求JSP時從新編譯JSP,而不須要重啓Tomcat,這種自動檢測功能默認是開啓的,檢測改動會消耗少許的時間,在部署web應用程序的時候能夠在web.xml中將它關掉。這也就是爲何咱們可以在jsp頁面直接修改內容,而不用從新啓動服務器的緣由。
由於JSP就是servlet,那麼生命週期也就是跟serlvet同樣。
JSP和servlet有一點區別就在於:jsp是先部署後編譯,而servlet是先編譯後部署。
2、JSP語法
JSP模版數據:
就是JSP中的HTML代碼,它的內容給是固定的,不管程序如何運行模版數據輸出到客戶端瀏覽器時都不會發生改變,當咱們建立一個JSP時,模版就已經固定了。
元素:JSP中的java部分,包括腳本(JavaScript,或者java代碼)以及JSP指令(Directive)與JSP標籤(Tag)等,元素決定着程序的流程,元素是不會顯示到瀏覽器的。這幾個都會在接下來說解到
JSP腳本:
一、使用<% 編寫java代碼 %>,中間java代碼必須遵循Java語法,
爲何可以使用out輸出?這裏就涉及到了JSP的九大內置對象了,後面會講解到,到時候回過頭來在看看這裏,就會知道爲何可使用。
來看看,jsp變爲servlet時的代碼是如何編寫的。
在JSP中JSP指令(後面會講):
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
這句代碼在servlet就變爲了
response.setContentType("text/html; charset=UTF-8");//這句代碼的意思就是通知tomcat和瀏覽器都使用UTF-8碼錶,而且發送回瀏覽器的數據類型是text/html。這是有JSP指令中畫紅色部分代碼轉變的,而指令中的pageEncoding="UTF-8"的意思是JSP轉換爲Servlet時採用UTF-8碼錶編碼,由於可能JSP中包含中文。
對於JSP模版數據來講,就原封不動的使用out.write()來輸出到瀏覽器
而對於JSP元素來講,就會變成普通的java代碼,由於在servlet中,就能夠直接編寫java代碼。
二、使用<%=xxx %>來輸出結果
使用<%=result %>來輸出結果,servlet中就會將其轉換爲out.print(result)進行輸出。輸出各類類型數據:int、double、boolean、String、Object等
三、JSP註釋
<%-- --%> :jsp註釋,
// :java單行註釋
/* */ :Java多行註釋
<!-- --> :這個註釋,會發送到瀏覽器端的源碼中顯示
註釋分別在servlet中如何顯示的?
JSP註釋不會在servlet文件中顯示,而java註釋則會,但其全部的註釋到了瀏覽器端,都不會出如今源碼中,只有<!-- -->這個註釋會到瀏覽器的網頁源碼中去
四、JSP中申明方法與屬性(全局變量) 使用<%! 方法、屬性%>
這個就不演示了,就是在JSP中編寫方法或者屬性時,使用<%! %>括起來。
五、在JSP中使用if語句,或者使用for循環,whilt循環等均可以實現,也就是編寫腳本而已。
3、JSP指令
指令用來申明JSP頁面的一些屬性,好比編碼方式,文檔類型。咱們在servlet中也會申明咱們使用的編碼方式和響應的文檔類型的,而JSP就是用指令來申明。上面咱們也說到了一條指令,也就是page指令,
JSP指令格式:<%@ directive {attribute=value}* %>
解釋:
directive:指令名稱,例如page指令
attribute=value:緊跟指令名稱後面的就是各類屬性,以鍵值對的形式書寫
*:表明後面能跟0個或多個屬性。
例如: page指令:用來聲明JSP頁面的屬性等。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> page指令,後面跟着三個屬性,分別是language、contentType、pageEncoding。這只是其中的幾個屬性,並無寫全,page指令容許的屬性以下表所示
屬性名稱 取值範圍 描述
language java 解釋該JSP文件時採用的語言,通常爲java語言,默認爲java
extends 任何類的全名 編譯該JSP文件時繼承哪一個類,JSP爲Servlet,所以當指明繼承普通類時須要實現Servlet的init、destroy等方法
import 任何包名、類名 引入該JSP中用到的類、包等,import是惟一能夠聲明屢次的page指令屬性,一個import能夠引用uogelei,中間用英文逗號隔開,
如<%@ page import="java.util.List,java.util.ArrayList"%>
session true、false 該JSP內是否內置Session對象,若是爲true,則內置Session對象,可直接使用,不然反之,默認爲true
autoFlush true,false 是否運行緩存,若是爲true,則使用out.println()等方法輸出的字符串並非馬上到達客戶端服務器的,而是暫時存到緩存裏,緩存滿
了或者程序執行完畢或者執行out.flush()操做時纔到客戶端,默認爲true。
buffer none或者數字KB 指定緩存大小,當autoFlush設爲true時有效,例如<%@ page buffer=10kb%>
isThreadSafe true,false 是否線程安全,若是爲true,則運行多個線程同時運行該jsp程序,不然只運行一個線程,其他線程等待,默認爲false
isErrorPage true,false 指定該頁面是否爲錯誤顯示頁面,若是爲true,則該JSP內置有一個Exception對象exception,可直接使用,不然沒有,默認爲false
errorPage 某個JSP頁面的相對路徑 指明一個錯誤頁面,若是該JSP程序拋出一個未捕捉的異常,則轉到errorPage指定的頁面,errorPage指定的頁面一般
isErrorPage屬性爲true,且內置的exception對象爲未捕捉的異常
contentType 有效的文檔類型 客戶端瀏覽器根據該屬性判斷文檔類型,例如 HTML格式爲text/html、純文本格式爲text/plain、JPG圖像爲image/jpeg、GIF圖 像爲image/gif、WORD文檔爲application/msword,該屬性常跟着charset設置編碼一塊兒,做用是通知服務器和瀏覽器都使用同一 個碼錶
info 任意字符串 指明JSP的信息,該信息能夠經過Servlet.getServletInfo()方法獲取到
trimDirective Whitespaces true、false 是否去掉指令先後的空白字符,默認爲false
pageEncoding UTF-8,ISO-8859-1等 指定一張碼錶來對該JSP頁面進行編碼,
include指令
比較簡單,只有一種形式 <%@ include file="relativeURL"%> relativeURL:本應用程序內另外一個JSP文件或者HTML文件的路徑,例如,網址內全部頁面均有一個統一風格的導航欄和頁腳版權,那麼就可使用該指令將其包含進來,
特色:include指令會將包含頁面的源代碼添加到使用include指令的頁面中來,而後編譯成class文件,而等下會講到的一個JSP行爲,<jsp:include page="relativeURL">做用跟include指令同樣,可是不一樣的是,include行爲是運行時單獨執行包含頁面,而後把執行的結果包含到本頁面來,屬於先運行後包含。
taglib指令
JSP支持標籤技術,後面會講到標籤的用法,jstl標籤庫的使用等,
做用:用來指明JSP頁面內使用的JSP標籤庫,taglib指令有兩個屬性,uri爲類庫的地址,prefix爲標籤的前綴
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
4、JSP行爲
前面講了JSP語法,介紹了JSP頁面中的內容有哪些,分別有什麼做用,就兩個東西,模塊數據和元素。其中元素有包括腳本,指令,標籤,腳本就是JSP中嵌入java代碼,指令做用就是申明頁面的屬性,那標籤是幹嗎的,標籤分爲JSP自帶內置的標籤,和經過taglib指令來使用JSP標籤庫,或者自定義標籤。如今咱們先來說一些JSP內置的標籤。
JSP內置的標籤就被稱爲JSP行爲(JSP Actions)。只要書寫不多的標記代碼就能使用JSP提供的豐富功能,JSP行爲實際上是對經常使用的JSP功能的抽象與封裝,能夠取代jsp腳本,讓JSP中就少一些嵌入java代碼的地方。
格式:<jsp:elements {attribute="value"}* />
jsp:標籤的前綴,說明是jsp內置的標籤,
elements:行爲的名稱,
attribute=value:使用鍵值對來編寫屬性
*:能指定0個或多個屬性對
<jsp:include />行爲
include行爲用於運行時包含某個文件,若是被包含的文件爲JSP程序,則先會執行JSP程序,而後在把執行的結果包含進來。 做用是跟include指令同樣的,惟一的區別就在於,include指令是將被包含的文件的源碼加入到了本JSP程序中,而後在進行編譯,屬於靜態包含,而include行爲只是將被包含的文件的運行結果包含進本身。屬於動態包含
Java bean行爲
是一組與Java Bean 相關的行爲,包括useBean行爲、setProperty行爲、getProperty行爲等
Java Bean就是普通的Java類,也被稱爲POJO,只有私有的屬性與對應的getter方法和setter方法,注意其中當私有的屬性爲boolean類型時,習慣上通常把getter方法寫成isXxx();而不是getXxx();
useBean行爲
<jsp:useBean id="beanObject" class="className" scope="Value"> 做用:在jsp中定義一個java bean對象,
id:指明Java Bean對象的名稱,JSP中可使用該名稱引用該Java Bean對象,至關於給new出來的對象取一個變量名,
class:Java Bean類的全名
scope:該java bean對象的做用範圍,能夠寫的就四個,也就是JSP的四大做用域,page、request、session、application
page:只能在當前JSP頁面使用,若是不在JSP頁面,那麼就會失效
request:這個前面學過,A頁面請求轉發到B頁面,那麼使用的是同一個request,那麼A,B頁面都算是request的做用域,也就是經過請求轉發的頁面都是其做 用域
session:該做用域在一個web項目下任何位置應該讀訪問的到,只要cookie不關閉,而且cookie設置 的訪問路徑爲"/",
application:其實就是Servlet中的servletContext,服務器下的全部項目都能訪問到。
setProperty行爲
<jsp:setProperty name="beanName" property="propertyName" value="">
對Java Bean對象進行屬性的設置
name:java bean對象的名稱,也就是在useBean行爲中的id
property:對象中的屬性名,
value:要對其屬性進行賦值的值
getProperty行爲
<jsp:getProperty name="beanName" property="propertyName" />
獲取JavaBean對象的某個屬性值
name:java bean 對象的名稱,也就是在useBean行爲中的id
property:對象的屬性名
例子: javabean:User.java NewFile.jsp
User.java
1 package a; 2 3 public class User { 4 private int id; 5 private String username; 6 private String password; 7 public int getId() { 8 return id; 9 } 10 public void setId(int id) { 11 this.id = id; 12 } 13 public String getUsername() { 14 return username; 15 } 16 public void setUsername(String username) { 17 this.username = username; 18 } 19 public String getPassword() { 20 return password; 21 } 22 public void setPassword(String password) { 23 this.password = password; 24 } 25 26 27 }
NewFile.jsp
1 <body> 2 <!-- 建立一個新的javabean對象user,會先判斷在page做用域內是否有叫user對象的javabean,若是有則取它,若是沒有則建立新的javabean對象 --> 3 <jsp:useBean id="user" class="a.User" scope="page"></jsp:useBean> 4 <!-- 對javabean對象的username進行賦值 --> 5 <jsp:setProperty property="username" name="user" value="wu"/> 6 <!-- 獲取javabean對象的username屬性 --> 7 <jsp:getProperty property="username" name="user"/> 8 </body>
能夠查看NewFile.jsp變爲servlet後的源代碼,看看咱們寫的javabean行爲會被轉換爲什麼種語句
這裏出現了一個JSP九大內置對象中的一個,pageContext。如今簡單提一句,pageContext就是JSP頁面的管理者(上下文),其中的getAttribute(name,scope)方法是獲取指定做用域中的數據的,若是getAttribute(name)方法的話,默認是對page做用域進行操做,findAttribute(name)依次從page、request、session、application得到內容。
在第一個紅框中,就表明中咱們的useBean行爲,其中進行了一次判斷,就是若是在page做用域中找不到user這個對象,那麼就建立一個新的,不然就使用找到的這個user對象,
第二個紅框中,表明着咱們的setProperty行爲,先找到user對象,而後在對其屬性進行賦值
第三個紅框中,表明着咱們的getProperty行爲,也是先找到user對象,而後在獲取其屬性的值。
注意:對於javabean行爲來講,有一個特色的地方,就是當請求過來的參數對應javabean的屬性時,能夠爲其一次性設置全部的值
<jsp:setProperty name="user" property="*" /> //設置user的全部屬性,屬性值從request中自動取得,*表明全部屬性。
<jsp:forward />行爲
實現請求轉發功能,Servlet中經過request.getRequestDispatcher("someServlet").forward(request,response);而在JSP中也可以實現相同的功能,只不過用的是<jsp:forward />行爲,實際上forward行爲就是對其進行了封裝。
格式:
<jsp:forward page="someServlet">
<jsp:param name="param1" value="value1"/>
<jsp:param name="param2" value="value2"/>
</jsp:forward>
page:須要跳轉到的頁面或者servlet、 <jsp:param/>參數行爲,帶一些參數過去,name、value是以鍵值對的形式帶過去的
例如:
NewFile.jsp
MyServlet.java
訪問:http://localhost:8080/test01/NewFile.jsp
瀏覽器地址欄沒有改變,說明是請求轉發
NewFile_jsp.java
使用return的好處是執行完上面的轉發,就直接return,沒有必要在執行下面的代碼了,對參數使用了URLEncode進行編碼,說明該<jsp:param/>能夠直接傳遞中文,可是前提是要設置request.setCharacterEncoding("UTF-8");爲何這樣作,看上面框起來中的代碼。
<jsp:directive/>行爲
directive行爲,就至關於JSP指令,好比<jsp:directive.page/>至關於<%@ page %>指令,等等其它指令是同樣的書寫格式。
5、JSP隱藏的九大內置對象和四大做用域
以前那麼一大段內容,就是爲了講解什麼是JSP,JSP中的內容是怎麼樣的,到這裏應該知道的差很少了, 但咱們還要深刻了解一些東西,咱們知道JSP中的內容就只有兩種,模版數據,和元素,元素就包括了指令呀,腳本呀,標籤(行爲)呀,腳本會慢慢被標籤所有代替,也就是說JSP中基本上不會嵌入Java代碼,可是咱們也知道JSP會轉換爲servlet,在Servlet中,輸出數據時,都須要經過response.getWrite();可是在JSP中,直接使用out對象進行輸出,爲何呢?這就是由於out爲JSP的一個隱藏對象,JSP中內置了9個隱藏對象,使得JSP比Servlet使用起來更簡單,更方便,
page、config、application、request、response、session、out、exception、pageContext
page:page對象表明當前JSP頁面,是當前JSP編譯後的Servlet類的對象。至關於this。
config:標識Servlet配置,類型:ServletConfig,api跟Servlet中的ServletConfig對象是同樣的,能獲取該servlet的一些配置信息,可以獲取ServletContext
application:標識web應用上下文,類型:ServletContext,詳情就看Servlet中的ServletContext的使用
request:請求對象, 類型:httpServletRequest
response:響應對象 類型:httpServletResponse
session:表示一次會話,在服務器端記錄用戶狀信息的技術
out:輸出響應體 類型:JspWriter
exception 表示發生異常對象,類型 Throwable,在上面咱們介紹page指令中的一個errorPage屬性時就有說到他
pageContext:表示 jsp頁面上下文(jsp管理者) 類型:PageContext
標記了紅色的對象就是JSP獨有的,其餘的都是Servlet中的老東西。
在這個由jsp轉換爲servlet的文件中,只能看到8個內置對象,少了exception對象,由於咱們在將page指令時,說過一個isErrorPage屬性,默認是false,被關閉了,因此其中並無exception對象。
JSP的四大做用域:page、request、session、application
這四大做用域,其實就是其九大內置對象中的四個,爲何說他們也是JSP的四大做用域呢?由於這四個對象都能存儲數據,好比request.setAttribute()注意和request.setParameter()區分開來,一個是存儲在域中的、一個是請求參數,session.setAttribute()、application其實就是SerlvetContext,天然也有setAttribute()方法。而page做用域的操做就須要依靠pageContext對象來進行了。在上面咱們也有提到JSP的四大做用域,
page做用域:表明變量只能在當前頁面上生效
request:表明變量能在一次請求中生效,一次請求可能包含一個頁面,也可能包含多個頁面,好比頁面A請求轉發到頁面B
session:表明變量能在一次會話中生效,基本上就是能在web項目下都有效,session的使用也跟cookie有很大的關係。通常來講,只要瀏覽器不關閉,cookie就會一直生效,cookie生效,session的使用就不會受到影響。
application:表明變量能一個應用下(多個會話),在服務器下的多個項目之間都可以使用。好比baidu、wenku等共享賬號。
out對象:
類型:JspWriter
jsp 輸出底層使用 response.getWriter();什麼意思呢?這裏就要講解一下JSP緩存和Servlet緩存了,輸出的過程是這樣的
JSP頁面轉換爲Servlet後,使用的out對象是JspWriter類型的,因此是會先將要發送的數據存入JSP輸出緩存中,而後,等JSP輸出緩存滿了在自動刷新到servlet輸出緩存,等serlvet輸出緩存滿了,或者程序結束了,就會將其輸出到瀏覽器上。除非手動out.flush()。
驗證servlet輸出緩存和JSP輸出緩存和咱們上面所說的是正確的。
分析:若是按沒有jsp緩存和servlet緩存的話,輸出的結果應該是aaaabbbbcccc,可是輸出的倒是bbbbaaaacccc,爲何呢?按照咱們上面所說的原理進行分析,out對象是先將其輸出到JSP緩存中,因此aaaa加入了jsp緩存,而response.getWriter().print("bbbb")是直接將bbbb輸出到servlet緩存中,而後又使用out對象將cccc輸出到jsp緩存,到程序結束,servlet緩存中有bbbb,而後jsp會將緩存中的內容就刷新到servlet緩存中,serlvet就是bbbbaaaacccc了,而後到瀏覽器也就獲得咱們的輸出結果了。若是在12行將註釋去掉,那麼輸出的結果又會是什麼呢?答案就是aaaabbbbcccc,過程自行分析。
pageContext對象:重點
這個功能就比較強大了,比較牛逼,基本上什麼他都有,由於是它是JSP頁面的管理者(上下文),因此JSP中的內置對象呀,它通通可以得到,下面介紹它的api。
一、得到其它八大內置對象 getXxx()
pageContext.getOut(); //得到out對象
pageContext.getApplication(); //得到application對象
等等....
二、對做用域的屬性進行操做(四大做用域)
對默認做用域的屬性進行操做。page
pageContext.getAttribute(name); //得到page做用域數據
pageContext.setAttribute(name,value); //給page做用域設置內容
pageContext.removeAttribute(name); //給page做用域移除內容
三、對指定做用域的屬性進行操做
getAttribute(name,scope); //得到 指定做用域中的數據
setAttribute(name,value); //給指定做用域設置內容
removeAttribute(name ,scope) 移除指定做用域的內容(page/request/session/application)
四、提供做用域常量
PageContext.PAGE_SCOPE page
PageContext.REQUEST_SCOPE request
PageContext.SESSION_SCOPE response
PageContext.APPLICATION_SCOPE application
五、一次得到指定名稱內容
findAttribute(name); //依次從page、request、session、application 得到內容
response對象:
就是響應對象,、若是不瞭解就看看講解request和response的這一章節的內容
config對象:
類型:ServletConfig
可以獲取servlet的初始化參數,獲取servletContext對象,獲取servletName
api詳情請看講解servlet這一章節
exception異常對象:
包含了異常的信息
使用它,必須結合page指令中的isErrorPage屬性和errorPage屬性。
exception.jsp 拋異常的一個NullPointException,而且跳轉到error.jsp錯誤顯示頁面 errorPage屬性的意思是若是發生未捕捉到的異常,將會跳轉到error.jsp頁面
error.jsp isErrorPage屬性說明該頁面是一個錯誤顯示頁面,則可使用exception對象
訪問http://localhost:8080/test01/exception.jsp
6、總結
經過上面一大堆一大堆的學習,咱們應該知道這些東西
一、什麼是JSP?
JSP本質上就是一個servlet,由於servlet輸出html太麻煩了,因此就有了JSP,JSP就是專門用來書寫html的,固然其中也能寫java代碼。
二、JSP的內容包括什麼?
模版數據和元素。其中元素有包括腳本(java代碼)、指令(頁面屬性)、和行爲(標籤,爲了JSP中不嵌入那麼多java代碼衍生的)
三、JSP中九大內置對象是哪九個?
九大內置對象,page、config、appliction、request、response、session、out、exception、pageContext
四、九大內置對象和servlet中對象的關係
page就是jsp轉換爲servletservlet對象自己,也就是this
config -- Servlet中的servletConfig
application -- Servlet中的ServletContext
request -- Servlet中的request
response -- Servlet中的response
session -- Servlet中的session
out -- JspWriter
exception -- 異常對象
pageContext -- 表示 jsp頁面上下文(jsp管理者) 類型:PageContext,
其中pageContext對象最牛逼,有了他就擁有了天下,哈哈~
五、JSP中的四大做用域。
page、request、session、application
其中操做page域中屬性須要藉助pageContext對象。
六、JSP中還有其餘兩大塊內容
一個是EL表達式,很重要,
另外一個是jstl標籤庫的使用,也很重要,在接下來的兩節中,就會講解到。敬請期待。