JSP簡介 JSP是由Sun Microsystems公司倡導、許多公司參與一起建立的一種動態技術標准。在傳統的網頁HTML文件(*.htm,*.html)中加入Java程序片段(Scriptlet)和JSP標簽,就構成了JSP網頁java程序片段可以操縱數據庫、重新定向網頁以及發送E-mail等,實現建立動態網站所需要的功能。所有程序操作都在服務器端執行,網絡上傳送給客戶端的僅是得到的結果,這樣大大降低了對客戶浏覽器的要求,即使客戶浏覽器端不支Java,也可以訪問JSP網頁。 JSP全名為java server page,其根本是一個簡化的Servlet設計,他實現了Html語法中的java擴張(以 <%, %>形式)。 執行過程 第一步、用戶發送請求,服務器接收到這個請求 第二步、服務器通過請求中的邏輯地址查找服務端的物理地址,檢查對應的JSP文件是否存在,如果存在則執行下一步操作,如果不存在,就返回一個 404錯誤 第三部、當服務器發現JSP文件存在後,會查看該文件是否被修改或者是新創建的,如果是就執行第四步操作,如果不是,則執行第六步操作,執行對 應的java字節碼 第四步、得到對應的JSP文件,調用JSP Parser(一種jSp分析程序),編譯成Servlet程序 第五步、調用jdk,將程序編譯對應的Servlet字節碼 第六步、執行已有的對應的字節碼。如果字節碼是未載入的,則先載入後在執行。 如果去掉中間層次的實現過程,JSP其實就是一個方便寫HTML的Servle文件罷了,其實現也是依賴於Servlet。當然其jsp轉化為Servlet的過稱是服務器(tomcat)實現的,我們不必去糾結於他的實現方式。 JSp語法概述 JSP的代碼包含了JSP元素和Template date兩類,前者是指將JSP引擎直接處理的部分,這一部分必須符合JAVA語法。否者會導致編譯錯誤(因為就是轉化為Servlet後,根據JDK執行java),後者指的是JSP引擎不處理的內容(這些數據會直接返回給客戶端) 例子: JSP語法 注釋 1、html的一般注釋代碼: [html] <!-- 注釋--> 這種注釋發送到客戶端,但不直接顯示,在源代碼中可以查看到。 由JSP parse產生的的java代碼為: [java] out.write("<!--注釋-->"); 2、html有表達式的注釋 [java] <!-- <%= new String("這是在注釋中使用java代碼")%> --> 這類注釋會編譯表達式裡面的java代碼。這種注釋發送到客戶端,但不直接顯示,在源代碼中可以查看到。 由jsp parse產生的java代碼為: [java] <span style="font-size:14px;">out.write("<!--"); out.print(new java.util.String("這是在注釋中使用java代碼")); out.write("-->");</span> 所以說後面不能加分號 3、jsp注釋 [java] <%--這是JSP注釋--%> <%--new String("這是在jsp注釋中使用java代碼");--%> 這類注釋不會以html形式發送到客戶端 編譯器指令 編譯器指令包括 “包含指令”, “頁指令” 和 “taglib指令” 它們包含在 “<%@ %>”卷標裡。 兩個主要的指令是page與include。 page指令 “<%@ page %>”指令作用於整個JSP頁面,同樣包括靜 態的包含文件。但是 “<%@ page %>”指令不能作用於動態的包含文件,可以在一個頁面中用上多個 “<%@ page %>”指令,但是其中的屬性只能用一次,不過也有例外,那就是import屬性。因為import屬性和Java中的import語句類似 (參照Java Language,import語句引入的是Java 語言中的類),所以此屬性就能用多次。 無論把 “<%@ page %>”指令放在JSP的文件的哪個地方,它的作用范圍都是整個JSP頁面。不過,為了JSP程序的可讀性,以及好的編程習慣,最好還是把它放在JSP文件的頂部。 [java] <%@page import="java.io.File"%> <%@page language="java" import="java.util.*",import="java.io.File" pageEncoding="UTF-8"%> 一般情況下我們使用jsp的話都是使用java的,所以language一般不會改動,當我們使用java包的時候需要import包,當然myeclipse在你使用相應包時會給你自動導入。 其中下列包已經被導入了,不需要我們顯示的導入: 自定義出現異常後的jsp [javascript] <%@ page errorPage="error.jsp" %> 表達式 [java] <% int a=3; %> <%= a %> 腳本段 [javascript] <%! int a = 10; %> <% switch(a){ case 10: System.out.print("代碼塊輸出成功"); break; default: System.out.print("-----"); } %> JSP聲明 [java] <%! int a=3; %> <%= a %> 雖然說與表達式中的腳本段<% int a=3; %>從表象上看是一樣的,但是實際上卻有天壤之別,查看下列代碼: [java] <%! int a=3; %> <% int b=3; %> <%= a-- %> <%= b-- %> 多次輸出,你會發現b的值是一直不變的,但a一直在減少,要理解這個,我們必須去看生成的Servlet。當我們刷新一次浏覽器的時候,會調用一次_jspService(request,resp)方法(對於tomcat來說),jsp定義int所產生的a是一個成員變量(加載在內存中了),而腳本語言定義的b是存放在_jspService方法中的,當刷新一次浏覽器,b就會重新被int。最終還是由Servlet來體現的。 對於這兩種選擇,一般我們會使用腳本段,不使用聲明。因為我們的網站有很多人訪問,如果A訪問了,修改了,B訪問了,也修改了,這樣使我們的聲明的變量不可控制(Servlet是單實例的,成員變量只有一個)。 include指令 當你在實際編寫jsp時,你會發現有些頁面內容是一樣的,jsp為我們准備了include指令,可以去掉很多我們編碼的重復性。 代碼1(使用include,調用的jsp文件): [javascript] <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%= new Date().toString() %> 代碼2(使用include 調用代碼一的jsp文件) [javascript] <body> 根目錄文件 <%@ include file="task.jsp" %> <br> </body> forward 頁面轉向,當jsp執行到forward時,jsp會進行轉向。下面是一個帶數據傳輸的forward代碼 forward.jsp [html] <body> This is my forward page. <br> <jsp:forward page="forwardTo.jsp"> <span style="white-space:pre"> </span><jsp:param value="Neal" name="userName"/> </jsp:forward> 後面的代碼就不會再執行了 </body> forwardTo,jsp [html] <body> This is my forwardTo page. <br> <% String userName = request.getParameter("userName"); String outStr = "come in "; outStr += userName; out.println(outStr); %> </body> 提示:傳值方式在include也是一樣的 在tomcat產生的forward.java中,你會發現下圖的一些代碼,因為return,所以forwar後面的就不會執行了 jsp內置對象 JSP 有以下九種內置對象,包括: request,請求對象 ,response,響應對象 ,pageContext,頁面上下文對象 session,會話對象application,應用程序對象 out,輸出對象 ,config,配置對象 ,page,頁面對象 exception,異常對象 。