javaweb入門筆記(6)-JSP技術

javaweb入門筆記(6)-JSP技術

標籤: javawebhtml


[TOC]java


JSP:Java Server Pages,一種動態web資源的開發技術git

API文檔github

JSP 2.3 API - Apache Tomcat 8.0.30web

調用和運行原理

JSP本質是一個servlet.apache

每一個JSP頁面在第一次被訪問時,WEB容器會把請求交給JSP引擎(即一個JAVA程序)處理。JSP引擎先將JSP翻譯成一個_jspServlet(實質也是一個servlet),而後按照servlet的調用方式進行調用。api

  • 服務器會將jsp先翻譯成servlet,這個servlet位於tomcat服務器work目錄,這jsp類的父類是org.apache.jasper.runtime.HttpJspBase,這個HttpJspBase類繼承自HttpServlet
  • 向服務器發請求會調用servlet的service方法;一樣地,訪問jsp會調用這個JSP類的_jspService方法。
  • JSP中的標籤語言會在_jspService方法中經過out.write()寫出來;JSP中的Java代碼會原封不動的搬到_jspService方法中。
  • _jspService方法中提早準備好了一些對象供JSP調用,如:out,page,application,request,response等等。
  • 因爲第一次訪問時會翻譯成servlet,因此第一次訪問較慢。

下面以demo1.jsp爲例,展現對應的類%CATALINA_HOME%\work\Catalina\localhost\hello\org\apache\jsp\demo1_jsp.java中的部分代碼瀏覽器

示例1:demo1.jsp緩存

<%@ page import="java.util.Date" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2016/1/27
  Time: 16:45
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo1</title>
</head>
<body>
當前時間時:
<%
    Date date = new Date();
    out.write(date.toGMTString());
%>
</body>
</html>

示例2:_jspService方法中代碼片斷tomcat

