JSP腳本中包含9個內置對象,這9個對象都是Servlet API接口的實例,只是JSP規範對它們進行了默認初始化,由JSP頁面對應的Servlet的_jspService()方法來建立這些實例,在JSP頁面中能夠直接使用。
1 application對象:javax.servlet.ServletContext實例,表明JSP所屬的Web應用自己,用於JSP頁面,Servlet間交換信息,一般使用setAttribute(String attName, String attValue)方法設置某一屬性名稱及其值到aplication對象中,在其它地方如Servlet或JSP頁面中調用getAttribute(String attrName)方法訪問已設置到application對象中的指定屬性名的屬性值。
2 config對象:javax.servlet.ServletConfig實例,表明JSP的配置信息。經常使用方法有getInitParameter(String paraName)和getInitParameternames()等方法。JSP配置信息一般配置在web.xml文件中,以<context-param>標籤表示一條配置信息,子標籤<param-name>表示配置項的名稱,子標籤<param-value>表示配置項的值。例如以下示例配置了數據庫驅動,配置名稱爲driver,值爲com.mysql.jdbc.Driverhtml
<context-param> <param-name>driver</param-name> <param-value>com.mysql.jdbc.Driver</param-value> </context-param>
3 exception對象:java.lang.Throwable實例,表明其它頁面中的異常和錯誤,只有當頁面是錯誤處理頁面,即頁面的編譯指令page的isErrorPage屬性爲true時,才初始化該對象,纔可以使用該對象,普通頁面不初始化該對象,不可使用該對象。一般調用getMessage()方法獲取錯誤信息,調用printStackTrace()方法打印調用棧。
4 out對象:javax.servlet.jsp.JspWriter實例,表明JSP頁面輸出流,用於輸出內容,造成HTML頁面。
5 page對象:頁面對應的Servlet類實例,表明該頁面自己,也就是Servlet中的this,能用page的地方就可以使用this。
6 pageContext對象:javax.servlet.jsp.PageContext實例,表明JSP頁面上下文,使用該對象能夠訪問頁面中的共享數據,經常使用方法有getServletContext()和getServletConfig()等。
7 request對象:javax.servlet.http.HttpServletRequest實例,該對象封裝一次請求,客戶端的請求參數都封裝在該對象裏,獲取客戶端參數時必須使用該對象,經常使用的方法有getParameter(String paramName),getParameterValues(String paramName),setAttribute(String attrName, Object attrValue),getAttribute(String attrName)和setCharacterEncoding(String env)等。
8 response對象:javax.servlet.http.HttpServletResponse實例,表明服務器對應客戶端的響應,一般不多使用該對象直接響應,而是使用out對象,除非須要生成非字符響應,而response對象經常使用於重定向,經常使用的方法有getOutputStream(),sendRedirect(java.lang.String location)等。
9 session對象:javax.servlet.http.HttpSession實例,表明一次會話。當客戶端瀏覽器與站點創建鏈接時,會話開始;當客戶端關閉瀏覽器時,會話結束。一般調用setAttribute(String attrName, Object attrValue)設置屬性值,調用getAttribute(String attrName)獲取屬性值。
如下面的HelloWorld.jsp頁面爲例:java
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>HelloWorld</title> </head> <body> Hello, World </body> </html>
其對應的Servlet文件HelloWorld_jsp.java內容片斷以下:mysql
//此處省略部分代碼 public final class HelloWorld_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent, org.apache.jasper.runtime.JspSourceImports { //此處省略部分代碼 //_jspService方法是響應用戶請求的方法 public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { final java.lang.String _jspx_method = request.getMethod(); if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD"); return; } final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.PageContext _jspx_page_context = null; //此處省略部分代碼 } }
HelloWorld_jsp.java頁面就是HelloWorld.jsp通過編譯後生成的java文件,也就是Servlet,幾乎全部JSP頁面通過編譯後都有如上結構,從代碼中能夠看出,request,response這兩個對象是_jspService()方法的形參,當Web服務器,如Tomcat調用該方法時會初始化這兩個對象,而page,pageContext,application,
config,session,out都是_jspService方法的局部對象,由該方法完成初始化。這些對象要麼是_jspService方法的形參,要麼是該方法的局部對象,而JSP頁面中的jsp腳本都會被解釋成_jspService方法的執行代碼,因此能夠在jsp代碼中直接使用這些對象。
從上面的Servlet代碼中能夠看出沒有Exception對象,由於這個頁面是普通頁面,若是頁面最開始的page指令中把isErrorPage屬性設置爲true,生成的Servlet代碼中就會有Exception對象,讀者可本身驗證。web