第一篇:servlet小結(jié)
Tomcat服務(wù)器 http工作原理:
http超文本傳輸協(xié)議
HTTP是一個(gè)客戶端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)(TCP)
http請(qǐng)求響應(yīng)步驟:
1客戶端鏈接到web服務(wù)器 2發(fā)送http請(qǐng)求
3服務(wù)器接收請(qǐng)求并返回http響應(yīng) 4釋放鏈接tcp 5客戶端瀏覽器解析html內(nèi)容 Web應(yīng)用程序 項(xiàng)目打包發(fā)布
1清緩存,重新生成.Class文件 2生成war包
3將war文件復(fù)制tomcat路徑下的webapps 文件下 4啟動(dòng)項(xiàng)目
5通過瀏覽器訪問
在eclipse中配置tomcat并發(fā)布項(xiàng)目
Windows-prefrence-servers-runtime envirment Add
tomcat 安裝目錄 Server 安裝 運(yùn)行
給servlet類 在Web.xml中配置servlet訪問路徑 Servlet生命周期
1在被訪問時(shí)進(jìn)行初始化 2請(qǐng)求到達(dá)時(shí)處理 3在應(yīng)用結(jié)束時(shí)注銷 Get與post請(qǐng)求的區(qū)別
1get請(qǐng)求不安全傳輸時(shí),數(shù)據(jù)存放在url中,post傳輸對(duì)用戶來說,是不可見的 2get請(qǐng)求傳輸數(shù)據(jù)較小,受限url長度的限制,post可以傳輸大量的數(shù)據(jù),Httpservletrequest的getparameter 方法 獲取地址欄參數(shù),或者表單字段值 Servletcontext的getinitparameter Context-param設(shè)置全局變量
使用注解方式設(shè)置servlet訪問路徑 Loadonstartup設(shè)置初始化 轉(zhuǎn)發(fā)和重定向 區(qū)別:
轉(zhuǎn)發(fā)在服務(wù)器端完成,重定向在客戶端完成 轉(zhuǎn)發(fā)速度快,重定向速度慢
轉(zhuǎn)發(fā)是同一次請(qǐng)求,重定向是兩次請(qǐng)求 轉(zhuǎn)發(fā)地址欄沒有變化,重定向地址欄有變化 轉(zhuǎn)發(fā)不可以訪問其他外部資源,重定向可以
請(qǐng)求轉(zhuǎn)發(fā)可以訪問web-inf保護(hù)目錄下的頁面,重定向不能訪問到 轉(zhuǎn)發(fā)可以攜帶參數(shù),重定向不能攜帶參數(shù)
Web-inf為保護(hù)目錄,保護(hù)目錄下的文件不能直接訪問,如果要訪問保護(hù)目錄下的文件,只能通過轉(zhuǎn)發(fā)的方式訪問,重定向不能訪問 Jsp表達(dá)式<%= 表達(dá)式%> Jsp腳本<%腳本%> Jsp聲明<%!%> Jsp注釋<%--%>
第二篇:servlet生命周期
Servlet生命周期
Servlet的生命周期是由servlet容器來控制的。Servlet周期分為三個(gè)階段:(一)初始化階段;(二)運(yùn)行階段;(三)銷毀階段。
分階段講解:
(一)servlet初始化階段,調(diào)用init()方法。
在下列時(shí)刻servlet容器載入servlet:
1、servlet容器啟動(dòng)時(shí)自動(dòng)載入某些servlet,實(shí)現(xiàn)它只需要在web.XML
文件中的
2、在servlet容器啟動(dòng)后,客戶首次向servlet發(fā)送請(qǐng)求。
3、Servlet類文件被更新后,重新載入servlet。
Servlet被載入后,servlet容器創(chuàng)建一個(gè)servlet實(shí)例并且調(diào)用servlet的init()方法進(jìn)行初始化。在servlet的整個(gè)生命周期內(nèi),init()方法只被調(diào)用一次。
(二)servlet運(yùn)行階段,調(diào)用service()方法。
對(duì)于用戶到達(dá)servlet的請(qǐng)求,servlet容器會(huì)創(chuàng)建特定于這個(gè)請(qǐng)求的servletrequest對(duì)象和servletresponse對(duì)象,然后調(diào)用servlet的service方法。Service方法從servletrequest對(duì)象獲得客戶請(qǐng)求信息,處理該請(qǐng)求,并通過servletresponse對(duì)象向客戶返回響應(yīng)信息。
Servlet接口和GenericServlet是不特定于任何協(xié)議的,而HttpServlet是特定于HTTP協(xié)議的類,所以HttpServlet中實(shí)現(xiàn)了service()方法,并將請(qǐng)求ServletRequest,ServletResponse強(qiáng)轉(zhuǎn)為HttpRequest和HttpResponse。
代碼的最后調(diào)用了HTTPServlet自己的service(request,response)方法,然后根據(jù)請(qǐng)求去調(diào)用對(duì)應(yīng)的doXXX方法,因?yàn)镠ttpServlet中的doXXX方法都是返回錯(cuò)誤信息。
(三)servlet銷毀(終止)階段,調(diào)用destroy()方法。
當(dāng)web應(yīng)用被終止,或servlet容器終止運(yùn)行,或servlet容器重新載入servlet新實(shí)例時(shí),servlet會(huì)先調(diào)用servlet的destroy()方法,在destroy()方法中可以釋放掉servlet所占用的內(nèi)存資源。
第三篇:Servlet和JSP經(jīng)驗(yàn)總結(jié)
Servlet和JSP經(jīng)驗(yàn)總結(jié)
這里介紹Servlet和JSP經(jīng)驗(yàn)總結(jié),包括在servlet的init()方法中緩存數(shù)據(jù)、禁止Servlet和JSP自動(dòng)重載、將頁面輸出進(jìn)行壓縮和正確地確定javabean的生命周期等七種實(shí)用的方法。
在servlet的init()方法中緩存數(shù)據(jù)
當(dāng)應(yīng)用服務(wù)器初始化Servlet和JSP實(shí)例之后,為客戶端請(qǐng)求提供服務(wù)之前,它會(huì)調(diào)用這個(gè)servlet的init()方法。在一個(gè)servlet的生命周期中,init()方法只會(huì)被調(diào)用一次。通過在init()方法中緩存一些靜態(tài)的數(shù)據(jù)或完成一些只需要執(zhí)行一次的、耗時(shí)的操作,就可大大地提高系統(tǒng)性能。
例如,通過在init()方法中建立一個(gè)JDBC連接池是一個(gè)最佳例子,假設(shè)我們是用jdbc2.0的DataSource接口來取得數(shù)據(jù)庫連接,在通常的情況下,我們需要通過JNDI來取得具體的數(shù)據(jù)源。我們可以想象在一個(gè)具體的應(yīng)用中,如果每次SQL請(qǐng)求都要執(zhí)行一次JNDI查詢的話,那系統(tǒng)性能將會(huì)急劇下降。解決方法是如下代碼,它通過緩存DataSource,使得下一次SQL調(diào)用時(shí)仍然可以繼續(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自動(dòng)重載(auto-reloading)
Servlet和JSP提供了一個(gè)實(shí)用的技術(shù),即自動(dòng)重載技術(shù),它為開發(fā)人員提供了一個(gè)好的開發(fā)環(huán)境,當(dāng)你改變servlet和JSP頁面后而不必重啟應(yīng)用服務(wù)器。然而,這種技術(shù)在產(chǎn)品運(yùn)行階段對(duì)系統(tǒng)的資源是一個(gè)極大的損耗,因?yàn)樗鼤?huì)給JSP引擎的類裝載器(classloader)帶來極大的負(fù)擔(dān)。因此關(guān)閉自動(dòng)重載功能對(duì)系統(tǒng)性能的提升是一個(gè)極大的幫助。
不要濫用HttpSession
在很多應(yīng)用中,我們的程序需要保持客戶端的狀態(tài),以便頁面之間可以相互聯(lián)系。但不幸的是由于HTTP具有天生無狀態(tài)性,從而無法保存客戶端的狀態(tài)。因此一般的應(yīng)用服務(wù)器都提供了session來保存客戶的狀態(tài)。在JSP應(yīng)用服務(wù)器中,是通過HttpSession對(duì)像來實(shí)現(xiàn)session的功能的,但在方便的同時(shí),它也給系統(tǒng)帶來了不小的負(fù)擔(dān)。因?yàn)槊慨?dāng)你獲得或更新session時(shí),系統(tǒng)者要對(duì)它進(jìn)行費(fèi)時(shí)的序列化操作。你可以通過對(duì) HttpSession的以下幾種處理方式來提升系統(tǒng)的性能:
如果沒有必要,就應(yīng)該關(guān)閉JSP頁面中對(duì)HttpSession的缺省設(shè)置:如果你沒有明確指定的話,每個(gè)JSP頁面都會(huì)缺省地創(chuàng)建一個(gè)HttpSession。如果你的JSP中不需要使用session的話,那可以通過如下的JSP頁面指示符來禁止它:
21.<%@ page session=“false”%>
不要在HttpSession中存放大的數(shù)據(jù)對(duì)像:如果你在HttpSession中存放大的數(shù)據(jù)對(duì)像的話,每當(dāng)對(duì)它進(jìn)行讀寫時(shí),應(yīng)用服務(wù)器都將對(duì)其進(jìn)行序列化,從而增加了系統(tǒng)的額外負(fù)擔(dān)。你在HttpSession中存放的數(shù)據(jù)對(duì)像越大,那系統(tǒng)的性能就下降得越快。
當(dāng)你不需要HttpSession時(shí),盡快地釋放它:當(dāng)你不再需要session時(shí),你可以通過調(diào)用HttpSession.invalidate()方法來釋放它。
盡量將session的超時(shí)時(shí)間設(shè)得短一點(diǎn):在JSP應(yīng)用服務(wù)器中,有一個(gè)缺省的session的超時(shí)時(shí)間。當(dāng)客戶在這個(gè)時(shí)間之后沒有進(jìn)行任何操作的話,系統(tǒng)會(huì)將相關(guān)的session自動(dòng)從內(nèi)存中釋放。超時(shí)時(shí)間設(shè)得越大,系統(tǒng)的性能就會(huì)越低,因此最好的方法就是盡量使得它的值保持在一個(gè)較低的水平。
將頁面輸出進(jìn)行壓縮
壓縮是解決數(shù)據(jù)冗余的一個(gè)好的方法,特別是在網(wǎng)絡(luò)帶寬不夠發(fā)達(dá)的今天。有的瀏覽器支持gzip(GNU zip)進(jìn)行來對(duì)HTML文件進(jìn)行壓縮,這種方法可以戲劇性地減少HTML文件的下載時(shí)間。因此,如果你將servlet或JSP頁面生成的HTML頁面進(jìn)行壓縮的話,那用戶就會(huì)覺得頁面瀏覽速度會(huì)非常快。但不幸的是,不是所有的瀏覽器都支持gzip壓縮,但你可以通過在你的程序中檢查客戶的瀏覽器是否支持它。下面就是關(guān)于這種方法實(shí)現(xiàn)的一個(gè)代碼片段:
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();}......}
使用線程池
應(yīng)用服務(wù)器缺省地為每個(gè)不同的客戶端請(qǐng)求創(chuàng)建一個(gè)線程進(jìn)行處理,并為它們分派service()方法,當(dāng)service()方法調(diào)用完成后,與之相應(yīng)的線程也隨之撤消。由于創(chuàng)建和撤消線程會(huì)耗費(fèi)一定的系統(tǒng)資源,這種缺省模式降低了系統(tǒng)的性能。但所幸的是我們可以通過創(chuàng)建一個(gè)線程池來改變這種狀況。另外,我們還要為這個(gè)線程池設(shè)置一個(gè)最小線程數(shù)和一個(gè)最大線程數(shù)。在應(yīng)用服務(wù)器啟動(dòng)時(shí),它會(huì)創(chuàng)建數(shù)量等于最小線程數(shù)的一個(gè)線程池,當(dāng)客戶有請(qǐng)求時(shí),相應(yīng)地從池從取出一個(gè)線程來進(jìn)行處理,當(dāng)處理完成后,再將線程重新放入到池中。如果池中的線程不夠地話,系統(tǒng)會(huì)自動(dòng)地增加池中線程的數(shù)量,但總量不能超過最大線程數(shù)。通過使用線程池,當(dāng)客戶端請(qǐng)求急劇增加時(shí),系統(tǒng)的負(fù)載就會(huì)呈現(xiàn)的平滑的上升曲線,從而提高的系統(tǒng)的可伸縮性。
選擇正確的頁面包含機(jī)制
在JSP中有兩種方法可以用來包含另一個(gè)頁面
1、使用include指示符(< %@ includee file=”test.jsp” %>)。
2、使用jsp指示符(< jsp:includee
page=”test.jsp” flush=”true”/>)。在實(shí)際中我發(fā)現(xiàn),如果使用第一種方法的話,可以使得系統(tǒng)性能更高。
正確地確定javabean的生命周期
Servlet和JSP一個(gè)強(qiáng)大的地方就是對(duì)javabean的支持。通過在JSP頁面中使用<jsp:useBean>標(biāo)簽,可以將javabean直接插入到一個(gè)JSP頁面中。它的使用方法如下:
38.<
jsp:useBean id=“name” scope=“page|request|session|application”
class= “package.className” type=“typeName”>
39.</jsp:useBean>
其中scope屬性指出了這個(gè)bean的生命周期。缺省的生命周期為page。如果你沒有正確地選擇bean的生命周期的話,它將影響系統(tǒng)的性能。
舉例來說,如果你只想在一次請(qǐng)求中使用某個(gè)bean,但你卻將這個(gè)bean的生命周期設(shè)置成了session,那當(dāng)這次請(qǐng)求結(jié)束后,這個(gè)bean將仍然保留在內(nèi)存中,除非session超時(shí)或用戶關(guān)閉瀏覽器。這樣會(huì)耗費(fèi)一定的內(nèi)存,并無謂的增加了JVM垃圾收集器的工作量。因此為bean設(shè)置正確的生命周期,并在bean的使命結(jié)束后盡快地清理它們,會(huì)使用系統(tǒng)性能有一個(gè)提高。
需要注意:
1.在字符串連接操作中盡量不使用“+”操作符:在java編程中,我們常常使用“+”操作符來將幾個(gè)字符串連接起來,但你或許從來沒有想到過它居然會(huì)對(duì)系統(tǒng)性能造成影響吧?由于字符串是常量,因此JVM會(huì)產(chǎn)生一些臨時(shí)的對(duì)像。你使用的“+”越多,生成的臨時(shí)對(duì)像就越多,這樣也會(huì)給系統(tǒng)性能帶來一些影響。解決的方法是用StringBuffer對(duì)像來代替“+”操作符。
2.避免使用System.out.println()方法:由于System.out.println()是一種同步調(diào)用,即在調(diào)用它時(shí),磁盤I/O操作必須等待它的完成,因此我們要盡量避免對(duì)它的調(diào)用。但我們?cè)谡{(diào)試程序時(shí)它又是一個(gè)必不可少的方便工具,為了解決這個(gè)矛盾,我建議你最好使用Log4j工具,它既可以方便調(diào)試,而不會(huì)產(chǎn)生System.out.println()這樣的方法。
3.ServletOutputStream 與 PrintWriter的權(quán)衡:使用PrintWriter可能會(huì)帶來一些小的開銷,因?yàn)樗鼘⑺械脑驾敵龆嫁D(zhuǎn)換為字符流來輸出,因此如果使用它來作為頁面輸出的話,系統(tǒng)要負(fù)擔(dān)一個(gè)轉(zhuǎn)換過程。而使用ServletOutputStream作為頁面輸出的話就不存在一個(gè)問題,但它是以二進(jìn)制進(jìn)行輸出的。
第四篇:配置Struts2后如何使用servlet
配置Struts2后如何使用servlet 1.問題的提出
如果web.xml中struts2和servlet的配置如下:
.substring(target.lastIndexOf(“/”)+ 1);
if(this.includes.contains(target)){
RequestDispatcher rdsp = request.getRequestDispatcher(target);
rdsp.forward(req,resp);
} else
chain.doFilter(req, resp);
}
@Override
public void init(FilterConfig config)throws ServletException {
this.includes.addAll(Arrays.asList(config.getInitParameter(“includeServlets”).split(“,”)));
}
}
2.在web.xml中做適當(dāng)配置,在struts2的配置前加上下面的代碼:
includeServlets
ValidateEmail
其中,
中為web.xml中配置的要過濾的servlet名,多個(gè)之間用“,”逗號(hào)隔開。
第五篇:學(xué)習(xí)JSP和servlet程序設(shè)計(jì)心得體會(huì)
學(xué)習(xí)JSP程序設(shè)計(jì)和Servlet心得體會(huì)
JSP這門課是教我們?cè)趺醋鼍W(wǎng)站的,學(xué)習(xí)了許多枯燥的語言知識(shí),總算是可以自己做網(wǎng)站了 記得在第一節(jié)課上,我就跟學(xué)生們講了“為什么學(xué)JSP?”,“JSP學(xué)什么?”,“學(xué)JSP有什么用?”還有“如何學(xué)JSP?”從我對(duì)這些問題的講解中同學(xué)們確實(shí)體會(huì)到了學(xué)習(xí)JSP的重要性和如何去學(xué)。在課上還了解了這門課程我要講述的主要內(nèi)容以及需要具備的相關(guān)知識(shí)。
學(xué)生們?cè)贘AVA上是最欠缺的,之前也只是跟著老師學(xué),自己在課下并沒有下很多功夫。
在前階段的學(xué)習(xí)中都感覺很輕松,因?yàn)槲抑v到的HTML學(xué)生已經(jīng)在上個(gè)學(xué)期的差不多了,所以做一個(gè)靜態(tài)的頁面還是沒有多大問題,但是后來學(xué)到后面要用到JAVA做一些動(dòng)態(tài)的網(wǎng)頁就感覺越來越吃力了,之前學(xué)過的很多JAVA知識(shí)也有很多都已經(jīng)忘了。所以在第一次上課后完成任務(wù)時(shí)就用到了比較長的時(shí)間,最后才能勉強(qiáng)做到符合我的要求。還出現(xiàn)了很多小錯(cuò)誤,有了第一次視頻教學(xué)的教訓(xùn),我在后面趕緊復(fù)習(xí)之前學(xué)習(xí)的JAVA知識(shí),但是畢竟過了挺久了,有些東西需要重頭再教,而且我也是以做項(xiàng)目的形式來完成教學(xué),項(xiàng)目里包括了JSP呀Servlet等技術(shù),所以學(xué)生們大概花了一個(gè)多月才將這學(xué)期JSP和Servlet課程中所掌握的一些關(guān)于JAVA的東西搞清楚。后來也就順利的完成了我們要做的項(xiàng)目。
我想簡單的談?wù)勎以贘SP程序設(shè)計(jì)這門課中都學(xué)到了什么,JSP的全稱是 Java Server Pages,它是一種動(dòng)態(tài)網(wǎng)頁技術(shù)。我們需要配置的壞境有JDK,Tomcat,還要用到Dreamweaver。最開始我們學(xué)習(xí)了HTML這種文本標(biāo)記語言,用HTML可以做一些靜態(tài)網(wǎng)站,看的出在學(xué)生第一次用HTML做出第一個(gè)網(wǎng)頁時(shí)的興奮,都覺得好神奇!后面我們學(xué)到做動(dòng)態(tài)網(wǎng)站,其中就涉及到JSP內(nèi)部對(duì)象及內(nèi)部對(duì)象所對(duì)應(yīng)的一些方法。再就是JSP與數(shù)據(jù)庫的聯(lián)系,怎么樣引用數(shù)據(jù)庫。通過以上所學(xué)到的知識(shí)我們可以基本上上做出一個(gè)比較實(shí)用的小網(wǎng)站,比如一個(gè)班級(jí)網(wǎng)站,在上面可以上傳下載一些學(xué)習(xí)資料,以及存儲(chǔ)班上同學(xué)的一些基本信息,給班上同學(xué)提供一個(gè)交流平臺(tái)等等。
那 在以后的學(xué)習(xí)中學(xué)生該如何學(xué)呢?從這一次JSP程序設(shè)計(jì)課程的學(xué)習(xí)中我總結(jié)了以后學(xué)習(xí)的方法。首先要把基礎(chǔ)打牢,不要只是注重技術(shù)開發(fā),對(duì)于一些基本概念也要掌握;其次要多一些專業(yè)方面的書,多了解我們專業(yè)動(dòng)向;再者就是要多上機(jī)實(shí)踐,學(xué)到什么知識(shí)點(diǎn)要趕緊把它應(yīng)用到實(shí)踐當(dāng)中;最后就是要加強(qiáng)自己團(tuán)隊(duì)協(xié)作的能力,爭取在以后的學(xué)習(xí)中能夠跟同學(xué)通過一些項(xiàng)目實(shí)戰(zhàn)提高自己團(tuán)隊(duì)協(xié)作能力。