第一篇:總結JSP與servlet之間的傳值[小編推薦]
總結JSP與servlet之間的傳值
JSP與 servlet之間的傳值有兩種情況:JSP-> servlet,servlet-> JSP。通過對象 request和 session(不考慮 application)完成傳值。
一、JSP-> servlet JSP頁面有3種方法向 servlet傳值: form表單、URL、其他
...<%......session.setAttribute(“testSession”,“Hello session”);
reqeust.setAttribute(“testRequest”,“Hello request”);%> click me
...1、對于該JSP頁面 form表單的內容,如 標簽,在 servlet可用 request.getParameter(“username”);獲取。2、URL:比如這里的 標簽的 href屬性與
3、java片段代碼,servlet只能接到 session.setAttribute(“testSession”,“Hello session”)的內容,而接不到 request的內容。在 servlet里用 request.getSession().getAttribute(“testSession”)獲取 session內容。
二、Servlet
1、關于 servlet,首先要提到它在 web.xml里的注冊內容,如
假如 project name 是 jsp2servlet,則該 project根目錄的 Context是 /jsp2servlet,在地址欄里顯示是 http://localhost:8080/jsp2servlet/;
在 project 根目錄下有 admin目錄,對應的 Context是/admin/jsp2servlet,在地址欄里顯示是 http://localhost:8080/jsp2servlet/admin,在這兩個目錄下的 jsp 都想轉到 com.demo.JspServletDemo類做處理,這時的 url需要在 web.xml注冊兩次。
1)在 http://localhost:8080/jsp2servlet/ 目錄下的 jsp 頁面 JspServlet1,url應寫為 “JspServlet”
2)在 http://localhost:8080/jsp2servlet/admin/ 目錄下的 jsp 頁面訪問 JspServlet2,url應寫為 “admin/JspServlet”
2、在 servlet直接用 request對象,得到發(fā)送來的請求內容;用 request.getSession(),得到 session對象,從而得到會話內容。
這里的 request.getSession()的參數為 boolean 類型,該方法意思可理解為:
session可以認為是每一個IE進程對應一個會話(新開一個IE進程就可以對應兩個會話的),getSession都是返回當前用戶的會話對象,參數的區(qū)別在于:
參數為true(默認),則如果“當前用戶的會話對象”為空(第一次訪問時)則創(chuàng)建一個新的會話對象返回;
參數為false,則如果“當前用戶的會話對象”為空,則返回 null(即不自動創(chuàng)建會話對象)。
利用這個方法可以判斷 session是否過期,如下:
if(request.getSession(false)==null)
System.out.println(“Session has been invalidated!”);else
System.out.println(“Session is active!”);
三、Servlet-> JSP 從 servlet轉到 jsp不外乎兩種方法,重定向 和 url轉發(fā)
1、重定向(Redirect):是路徑的跳轉,內容和 url都改變。不允許帶 request參數(session參數可以),即不允許在 servlet里給 request對象使用setAttribute方法傳給下一頁面。在 servlet里使用 response.sendRedirect(url)方法。注意這里的 url前不帶斜線 /,如 response.sendRedirect(”test.jsp“)
2、url轉發(fā)(Forward):是頁面的跳轉,頁面內容發(fā)生改變,url不變??梢詭?request和 session參數。在 servlet里使用 getServletConfig().getServletContext().getRequestDispatcher(url).forward(request, response)。而這里的 url前需要帶斜線 /,如getServletConfig().getServletContext().getRequestDispatcher(”/test.jsp“).forward(request, response)
servlet使用RequestDispatcher到jsp頁面
String url=“/EShop.jsp”;
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher(url);rd.forward(req, res);
servlet重定向jsp,并將數據發(fā)送到別一個JSP中: request.setAttubute(“messages”,aaa);
RequestDispatcher requestDispatcher=request.getRequestDispatcher(“/jsp/testbean.jsp”);requestDispatcher.forward(request,response);
3.7、Servlet跳轉
從JSP跳轉到Servlet可以實現,通過表單提交或超鏈接可以做到,但是現在如果從一個Servlet跳轉到JSP呢?
? HttpServletResponse對象,此對象可以完成跳轉:public void sendRedirect();JumpServlet.java: package org.lxh.demo;import javax.servlet.*;import javax.servlet.http.*;import java.io.*;public class JumpServlet extends HttpServlet{ public void init()throws ServletException{
} public void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,java.io.IOException{ resp.sendRedirect(“jump.jsp”);} public void doPost(HttpServletRequest req,HttpServletResponse resp)throws ServletException,java.io.IOException{ this.doGet(req,resp);} public void destroy(){ } };web.xml:
public void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,java.io.IOException{ request.getSession().setAttribute(“name”,“hello”);resp.sendRedirect(“jump.jsp”);} jump.jsp:
<%=session.getAttribute(“name”)%>
此時,發(fā)現可以通過session屬性范圍傳遞內容,但是如果現在傳遞的內容很多,而程序中使用session范圍的話則肯定會帶來額外的性能降低,但是此時,這些值只使用一次顯示,那肯定沒有必要使用session對象,最好使用request范圍。如果request屬性范圍也有一個限制,必須是服務器端跳轉,在JSP中使用public void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,java.io.IOException{ req.setAttribute(“name”,“hello”);// 準備跳轉到此頁面
RequestDispatcher rd = req.getRequestDispatcher(“jump.jsp”);// 把所有的請求向下繼續(xù)傳遞
rd.forward(req,resp);} 注意:
當需要傳遞request屬性范圍的時候才使用服務器端跳轉。如果不需要傳遞,則可以選擇任意的跳轉方式。
但是一般情況下都使用RequestDispatcher進行跳轉,而且一定要記住的時候,跳轉之后頁面地址不會有任何的變化。
第二篇:Tomcat開發(fā)jsp與servlet總結
一,添加虛擬目錄: 1.在tomcat安裝目錄下webapps建一目錄,例如:myweb.2.在此目錄下建目錄WEB-INF(全部為大寫),3.在WEB-INF目錄下建立文件web.xml,在此文件中添加如下內容:
第三篇:Servlet和JSP經驗總結
Servlet和JSP經驗總結
這里介紹Servlet和JSP經驗總結,包括在servlet的init()方法中緩存數據、禁止Servlet和JSP自動重載、將頁面輸出進行壓縮和正確地確定javabean的生命周期等七種實用的方法。
在servlet的init()方法中緩存數據
當應用服務器初始化Servlet和JSP實例之后,為客戶端請求提供服務之前,它會調用這個servlet的init()方法。在一個servlet的生命周期中,init()方法只會被調用一次。通過在init()方法中緩存一些靜態(tài)的數據或完成一些只需要執(zhí)行一次的、耗時的操作,就可大大地提高系統(tǒng)性能。
例如,通過在init()方法中建立一個JDBC連接池是一個最佳例子,假設我們是用jdbc2.0的DataSource接口來取得數據庫連接,在通常的情況下,我們需要通過JNDI來取得具體的數據源。我們可以想象在一個具體的應用中,如果每次SQL請求都要執(zhí)行一次JNDI查詢的話,那系統(tǒng)性能將會急劇下降。解決方法是如下代碼,它通過緩存DataSource,使得下一次SQL調用時仍然可以繼續(xù)利用它
1.2.3.publicclassControllerServletextendsHttpServlet{privatejavax.sql.DataSourcetestDS=null;publicvoidinit(ServletConfigconfig)throwsServletExcep
tion{
4.super.init(config);
5.Contextctx=null;
6.try{ctx=newInitialContext();
7.testDS=(javax.sql.DataSource)ctx.lookup(“jdbc/testDS”);
8.}
9.catch(NamingExceptionne){
10.ne.printStackTrace();
11.}
12.catch(Exceptione){
13.e.printStackTrace();
14.}
15.}
16.publicjavax.sql.DataSourcegetTestDS(){
17.returntestDS;
18.}
19.......20.}
禁止Servlet和JSP自動重載(auto-reloading)
Servlet和JSP提供了一個實用的技術,即自動重載技術,它為開發(fā)人員提供了一個好的開發(fā)環(huán)境,當你改變servlet和JSP頁面后而不必重啟應用服務器。然而,這種技術在產品運行階段對系統(tǒng)的資源是一個極大的損耗,因為它會給JSP引擎的類裝載器(classloader)帶來極大的負擔。因此關閉自動重載功能對系統(tǒng)性能的提升是一個極大的幫助。
不要濫用HttpSession
在很多應用中,我們的程序需要保持客戶端的狀態(tài),以便頁面之間可以相互聯系。但不幸的是由于HTTP具有天生無狀態(tài)性,從而無法保存客戶端的狀態(tài)。因此一般的應用服務器都提供了session來保存客戶的狀態(tài)。在JSP應用服務器中,是通過HttpSession對像來實現session的功能的,但在方便的同時,它也給系統(tǒng)帶來了不小的負擔。因為每當你獲得或更新session時,系統(tǒng)者要對它進行費時的序列化操作。你可以通過對 HttpSession的以下幾種處理方式來提升系統(tǒng)的性能:
如果沒有必要,就應該關閉JSP頁面中對HttpSession的缺省設置:如果你沒有明確指定的話,每個JSP頁面都會缺省地創(chuàng)建一個HttpSession。如果你的JSP中不需要使用session的話,那可以通過如下的JSP頁面指示符來禁止它:
21.<%@ page session=“false”%>
不要在HttpSession中存放大的數據對像:如果你在HttpSession中存放大的數據對像的話,每當對它進行讀寫時,應用服務器都將對其進行序列化,從而增加了系統(tǒng)的額外負擔。你在HttpSession中存放的數據對像越大,那系統(tǒng)的性能就下降得越快。
當你不需要HttpSession時,盡快地釋放它:當你不再需要session時,你可以通過調用HttpSession.invalidate()方法來釋放它。
盡量將session的超時時間設得短一點:在JSP應用服務器中,有一個缺省的session的超時時間。當客戶在這個時間之后沒有進行任何操作的話,系統(tǒng)會將相關的session自動從內存中釋放。超時時間設得越大,系統(tǒng)的性能就會越低,因此最好的方法就是盡量使得它的值保持在一個較低的水平。
將頁面輸出進行壓縮
壓縮是解決數據冗余的一個好的方法,特別是在網絡帶寬不夠發(fā)達的今天。有的瀏覽器支持gzip(GNU zip)進行來對HTML文件進行壓縮,這種方法可以戲劇性地減少HTML文件的下載時間。因此,如果你將servlet或JSP頁面生成的HTML頁面進行壓縮的話,那用戶就會覺得頁面瀏覽速度會非??臁5恍业氖?,不是所有的瀏覽器都支持gzip壓縮,但你可以通過在你的程序中檢查客戶的瀏覽器是否支持它。下面就是關于這種方法實現的一個代碼片段:
22.publicvoiddoGet(HttpServletRequestrequest,HttpServlet
Responseresponse)
throwsIOException,ServletException{
23.OutputStreamout=null
24.Stringencoding=request.getHeader(“Accept-Encoding”);
25.if(encoding!=null&&encoding.indexOf(“gzip”)!=-1){
26.request.setHeader(“Content-Encoding”,“gzip”);
27.out=newGZIPOutputStream(request.getOutputStream());
28.}
29.elseif(encoding!=null&&encoding.indexOf(“compress”)!=
-1){
30.request.setHeader(“Content-Encoding”,“compress”);
31.32.33.34.35.36.37.out=newZIPOutputStream(request.getOutputStream());}else{out=request.getOutputStream();}......}
使用線程池
應用服務器缺省地為每個不同的客戶端請求創(chuàng)建一個線程進行處理,并為它們分派service()方法,當service()方法調用完成后,與之相應的線程也隨之撤消。由于創(chuàng)建和撤消線程會耗費一定的系統(tǒng)資源,這種缺省模式降低了系統(tǒng)的性能。但所幸的是我們可以通過創(chuàng)建一個線程池來改變這種狀況。另外,我們還要為這個線程池設置一個最小線程數和一個最大線程數。在應用服務器啟動時,它會創(chuàng)建數量等于最小線程數的一個線程池,當客戶有請求時,相應地從池從取出一個線程來進行處理,當處理完成后,再將線程重新放入到池中。如果池中的線程不夠地話,系統(tǒng)會自動地增加池中線程的數量,但總量不能超過最大線程數。通過使用線程池,當客戶端請求急劇增加時,系統(tǒng)的負載就會呈現的平滑的上升曲線,從而提高的系統(tǒng)的可伸縮性。
選擇正確的頁面包含機制
在JSP中有兩種方法可以用來包含另一個頁面
1、使用include指示符(< %@ includee file=”test.jsp” %>)。
2、使用jsp指示符(< jsp:includee
page=”test.jsp” flush=”true”/>)。在實際中我發(fā)現,如果使用第一種方法的話,可以使得系統(tǒng)性能更高。
正確地確定javabean的生命周期
Servlet和JSP一個強大的地方就是對javabean的支持。通過在JSP頁面中使用<jsp:useBean>標簽,可以將javabean直接插入到一個JSP頁面中。它的使用方法如下:
38.<
jsp:useBean id=“name” scope=“page|request|session|application”
class= “package.className” type=“typeName”>
39.</jsp:useBean>
其中scope屬性指出了這個bean的生命周期。缺省的生命周期為page。如果你沒有正確地選擇bean的生命周期的話,它將影響系統(tǒng)的性能。
舉例來說,如果你只想在一次請求中使用某個bean,但你卻將這個bean的生命周期設置成了session,那當這次請求結束后,這個bean將仍然保留在內存中,除非session超時或用戶關閉瀏覽器。這樣會耗費一定的內存,并無謂的增加了JVM垃圾收集器的工作量。因此為bean設置正確的生命周期,并在bean的使命結束后盡快地清理它們,會使用系統(tǒng)性能有一個提高。
需要注意:
1.在字符串連接操作中盡量不使用“+”操作符:在java編程中,我們常常使用“+”操作符來將幾個字符串連接起來,但你或許從來沒有想到過它居然會對系統(tǒng)性能造成影響吧?由于字符串是常量,因此JVM會產生一些臨時的對像。你使用的“+”越多,生成的臨時對像就越多,這樣也會給系統(tǒng)性能帶來一些影響。解決的方法是用StringBuffer對像來代替“+”操作符。
2.避免使用System.out.println()方法:由于System.out.println()是一種同步調用,即在調用它時,磁盤I/O操作必須等待它的完成,因此我們要盡量避免對它的調用。但我們在調試程序時它又是一個必不可少的方便工具,為了解決這個矛盾,我建議你最好使用Log4j工具,它既可以方便調試,而不會產生System.out.println()這樣的方法。
3.ServletOutputStream 與 PrintWriter的權衡:使用PrintWriter可能會帶來一些小的開銷,因為它將所有的原始輸出都轉換為字符流來輸出,因此如果使用它來作為頁面輸出的話,系統(tǒng)要負擔一個轉換過程。而使用ServletOutputStream作為頁面輸出的話就不存在一個問題,但它是以二進制進行輸出的。
第四篇:學習JSP和servlet程序設計心得體會
學習JSP程序設計和Servlet心得體會
JSP這門課是教我們怎么做網站的,學習了許多枯燥的語言知識,總算是可以自己做網站了 記得在第一節(jié)課上,我就跟學生們講了“為什么學JSP?”,“JSP學什么?”,“學JSP有什么用?”還有“如何學JSP?”從我對這些問題的講解中同學們確實體會到了學習JSP的重要性和如何去學。在課上還了解了這門課程我要講述的主要內容以及需要具備的相關知識。
學生們在JAVA上是最欠缺的,之前也只是跟著老師學,自己在課下并沒有下很多功夫。
在前階段的學習中都感覺很輕松,因為我講到的HTML學生已經在上個學期的差不多了,所以做一個靜態(tài)的頁面還是沒有多大問題,但是后來學到后面要用到JAVA做一些動態(tài)的網頁就感覺越來越吃力了,之前學過的很多JAVA知識也有很多都已經忘了。所以在第一次上課后完成任務時就用到了比較長的時間,最后才能勉強做到符合我的要求。還出現了很多小錯誤,有了第一次視頻教學的教訓,我在后面趕緊復習之前學習的JAVA知識,但是畢竟過了挺久了,有些東西需要重頭再教,而且我也是以做項目的形式來完成教學,項目里包括了JSP呀Servlet等技術,所以學生們大概花了一個多月才將這學期JSP和Servlet課程中所掌握的一些關于JAVA的東西搞清楚。后來也就順利的完成了我們要做的項目。
我想簡單的談談我在JSP程序設計這門課中都學到了什么,JSP的全稱是 Java Server Pages,它是一種動態(tài)網頁技術。我們需要配置的壞境有JDK,Tomcat,還要用到Dreamweaver。最開始我們學習了HTML這種文本標記語言,用HTML可以做一些靜態(tài)網站,看的出在學生第一次用HTML做出第一個網頁時的興奮,都覺得好神奇!后面我們學到做動態(tài)網站,其中就涉及到JSP內部對象及內部對象所對應的一些方法。再就是JSP與數據庫的聯系,怎么樣引用數據庫。通過以上所學到的知識我們可以基本上上做出一個比較實用的小網站,比如一個班級網站,在上面可以上傳下載一些學習資料,以及存儲班上同學的一些基本信息,給班上同學提供一個交流平臺等等。
那 在以后的學習中學生該如何學呢?從這一次JSP程序設計課程的學習中我總結了以后學習的方法。首先要把基礎打牢,不要只是注重技術開發(fā),對于一些基本概念也要掌握;其次要多一些專業(yè)方面的書,多了解我們專業(yè)動向;再者就是要多上機實踐,學到什么知識點要趕緊把它應用到實踐當中;最后就是要加強自己團隊協作的能力,爭取在以后的學習中能夠跟同學通過一些項目實戰(zhàn)提高自己團隊協作能力。
第五篇:showModalDialog兩個窗體之間傳值發(fā)布
Javascript showModalDialog兩個窗體之間傳值發(fā)布
前一篇文章Javascript怎么在兩個窗體之間傳值中講到了如何利用window.open()方法打開新窗體,并在兩個窗體之間傳值的方法。
Javascript 兩個窗體之間傳值實現代碼
javascript中還有一個函數window.showModalDialog也可以打開一個新窗體,不過他打開的是一個模態(tài)窗口,那么如何在父窗體和子窗體之間傳值呢?我們先看該函數的定義:vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures])
參數說明:
sURL--必選參數,類型:字符串。用來指定對話框要顯示的文檔的URL。
vArguments--可選參數,類型:變體。用來向對話框傳遞參數。傳遞的參數類型不限,包括數組等。對話框通過window.dialogArguments來取得傳遞進來的參數。
sFeatures--可選參數,類型:字符串。用來描述對話框的外觀等信息,可以使用以下的一個或幾個,用分號“;”隔開。
dialogHeight :對話框高度,不小于100px,IE4中dialogHeight 和 dialogWidth 默認的單位是em,而IE5中是px,為方便其見,在定義modal方式的對話框時,用px做單位。dialogWidth: 對話框寬度。
dialogLeft: 離屏幕左的距離。
dialogTop: 離屏幕上的距離。
center: {yes | no | 1 | 0 }:窗口是否居中,默認yes,但仍可以指定高度和寬度。
help: {yes | no | 1 | 0 }:是否顯示幫助按鈕,默認yes。
resizable: {yes | no | 1 | 0 } [IE5+]:是否可被改變大小。默認no。
status: {yes | no | 1 | 0 } [IE5+]:是否顯示狀態(tài)欄。默認為yes[ Modeless]或no[Modal]。scroll:{ yes | no | 1 | 0 | on | off }:指明對話框是否顯示滾動條。默認為yes。
如:“dialogWidth=200px;dialogHeight=100px”
因此我們可以通過window.dialogArguments參數來在兩個窗體之間傳值
如下面兩個頁面:FatherPage.htm:
復制代碼 代碼如下:
ChildPage.htm:
復制代碼 代碼如下:
上面只是傳遞簡單的字符串,我們還可以傳遞數組,如:FatherPage.htm:
XML-Code:
復制代碼 代碼如下:
ChildPage.htm:XML-Code:
同樣我們還可以傳遞對象,如:FatherPage.htm:
XML-Code:
復制代碼 代碼如下:
ChildPage.html:
XML-Code:
復制代碼 代碼如下:
以上都是從父窗體向子窗體傳值,那么如何從子窗體向父窗體傳值呢 ?其實通過window.returnValue就可以獲取子窗體的值,window.returnValue與window.dialogArguments一樣,可以是任意變量,包括字符串,數組,對象等。如:FatherPage.html:
XML-Code:
復制代碼 代碼如下:
ChildPage.html:
XML-Code:
復制代碼 代碼如下:
詳細出處參考:http:///article/20141.htm