一、什么是jsp(javaServer Pages),原來是沒有jsp的,只有severlet,后來為了方便開發,將頁面顯示從severlet中提取出來,通過Java程序段和jsp標記與severlet繼續關聯(Java Servlet是JSP的技術基礎),所以當Web服務器在遇到訪問JSP網頁的請求時,首先執行其中的程序段,然后將執行結果連同JSP文件中的HTML代碼一起返回給客戶。
下面是對相關資料進行的整理:同時可以參考http://developer.51cto.com/art/200907/134623.htmJSP應用開發的背景及特點
由Sun Microsystems公司倡導、許多公司參與一起建立的一種動態網頁技術標準。它是在傳統的網頁HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet,即java腳本標簽,例如:<% %>)和JSP標記(tag,例如:<jsp: include="">),從而形成JSP文件(*.jsp),JSP可用一種簡單易懂的等式表示為:HTML+Java+JSP標記=JSP。。用JSP開發的Web應用是跨平臺的,JSP與severlet同屬于j2ee的組件,所以也是一次編寫,到處運行。
二、JSP將網頁邏輯(由java程序段和jap標記執行)與網頁設計和顯示(html標簽)分離,與JavaServlet一樣,是在服務器端執行的,就是在服務器端,JSP引擎解釋JSP標識和腳本,生成所請求的內容(生成內容的邏輯被封裝在標識和JavaBeans組件中,并且捆綁在腳本中,所有的腳本在服務器端運行。),并且將結果以HTML(或者xml)頁面的形式(返回給客戶端的就是一個HTML文本)發送回瀏覽器,因此客戶端只要有瀏覽器就能瀏覽。
三、不要將JSP于Javascript混淆:JSP屬于java的組件,使用的是java語言,所以JSP與JAVASCRIPT的區別就是JAVA與JAVASCRIPT的區別。
1.JavaScript是一種動態、弱類型、基于原型的語言,通過瀏覽器可以直接執行;而Java(JSP)是面向對象的編程語言,必須先進行編繹和連接等動作才可執行?! ?/p>
2.JavaScript編寫在HTML文件中,直接查看網頁的原始碼,就可以看到JavaScript程式,所以沒有保護,任何人都可以透過HTML文件復制程式;而Java應用在網頁的程式稱為Java Applet(Applet是[小程序]的意思),是和HTML文件分開的?! ?/p>
3.JavaScript的結構較為自由松散,而Java和正統的編程語言一樣,結構較為嚴謹?! ?/p>
4.JavaScript不具有讀寫檔案及網絡控制等功能,Java則提供了這些功能,但是JavaScript在網頁內容的控制和互動性方面,比較方便快捷的?! ?/p>
5.javascript多運行于客戶端,而java多運行于服務器端。
四、JSP有9個內置對象:
1、request對象:該對象封裝了用戶提交的信息,通過調用該對象相應的方法可以獲取封裝的信息,即使用該對象可以獲取用戶提交信息。它是HttpServletRequest的實例。實例:不必直接傳送參數到JavaBean,你可以藉由請求對象來取得參數的值: <% String name=request.getParameter("name"); out.PRintln(name); %>。
2、response對象:對客戶的請求做出動態的響應,向客戶端發送數據。
3、session對象
?。?)、什么是session:session對象是一個JSP內置對象,它在第一個JSP頁面被裝載時自動創建,完成會話期管理?! 囊粋€客戶打開瀏覽器并連接到服務器開始,到客戶關閉瀏覽器離開這個服務器結束,被稱為一個會話。當一個客戶訪問一個服務器時,可能會在這個服務器的幾個頁面之間反復連接,反復刷新一個頁面,服務器應當通過某種辦法知道這是同一個客戶,這就需要session對象。
(2)、session對象的ID:當一個客戶首次訪問服務器上的一個JSP頁面時,JSP引擎產生一個session對象,同時分配一個String類型的ID號,JSP引擎同時將這個ID號發送到客戶端,存放在Cookie中,這樣session對象和客戶之間就建立了一一對應的關系。當客戶再訪問連接該服務器的其他頁面時,不再分配給客戶新的session對象,直到客戶關閉瀏覽器后,服務器端該客戶的session對象才取消,并且和客戶的會話對應關系消失。當客戶重新打開瀏覽器再連接到該服務器時,服務器為該客戶再創建一個新的session對象?! ?/p>
(3)、session對象存在一定時間過期問題,所以存在session中的名值對會在一定時間后失去,可以通過更改session有效時間來避免這種情況。同時編程時盡量避免將大量有效信息存儲在session中,request是一個不錯的替代對象。
4、application對象
?。?)、什么是application: 服務器啟動后就產生了這個application對象,當客戶在所訪問的網站的各個頁面之間瀏覽時,這個application對象都是同一個,直到服務器關閉。但是與session不同的是,所有客戶的application對象都是同一個,即所有客戶共享這個內置的application對象?! ?/p>
(2)、application對象常用方法:
A:public void setAttribute(String key,Object obj):將參數Object指定的對象obj添加到application對象中,并為添加的對象指定一個索引關鍵字?! ?/p>
B:public Object getAttribute(String key):獲取application對象中含有關鍵字的對象。
5、out對象:是一個輸出流,用來向客戶端輸出數據。out對象用于各種數據的輸出。在頁面中例如:<%out.print("<a />")%>
6、Page對象:就是指向當前JSP頁面本身,有點象類中的this指針,它是java.lang.Object類的實例。JSP網頁本身,page對象是當前JSP頁面轉換后的Servlet類的實例。從轉換后的Servlet類的代碼中,可以看到這種關系:Object page = this;在JSP頁面中,很少使用page對象。
7、config:jav jsp validator相關的錯誤
ax.servlet. ServletConfig 的實例,該實例代表該JSP 的配置信息。常用的方法有getInitParameter(String paramNarne)及getInitParameternarnes()等方法。事實上, JSP頁面通常無須配置,也就不存在配置信息。因此,該對象更多地在Servlet中有效。很少會在jsp頁面中使用這個對象
8、exception:java.lang.Throwable的實例,該實例代表其他頁面中的異常和錯誤。只有當頁面是錯誤處理頁面,即編譯指令page的isErrorPage屬性為true時,該對象才可以使用。常用的方法有getMessage()和printStackTrace()等。
9、 pageContext:javax.servlet.jsp.PageContext的實例,網頁的屬性是在這里管理,該對象代表該JSP頁面上下文,使用該對象可以訪問頁面中的共享數據。常用的方法有getServletContext()和getServletConfig()等。
//使用pageContext設置屬性,該屬性默認在page范圍內 pageContext. setAttribute("page" , "hello") ;
//使用request設置屬性,該屬性默認在request范圍內 request. setAttribute ("request" , "hello");
//使用pageContext將屬性設置在request范圍中 pageContext.setAttribute("request2" , "hello" , pageContext.REQUEST_SCOPE);
//使用session將屬性設置在session范圍中 session.setAttribute("session" , "hello");
//使用pageContext將屬性設置在session范圍中 pageContext.setAttribute("session2" , "hello" , pageContext.SESSION_SCOPE);
//使用application將屬性設置在application范圍中 application. setAttribute ("app" , "hello") ;
//使用pageContext將屬性設置在application范圍中 pageContext.setAttribute("app2" , "hello" , pageContext.APPLICATION_SCOPE) ;
五、JSP的4個作用域:
page對象的作用范圍僅限于用戶請求的當前頁面,對page對象的引用通常存儲在pageContext對象中。
request作用域:一個HTTP請求(request請求)的處理可能需要多個Servlet合作,而這幾個Servlet之間可以通過某種方式傳遞信息,但這個信息在請求結束后就無效了(就是說request作用域是在請求未結束前有效,重定向跳轉不能使用request用域,服務器跳轉可以使用request作用域,這也很好的解釋了重定向跳轉和服務器跳轉的區別)。這幾個Servlet之間的信息共享是通過HttpServletRequest接口的兩個方法來實現的。
session作用域,會話作用域,一個客戶端與服務器端建立的鏈接,只能當前用戶訪問,在另外一個客戶端上無法訪問,傳值與跳轉方式無關,一般用重定向跳轉session是通過HttpSession接口實現,
application作用域,應用作用域,一個項目就是一個應用(程序),放置在服務器中,可以供每一個客戶端用戶訪問,application作用域上的信息傳遞是通過ServletContext實現
六、jsp標簽分三種:
指示標簽(編譯器指示):<%@ page %>指示當前頁面的屬性和運行時所需資源,屬于靜態操作
例如:<%@ page import="java.util.*" %>導包
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
其中:language表示所用的語言,
contentType規定內容的類型,所有文件都有,在編程里面叫做MIME類型:多文本網絡郵件擴充協議,負責對郵件管理,
現在逐漸衍生為對頁面類型的定義,可以去Tomcat下的conf文件夾下的web.xml文件中找
text/html這是文本類型中html格式的文件
charset=UTF-8表示使用的字符集
pageEncoding="UTF-8"專門定義當前頁面使用的字符集,與上面的重復,可以直接用上面的
<%@ include %/>:靜態包含,可以放在<body>和<head>任何位置,
<%@ include file="a.jsp" %>:把a.jsp引入到當前頁面中進行顯示,原理是將a.jsp頁面中的腳本引入(并不顯示腳本),編譯運行,在當前頁面顯示結果
<%@ taglib %/>:jstl導入標簽<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
行為標簽:也可以說是jsp的動作
<jsp:include page/>動態包含,和靜態包含的作用效果是一樣的
<jsp:include page="a.jsp"/>:把a.jsp引入,原理是程序在當前頁面中進行執行時,遇到引入a.jsp的語句,程序跳轉到a.jsp頁面中執行程序,
然后把程序的執行結果帶到當前頁面中進行顯示,程序繼續向下執行當前頁面沒有執行完的程序
<jsp:getProperty />:從對象中取值并打印到頁面
<jsp:setProperty />:為類的屬性賦值
<jsp:forward >:實現服務器端跳轉: <jsp:forward page="a.jsp"></jsp:forward >
<jsp:attribute name=""></jsp:attribute>
<jsp:params></jsp:params>
<jsp:param />傳參:<jsp:forward page="a.jsp"><jsp:param name="name" value="admin"/></jsp:forward >,
接收方面:String name=(String)request.getParameter("name");
<jsp:useBean ></jsp:useBean>就是為了使用要引入的類,格式如下:id相當于類的對象,class代表類,scope代表所使用的作用域
例子:<jsp:useBean id="stu" class="net.cstp.vo.Student" scope="page"></jsp:useBean>
<jsp:setProperty property="userName" name="stu" value="john"/>
<jsp:getProperty property="userName" name="stu"/>
腳本標簽:<%腳本 %> <%!聲明全局變量 %> <%=表達式(屬性名) %>用于輸出到頁面,注釋 <%--注釋 --%>(這種注釋通過頁面看源碼是看不到的)
七、JSP跳轉方式與區別:
重定向跳轉:客戶端訪問了一個服務器,這個服務器中有跳轉請求,服務器告訴客戶端,重新發送一個請求,去訪問另一個頁面,實現頁面的跳轉,重新定向訪問跳轉
response.sendRedirect("success.jsp");
response.sendRedirect("success.jsp?name=admin");跳轉并傳參
服務器跳轉:客戶端訪問了一個服務器,這個服務器中有跳轉請求,服務器會直接發送一個新請求,去訪問另一個頁面,實現一個服務器跳轉到另一個服務器,實現頁面跳轉
效率比較高,避免二次請求
RequestDispatcher rd=request.getRequestDispatcher("success.jsp?name=admin");跳轉并傳參
rd.forward(request,response);//里面的值是對象
//或者:
request.getRequestDispatcher("success.jsp").forward(request,response);
還有用jsp行為標簽也可以實現服務器端跳轉
<jsp:forward >:實現服務器端跳轉: <jsp:forward page="a.jsp"></jsp:forward >
<jsp:forward page="a.jsp"><jsp:param name="name" value="admin"/></jsp:forward >跳轉并傳參
服務器端跳轉與重定向跳轉的區別:
服務器端跳轉:跳轉時地址欄的地址不會跟隨跳轉頁面變化,請求會向下一直傳遞,request作用域適用
重定向跳轉:跳轉時地址欄的地址會跟隨跳轉頁面地址變化,值傳遞一次請求,適用session作用域
八、表單提交方式:post 和get
get/post區別:
get:顯示傳參,請求中傳輸的內容大小有明確的規定不大于2k,顯示結果http://localhost/jsp12.19.1/login.jsp?username=scott&userpwd=tiger,
get 在地址欄里面直接敲回車訪問,是get請求方式,超鏈接也是get請求,重定向跳轉<a></a>
post:隱式傳參,請求沒有大小限制,顯示結果http://localhost/jsp12.19.1/login.jsp,
九、jsp的三個常用配置:
1、如何顯示目錄列表:我們在本機測試程序時,一般都習慣在瀏覽器中就能遍歷到某個目錄下都有哪些文件,這就需要web服務器支持目錄列表:
打開文件conf/web.xml,找到以下代碼:<param-name>listings</param-name> <param-value>false</param-value> 將其中的false改成true
2、配置error-page:(指定處理錯誤的頁面)打開文件D:/demo/WEB-INF/web.xml:在<web-app>…</web-app>中間加入:
<error-page>
<error-code>404</error-code>
<location>/NotFound.jsp</location>
</error-page>(錯誤代碼為404的錯誤導向到NotFound.jsp)
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page> (當系統發生500錯誤即服務器內部錯誤時,跳轉到錯誤處理頁面error.jsp)
<error-page>
<exception-type>java.lang.NullException</exception-type>
<location>/error.jsp</location>
</error-page> ?。ó斚到y發生java.lang.NullException(即空指針異常)時,跳轉到錯誤處理頁面error.jsp)
提醒: 以上頁面都需要做大一點(>=2kB),否則不起作用?! ≡颍簍omcat把這樣的頁面字節限制在不少于多少字節。
3、jsp頁面出現亂碼如何解決? 在頁頭加上: <%@ page contentType=“text/html; charset=gb2312″%>
十、JSP的自定義標簽:
基本概念:
1.標簽(Tag):標簽是一種XML元素,通過標簽可以使JSP網頁變得簡潔并且易于維護,還可以方便地實現同一個JSP文件支持多種語言版本。由于標簽是XML元素,所以它的名稱和屬性都是大小寫敏感的
2.標簽庫(Tag library): 由一系列功能相似、邏輯上互相聯系的標簽構成的集合稱為標簽庫。
3.標簽庫描述文件(Tag Library Descriptor):標簽庫描述文件是一個XML文件,這個文件提供了標簽庫中類和JSP中對標簽引用的映射關系。它是一個配置文件,和Web.xml是類似的。
4.標簽處理類(Tag Handle Class): 標簽處理類是一個Java類,這個類繼承了TagSupport或者擴展了SimpleTag接口,通過這個類可以實現自定義JSP標簽的具體功能。
自定義JSP標簽的格式:
1. <% @ taglib prefix=”someprefix” uri=”/sometaglib” %>
為了使到JSP容器能夠使用標簽庫中的自定義行為,必須滿足以下兩個條件:
1)從一個指定的標簽庫中識別出代表這種自定義行為的標簽
2)找到實現這些自定義行為的具體類
解釋:第一個必需條件:找出一個自定義行為屬于那個標簽庫,是由標簽指令的前綴(Taglib Directive's Prefix)屬性完成,所以在同一個頁面中使用相同前綴的元
素都屬于這個標簽庫。每個標簽庫都定義了一個默認的前綴,用在標簽庫的文檔中或者頁面中插入自定義標簽。
所以,你可以使用除了諸如jsp,jspx,java,Servlet,sun,sunw(它們都是在JSP白皮書中指定的保留字)之類的前綴。
第二個要求是uri屬性滿足的。為每個自定義行為找到對應的類。這個uri包含了一個字符串,容器用它來定位TLD文件。在TLD文件中可以找到標簽庫中所有標簽
處理類的名稱。
2.當web應用程序啟動時,容器從WEB-INF文件夾的目錄結構的META-INF搜索所有以.tld結尾的文件。也就是說它們會定位所有的TLD文件。
對于每個TLD文件,容器會先獲取標簽庫的URI,然后為每個TLD文件和對應的URI創建映射關系。
在JSP頁面中,我們僅需通過使用帶有URI屬性值的標簽庫指令來和具體的標簽庫匹配
自定義JSP標簽的處理過程:
1.在JSP中引入標簽庫: <% @ taglib prefix=”taglibprefix” uri=”tagliburi” %>
2.在JSP中使用標簽庫標簽
3.Web容器根據第二個步驟中的prefix,獲得第一個步驟中聲明的taglib的uri屬性值
4.Web容器根據uri屬性在web.xml找到對應的元素
5.從元素中獲得對應的元素的值
6.Web容器根據元素的值從WEB-INF/目錄下找到對應的.tld文件
7.從.tld文件中找到與tagname對應的元素
8.湊元素中獲得對應的元素的值
9.Web容器根據元素的值創建相應的tag handle class的實例
10. Web容器調用這個實例的doStartTag/doEndTag方法完成相應的處理
創建和使用Tag Library的基本步驟:
1.創建標簽的處理類(Tag Handler Class)
2.創建標簽庫描述文件(Tag Library Descrptor File)
3.在web.xml文件中配置元素(加載tld文件,此步也可以省略,直接有第四步加載tld)
4.在JSP文件中引人標簽庫
感謝原文作者的用心編寫
原文鏈接:http://blog.csdn.net/javaloveiphone/article/details/7937170
新聞熱點
疑難解答