out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("    <title>demo1</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("當前時間時:\r\n");

Date date = new Date();
out.write(date.toGMTString());

out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");

示例3:_jspService方法中一些定義的對象

final javax.servlet.jsp.PageContext pageContext;
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;

JSP語法

  • JSP模板元素:JSP頁面中的HTML內容。定義了網頁的基本骨架,即結構和外觀。
  • JSP表達式:用於將程序數據輸出到客戶端。如,<%=變量或表達式 %>腳本表達式(無分號),用於輸出數據。
  • JSP腳本片斷:用於在JSP頁面中編寫多行java代碼,嚴格遵循java語法。一個JSP頁面可有多個腳本片斷,它們能夠相互訪問(和放在一對<% %>中同樣),單個片斷可不完整。
  • JSP聲明:JSP中代碼默認翻譯到servlet的service方法中,而JSP聲明中的代碼被翻譯到_jspService方法外。語法:<%! java代碼 %>
  • JSP註釋:格式<%-- 註釋 --%>,註釋的內容不會發給瀏覽器。
  • JSP指令:是爲JSP引擎設計的,定義了三個指令:page指令,include指令,taglib指令。語法:<%@ 指令 屬性名="值" %>
    • page指令:定義各類屬性,做用於整個JSP頁面。
    • include指令:用於包含JSP文件(頁頭、頁腳)。屬於靜態包含(編譯時包含),它包含的全部JSP會編譯成一個servlet。
    • taglib指令:用於在JSP頁面導入標籤庫。
  • JSP標籤:也稱爲jsp Action元素,用於在jsp頁面中提供業務邏輯功能,避免在jsp頁面中直接寫java代碼而難以維護
  • JSP內置對象:九大隱式對象,request,response,session,application,config,page,exception,out,pageContext

關於上述語法的一些說明

page指令語法:

<%@ page
[ language="java" ]
[ extends="package.class" ]
[ import="{package.class | package.*}, ..." ]
[ session="true | false" ]
[ buffer="none | 8kb | sizekb" ]
[ autoFlush="true | false" ]
[ isThreadSafe="true | false" ]
[ info="text" ]
[ errorPage="relativeURL" ]
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
[ isErrorPage="true | false" ]
%>
  • errorPage:錯誤提示頁面。也可在web.xml<error-page>標籤配置,異常處理頁面。在page指令設置的優先級高於在web.xml配置。
  • pageEncoding:JSP引擎以何種碼錶翻譯JSP,該值需和JSP文件的保存編碼一致,且若要在瀏覽器正確顯示,還要和contentType一致。

動態包含(運行時包含):request.getRequestDispatcher("/public/head.jsp").include(request,response),涉及到的jsp會生成單獨的servlet,即有多個servlet,在瀏覽器訪問時包含。靜態包含性能優於動態包含

JSP經常使用標籤

  • <jsp:include>:pageContext.include(),動態包含
  • <jsp:forward>
  • <jsp:param>

九大隱式對象

JSP引擎在調用JSP對應的_jspServlet時,會傳遞和建立9個web開發相關的對象供使用。後二者(outpageContext)爲JSP獨有

  • request
  • response
  • session
  • application
  • config
  • page
  • exception
  • out
  • pageContext

out隱式對象

out隱式對象:用於向客戶端發送文本數據。經過調用pageContext對象的getOut方法返回,類型爲JspWriter,做用和ServletResponse.getWriter返回的PrintWriter對象類似。

JspWriter至關於自帶緩存功能的PrintWriter,設置page指令的buffer屬性課調整緩存大小。知足以下條件之一,out對象才調用ServletResponse.getWriter方法,並經過返回的PrintWriter對象將out對象的緩衝區的內容真正寫入到servlet引擎提供的緩衝區中:

  • 設置page指令的buffer屬性關閉的out對象的緩存功能
  • out對象的緩衝區已滿
  • 整個JSP頁面結束

例子:

<%
    out.write("out.write<br/>");
	response.getWriter().write("response.getWriter.write<br/>");
%>

瀏覽器顯示:

response.getWriter.write
out.write

可見,因爲out有緩衝,因此後顯示。

pageContext對象

pageContext對象:是JSP技術中最重要的一個對象,它表明JSP頁面的運行環境

  • 封裝了對其餘8大隱式對象的引用(主要用於自定義標籤開發)
  • 自身是一個域對象,可用來保存數據(page域存的東西只能在頁面範圍內拿得出來)
  • 封裝了web開發中的一些經常使用操做(提供管理全部域的入口),如:引入和跳轉其餘資源、檢索其餘域對象中的屬性等

Class PageContext的API文檔

javax.servlet.jsp:Class PageContext

javaweb中的四個域:

  • application域:應用程序範圍,servletContext,對應的常量PageContext.APPLICATION_SCOPE
  • session域:會話範圍,session,對應的常量PageContext.SESSION_SCOPE
  • resquet域:請求範圍,request,對應的常量PageContext.REQUEST_SCOPE
  • page域:頁面範圍,pageContext,對應的常量PageContext.PAGE_SCOPE

findAttribute(java.lang.String name)查找各個域中的屬性,是PageContext從父類javax.servlet.jsp.JspContext繼承的,實現了父類的抽象方法。會依次page,request,session,application域中尋找相應的屬性,找到爲止。

jsp映射和查錯

jsp映射

webxml<servlet>標籤中加<jsp-file>標籤,其餘的和servlet映射同樣

查找jsp頁面中的錯誤

  • JSP頁面中的語法格式有問題,致使不能翻譯成servlet源文件,JSP引擎將提示這類錯誤在JSP頁面中的位置以及相關信息
  • JSP頁面中的語法格式沒有問題,但翻譯承德servlet源文件出現java語法問題致使源文件編譯不經過,JSP引擎將提示這類錯誤在JSP頁面中的位置以及相關信息
  • JSP頁面翻譯成的servlet程序運行時出現異常,這和普通java程序運行時錯誤徹底同樣,java虛擬機將提示錯誤在servlet源文件中的位置以及相關信息

jsp與JavaBean

JavaBean是一個遵循特定寫法的java類,JavaBean經常使用於封裝數據,具備以下熱點:

  • 該java類必須有一個無參的構造函數
  • 屬性必須私有化
  • 私有化的屬性必須經過public類型的方法暴露給其餘程序,而且方法的命名也必須遵循必定的命名規範。

JSP中提供了三個關於JavaBean的標籤:

  • <jsp:useBean>:用於在JSP頁面中查找或實例化一個JavaBean組件
  • <jsp:setProperty>:用於在JSP頁面中設置一個JavaBean組件的屬性
  • <jsp:getProperty>:用於在JSP頁面中獲取一個JavaBean組件的屬性

一些細節

  • <jsp:useBean>標籤的標籤體只在實例化bean時才執行
  • <jsp:setProperty>可用請求參數給bean屬性賦值,支持8種基本數據類型的轉換(把客戶機提交的字符串轉成相應的8種基本類型賦到bean的屬性上)
  • 在標籤中將property="*",用全部請求參數爲bean賦值,請求參數名稱和bean屬性名稱必需要一致
  • 若是JavaBean實例對象的某個屬性值爲null,那麼使用<jsp:getProperty>標籤輸出結果爲**"null"字符串**

做者@brianway更多文章:我的網站 | CSDN | oschina

相關文章
相關標籤/搜索