前面講了servlet入門實踐如今開始介紹jsp入門實踐,開發環境的搭建請參考我前面的tomcat的文章,jsp入門教程分爲上下兩部分,第一部分簡單講解:jsp語法的規範,以及三大編譯指令,七個動做指令和九大內置對象,生命週期講解等。html
所有代碼下載:連接java
JSP全名爲Java Server Pages,中文名叫java服務器頁面,其根本是一個簡化的Servlet設計,它[1] 是由Sun Microsystems公司倡導、許多公司參與一塊兒創建的一種動態網頁技術標準。JSP技術有點相似ASP技術,它是在傳統的網頁HTML(標準通用標記語言的子集)文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP標記(tag),從而造成JSP文件,後綴名爲(*.jsp)。 用JSP開發的Web應用是跨平臺的,既能在Linux下運行,也能在其餘操做系統上運行。
第一個jsp程序:web
<%@ 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>Insert title here</title> </head> <body> <% out.print("hello peace"); %> </body> </html>
腳本程序,就是爲了在HTML中穿插java代碼,能夠包含任意語法真確的java語句,變量,方法或表達式。生成servlet源碼時該處的代碼被放到_jspService()方法中apache
<% out.print("hello peace"); %>
<% for(int i=0;i<5;i++) { out.print("hello peace"+i); %> <br/> <% out.print("換行符穿插在中間了,同樣會被循環輸出"); }//for循環結束 %>
一個聲明語句能夠聲明一個或多個變量、方法,供後面的Java代碼使用。在JSP文件中,您必須先聲明這些變量和方法而後才能使用它們。生成servlet源碼時該處的代碼成爲類的屬性和方法;瀏覽器
<%! private int i=10; %> <%! public void test(){ int a=0; int b=2; a=a+b; System.out.print(a); } %>
一個JSP表達式中包含的腳本語言表達式,先被轉化成String,而後插入到表達式出現的地方,做用至關於腳本中的out(輸出)
因爲表達式的值會被轉化成String,因此您能夠在一個文本行中使用表達式而不用去管它是不是HTML標籤。
表達式元素中能夠包含任何符合Java語言規範的表達式,可是不能使用分號來結束表達式。
生成servlet源碼時該處的代碼被放到_jspService()方法中緩存
<%--在腳本處聲明的變量是局部變量不能帶有修飾符 --%> <% String nick="sisi"; int a=10,b=10; %> 3.jsp表達式:<br/> <%--表達式能夠輸出至關於out.write 不須要分號結束--%> <%=(a-b) %> <%=nick %> <hr/>
JSP註釋不會出如今html的源碼中 能夠用來註釋jsp的代碼,html註釋會出如今html的源碼中;tomcat
1.jsp註釋:<br/> <%-- 這些註釋不會出如今html的源碼中 能夠用來註釋jsp的代碼--%>
JSP編譯指令用來設置與整個JSP頁面相關的屬性;
主要有三大編譯指令:服務器
<%@ page ... %> 定義頁面的依賴屬性,好比腳本語言、error頁面、緩存需求等等 <%@ include ... %> 包含其餘文件 <%@ taglib ... %> 引入標籤庫的定義,能夠是自定義標籤
Page指令爲容器提供當前頁面的使用說明。一個JSP頁面能夠包含多個page指令。session
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.Random"%>
JSP能夠經過include指令來包含其餘文件。被包含的文件能夠是JSP文件、HTML文件或文本文件。包含的文件就好像是該JSP文件的一部分,會被同時編譯執行。app
<%-- 1.原理是把被包含的頁面(header.jsp) 的內容翻譯到包含頁面(index.jsp)中,合併成翻譯成一個java源文件, 再編譯運行!!,這種包含叫靜態包含(源碼包含) 2.被包含頁面中不須要出現全局的html標籤了!!! (如html、head、body)--%> <%@include file="/common/header.jsp"%>
JSP API容許用戶自定義標籤,一個自定義標籤庫就是自定義標籤的集合。Taglib指令引入一個自定義標籤集合的定義,包括庫路徑、自定義標籤。
本身定義的標籤庫 <%@ taglib uri="http://rlovep.com" prefix="rlovep" %>
動做指令與編譯指令不一樣,編譯指令時通知servlet引擎的處理消息,而動做指令只是運行時的動做。編譯指令在將JSP編譯成Servlet時起做用,而處理指令一般可替換成JSP腳本,它只是JSP腳本的標準化寫法。
(1)JSP:forward 執行頁面轉向,將請求的處理轉發到下一個頁面。
(2)JSP:param 用於傳遞參數,必須與其餘支持參數的標籤一塊兒使用
(3)JSP:include 用於動態引入一個JSP頁面
(4)JSP:plugin 用於下載JavaBean或者Applet到客戶端執行
(5) JSP:useBean 建立一個Javabean實例
(6) JSP:setProperty 設置JavaBean實例的屬性值
(7)JSP:getProperty 獲取JavaBean實例的屬性值
jsp:forward動做把請求轉到另外的頁面。jsp:forward標記只有一個屬性page。
<%--轉發 jsp:foward 參數 jsp:param <jsp:forward page="/action2.jsp"> <jsp:param value="peace" name="name"/> <jsp:param value="123456" name="pass"/> </jsp:forward> --%>
jsp:include>動做元素用來包含靜態和動態的文件。該動做把指定文件插入正在生成的頁面
<%--動態包括 --%> 動態包括: <jsp:include page="/common/header1.jsp"> <jsp:param value="lucc" name="name"/> </jsp:include>
這三個指令都是與JavaBean相關的指令,其中userBean指令用於在JSP頁面中初始化一個java實例,setProperty指令用於爲JavaBean實例的屬性設置值;getProperty指令用於輸出JavaBean實例的屬性。
<%--useBean setProperty getProperty --%> <%--建立Student的實例 實例名稱爲student 屬性範圍爲page --%> <hr/> <jsp:useBean id="student" class="com.rlovep.entity.Student" scope="page"/> <%--設置student的name值 --%> <jsp:setProperty name="student" property="name" value="peace"/> <%--輸出 student的name值--%> name:<jsp:getProperty name="student" property="name" />
param用於設置參數值,這個指令自己不能單獨使用,所以單獨的param指令沒有實際意義,param指令能夠與如下指令結合使用
jsp:include jsp:forward jsp:plugin。使用方法上面已經介紹;
plugin指令主要用於下載服務器端的JavaBean或Applet到到客戶端執行,因爲程序在客戶端執行,所以客戶端必須安裝虛擬機。該指令用處較少,不作介紹;
須要創建,action.jsp本文件,以級轉發頁面action2.jsp,被包含頁面/common/header1.jsp,JavaBean:Student類
<%--轉發 jsp:foward 參數 jsp:param <jsp:forward page="/action2.jsp"> <jsp:param value="peace" name="name"/> <jsp:param value="123456" name="pass"/> </jsp:forward> --%> <%--動態包括 --%> 動態包括: <jsp:include page="/common/header1.jsp"> <jsp:param value="lucc" name="name"/> </jsp:include> <%--useBean setProperty getProperty --%> <%--建立Student的實例 實例名稱爲student 屬性範圍爲page --%> <hr/> <jsp:useBean id="student" class="com.rlovep.entity.Student" scope="page"/> <%--設置student的name值 --%> <jsp:setProperty name="student" property="name" value="peace"/> <%--輸出 student的name值--%> name:<jsp:getProperty name="student" property="name" />
JSP腳本中包含9個內置對象,這9個內置對象都是Servlet API接口的實例,只是JSP規範對他們默認進行了初始化(由JSP頁面對應的Servlet的_jspService()方法來建立這些實例)。也就是它們已是對象,能夠直接使用。
JSP初始化該9個對象的地方能夠經過生成的servlet類看到以下:
request、response兩個對象是_jspService()方法的形參,當Tomcat調用該方法時會初始化這兩個對象。而page、pageContext、application、config、session、out都是_jspService()方法的局部變量,由該方法完成初始化。
<%@ 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>Insert title here</title> </head> <body> <%--out對象:對應jspwriter --%> <% /* for(int i=0;i<=1024;i++){ out.write("a"); } System.out.println("當前緩存區大小:"+out.getBufferSize()); System.out.println("剩餘緩存區大小:"+out.getRemaining()); */ //若是不刷新則,123先輸出; //out.flush(); response.getWriter().write("123"); %> <%-- application對象:對應servlet中的context 存儲的屬性,是整個應用共享的;一樣能夠得到配置參數; --%> <% //存儲屬性 application.setAttribute("name", "peace"); %> <%=application.getInitParameter("keys") %> <%-- config對象:對應servlet中的config 用處不是很大 --%> <%=config.getServletName() %> <%-- exception對象:在錯誤頁面中有效,能夠得到異常屬性 親發生錯誤:該對象只有當編譯指令page的isErrorPage="true"纔有效 <%=exception.getMessage() %> --%> <%-- request對象:對應servlet中的request --%> <%=request.getLocalName() %> <%-- response對象:對應servlet中的response --%> <% response.getWriter().println("hello respose"); %> <%-- session對象:對應servlet中的session --%> <% session.setAttribute("pass", "567"); %> <%-- pagecontext對象:jsp的頁面對象 能夠得到其餘八個對象: --%> <% //得到其餘對象 response.getWriter().write("是否相等?"+(out==pageContext.getOut())+"<br/>"); %> <%--能夠往不一樣的域中存對象 --%> <% pageContext.setAttribute("message", "wang"); pageContext.setAttribute("age", "22", PageContext.REQUEST_SCOPE); pageContext.setAttribute("qq", "374126165", pageContext.SESSION_SCOPE); pageContext.setAttribute("tl","1881679",pageContext.APPLICATION_SCOPE); //重定向到另外一個頁面取得數據: response.sendRedirect(request.getContextPath()+"/pageget.jsp"); //刪除存儲的對象 pageContext.removeAttribute("age",PageContext.REQUEST_SCOPE ); %> </body> </html>
理解JSP底層功能的關鍵就是去理解它們所遵照的生命週期。JSP生命週期就是從建立到銷燬的整個過程,相似於servlet生命週期,區別在於JSP生命週期還包括將JSP文件編譯成servlet。
訪問:http://localhost:8080/工程名/NewFile.jsp
第一次訪問jsp:走(1)(2)(3)(4)
以後的訪問:走(4)
注意:jsp文件修改了或jsp的臨時文件被刪除了,要從新走翻譯(1)和編譯(2)的過程
<%! public void jspInit(){ initVar++; System.out.println("jspInit(): JSP被初始化了"+initVar+"次"); } %>
<%! public void jspDestroy(){ destroyVar++; System.out.println("jspDestroy(): JSP被銷燬了"+destroyVar+"次"); } %>
Servlet的生命週期: 1)構造方法(第1次訪問) 2)init方法(第1次訪問) 3)service方法 4)destroy方法 Jsp的生命週期: 1)翻譯: jsp->java文件 2)編譯: java文件->class文件(servlet程序) 3)構造方法(第1次訪問) 4)init方法(第1次訪問):_jspInit() 5)service方法:_jspService() 6)destroy方法:_jspDestroy()
<%@ 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>Insert title here</title> </head> <body> <%! //記錄執行次數: private int initVar=0; private int serviceVar=0; private int destroyVar=0; %> <%! public void jspInit(){ initVar++; System.out.println("jspInit(): JSP被初始化了"+initVar+"次"); } public void jspDestroy(){ destroyVar++; System.out.println("jspDestroy(): JSP被銷燬了"+destroyVar+"次"); } %> <% serviceVar++;// System.out.println("_jspService(): JSP共響應了"+serviceVar+"次請求"); //對各個的執行次數計數 String content1="初始化次數 : "+initVar; String content2="響應客戶請求次數 : "+serviceVar; String content3="銷燬次數 : "+destroyVar; %> <%-- 輸出顯示 --%> <h1><%=content1 %></h1> <h1><%=content2 %></h1> <h1><%=content3 %></h1> </body> </html>
顯示以下:
來自一條小鯊魚wpeace(rlovep.com)