JSP全稱是Java Server Pages,它和servle技術同樣,都是SUN公司定義的一種用於開發動態web資源的技術。JSP這門技術的最大的特色在於,寫jsp就像在寫html,但它相比html而言,html只能爲用戶提供靜態數據,而Jsp技術容許在頁面中嵌套java代碼,爲用戶提供動態數據。html
當用戶第一次訪問JSP頁面時,該頁面會被JSPServlet翻譯成一個Servlet源文件,而後將源文件翻譯成.class文件。Servlet源文件和.class文件通常放在當前Work Space下的.metadata中,能夠在該目錄下搜索對應的Servlet源文件和.class文件。如下是一個簡單的JSP程序,文件名稱爲index.jspjava
<%@ page language="java" contentType="text/html; charset=utf-8" %> <html> <head> <title>servlet學習</title> </head> <body> <% out.println(new java.util.Date().toLocaleString()); %> </body> </html>
搜索對應的Servlet源文件和.class文件,文件結構以下所示:web
能夠看出,index.jsp文件被翻譯成了index_jsp.java和index_jsp.class,打開index_jsp.java文件,翻譯後的Servlet源碼以下:express
/* * Generated by the Jasper component of Apache Tomcat * Version: Apache Tomcat/8.0.30 * Generated at: 2016-05-27 01:49:52 UTC * Note: The last modified time of this file was set to * the last modified time of the source file after * generation to assist with modification tracking. */ package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent, org.apache.jasper.runtime.JspSourceImports { private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private static final java.util.Set<java.lang.String> _jspx_imports_packages; private static final java.util.Set<java.lang.String> _jspx_imports_classes; static { _jspx_imports_packages = new java.util.HashSet<>(); _jspx_imports_packages.add("javax.servlet"); _jspx_imports_packages.add("javax.servlet.http"); _jspx_imports_packages.add("javax.servlet.jsp"); _jspx_imports_classes = null; } private volatile javax.el.ExpressionFactory _el_expressionfactory; private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; } public java.util.Set<java.lang.String> getPackageImports() { return _jspx_imports_packages; } public java.util.Set<java.lang.String> getClassImports() { return _jspx_imports_classes; } public javax.el.ExpressionFactory _jsp_getExpressionFactory() { if (_el_expressionfactory == null) { synchronized (this) { if (_el_expressionfactory == null) { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); } } } return _el_expressionfactory; } public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { if (_jsp_instancemanager == null) { synchronized (this) { if (_jsp_instancemanager == null) { _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } } } return _jsp_instancemanager; } public void _jspInit() { } public void _jspDestroy() { } 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; try { response.setContentType("text/html; charset=utf-8"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out; out.write("\r\n"); out.write("\r\n"); out.write("<html>\r\n"); out.write("<head>\r\n"); out.write("\t<title>servlet學習</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); out.write("\t"); out.println(new java.util.Date().toLocaleString()); out.write("\r\n"); out.write("</body>\r\n"); out.write("</html>"); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { if (response.isCommitted()) { out.flush(); } else { out.clearBuffer(); } } catch (java.io.IOException e) {} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); else throw new ServletException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } } }
從代碼中看出,index.jsp翻譯後的Servlet類爲index_jsp,其並無實現Servlet接口,可是繼承了org.apache.jasper.runtime.HttpJspBase類,在Tomcat源文件中查看HttpJspBase類源碼能夠得出:HttpJspBase繼承了HttpServlet,也就是說index_jsp類也是一個Servlet。HttpJspBase中的service()直接調用了_jspService()方法,也就是調用了index_jsp中的_jspService()方法。apache
JSP表達式緩存
JSP表達式用於將程序數據輸出到客戶端,它將要輸出的變量或者表達式直接封裝在以"<%= expression %>"結尾的標記中。tomcat
<%= expression %>
JSP腳本片斷服務器
JSP腳本片斷是指嵌套在"<%"和"%>"之中的一條或多條Java程序代碼,這些Java代碼必須遵循Java語法規範,不然編譯報錯。session
<% int num = 1; out.println(num); %>
JSP聲明app
當JSP頁面被翻譯成Servlet程序時,JSP包含的腳本片斷、表達式、模板元素都將轉換爲Servlet中_jspService()方法的程序代碼,這是,JSP腳本片斷中定義的變量都將成爲_jspService()中的程序代碼,這時,JSP腳本片斷中定義的方法都將插入到_jspService()中,這顯然會引發語法錯誤。爲了解決這個問題,在JSP提供了聲明,以"<%!"開頭,"%>"結尾。格式以下:
<%! java代碼 %>
JSP註釋
JSP有本身的註釋方式,語法格式以下:
<%-- 註釋信息 --%>
JSP2.0中定義了page、include和taglib三種指令,每種指令都定義了各自的屬性。
page指令
<%@ page 屬性名="屬性值" %>
page指令的主要經常使用屬性
屬性名稱 | 氣質範圍 | 功能 |
language | java | jsp文件採用的語言,默認Java |
import | 任何報名、類名 | 指定導入的包或類 |
session | true或false | JSP是否內置session對象,默認session屬性爲true |
buffer | none或者數字+kb | 指定緩存大小,也就是out緩衝區大小 |
isErrorPage | true或者false | 該頁面是不是錯誤處理頁面 |
errorPage | 某個JSP頁面的路徑 | 制定一個錯誤處理頁 |
使用page指令程序示例
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ page import="java.util.Date" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>servlet學習</title> </head> <body> <%= new Date() %> </body> </html>
include指令
有時在JSP頁面上須要包含一個HTML文件、文本文件時,能夠經過include指令來實現,語法格式以下:
<%@ include file="relativeURL" %>
JSP頁面中,有一些對象須要頻繁使用,所以,JSP提供了9個隱式對象,他們是JSP默認建立的,能夠直接在JSP頁面上使用,如下是JSP的9個隱式對象。
隱式對象名稱 | 類型 | 功能 |
out | javax.servlet.jsp.JspWriter | 頁面輸出 |
request | javax.servlet.http.Request | 獲得用戶請求信息 |
response | javax.servlet.http.Response | 服務器響應信息 |
config | javax.servlet.ServletConfig | 服務器配置,可獲取初始化參數 |
session | javax.servlet.http.HttpSession | 保存用戶信息 |
application | javax.servlet.ServletContext | 全部用戶共享的信息 |
page | java.lang.Object | 當前頁面轉換後的Servlet類實例 |
pageContext | javax.servlet.jsp.PageContext | JSP頁面容器 |
exception | java.lang.Throwable | JSP頁面發生的異常,只在錯誤頁起做用 |
out對象
JSP頁面中,須要向客戶端發送文本內容時,能夠使用out對象來實現,其是javax.servlet.jsp.JspWriter的實例對象,做用和ServletResponse.getWrite()返回的PrintWrite對象相似。不一樣的是,out對象是一種帶緩存功能的PrintWrite,其緩衝區大小能夠有page指令來設置。
注意:out對象經過print寫入數據後,知道整個JSP頁面結束,out對象輸入緩衝區的數據才真正寫入到Servlet提供的緩衝區中,而Response.getWrite().print語句是直接把內容寫入到Servlet提供的緩衝區中的。
pageContext對象
JSP頁面中要想獲取隱式對象,能夠使用pageContext對象,它是javax.servlet.jsp.PageContext的實例,表明當前JSP頁面的運行環境,並提供了一些列用於獲取其餘隱式對象的方法。
方法 | 功能 |
JspWrite getOut() | 獲取out隱式對象 |
Object getPage() | 獲取page隱式對象 |
ServletRequest getRequest() | 獲取request隱式對象 |
ServletResponse getResponse() | 獲取response隱式對象 |
HttpSession getSession() | 獲取session隱式對象 |
Exception getException() | 獲取exception隱式對象 |
ServletConfig getServletConfig() | 獲取config隱式對象 |
ServletContext getServletContext() | 獲取application隱式對象 |