日志一JSP2.0與JSP1.2比較JSP2.0是對JSP1.2的升級,新增功能:1.ExpressionLanguage2.新增SimpleTag和TagFile3.web.xml新增" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

JSP、Servlet、Tomcat、JDK、J2EE版本比較

系統 2369 0
<!--==S 模塊標題-->

日志

<!--==E 模塊標題--><!--==S ??騼热?->
<!--S 日志正文模塊-->
<!--S 日志頂部操作-->
?
<!--==S 投票--><!--==E 投票--><!--S 文章(這部分加style只是為了看效果,基本上表現都受編輯器設置控制)-->
一 JSP2.0與JSP1.2比較
JSP 2.0是對JSP 1.2的升級,新增功能:
1. Expression Language
2. 新增Simple Tag和Tag File
3.web.xml新增<jsp:config>元素
特別說明web.xml.
web.xml新增<jsp:config>元素

<jsp-config> 元素主要用來設定JSP相關配置,<jsp-config> 包括<taglib>和<jsp-property-group>
子元素。

(1)其中<taglib>以前的Jsp1.2中就有的,taglib主要作用是作為頁面taglib標簽中的uri和tld文件的一個映射關系
(2)其中<jsp-property-group>是JSP2.0種新增的元素。
<jsp-property-group> 主要包括8個子元素,它們分別是:

<jsp-property-group>
<description>
設定的說明
</description>

<display-name>設定名稱</display-name>
<url-pattern>設定值所影響的范圍</url-pattern>
<el-ignored>若為true則不支持EL語法</el-ignored>
<page-encoding>ISO-8859-1</page-encoding>
<scripting-invalid> 若為true則不支持<% scripting%> 語法</scripting-invalid>
<include-prelude>設置JSP網頁的抬頭,擴展名為.jspf </include-prelude>
<include-coda>設置JSP網頁的結尾,擴展名為.jspf</include-coda>
</jsp-property-group>
例如: 其中抬頭程序:
prelude.jspf
<br>
<center>
文本內容
</center>
<hr>

結尾程序:
coda.jspf
<br>
<center>
文本內容
</center>
<hr>

二、Servlet個版本比較
servlet 2.3 新增功能:
2000年10月份出來
Servlet API 2.3中最重大的改變是增加了filters


servlet 2.4 新增功能:
2003年11月份出來
1、web.xml DTD改用了XML Schema;

Servlet 2.3之前的版本使用DTD作為部署描述文件的定義,其web.xml的格式為如下所示:
<?xml version="1.0" encoding="IS0-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//sunMicrosystems,Inc.//DTD WebApplication 2.3f//EN"
"
http://java.sun.com/j2ee/dtds/web-app_2.3.dtd ">
<web-app>
.......
</web-app>


Servlet 2.4版首次使用XML Schema定義作為部署描述文件,這樣Web容器更容易校驗web.xml語法。同時XML Schema提供了更好的擴充性,其web.xml中的格式如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" http://java.sun.com/xml/ns/j2ee"> http://java.sun.com/xml/ns/j2ee "
xmlns:http://www.workflow.com/"> http://www.workflow.com "
xmins:http://www.w3.org/2001/xmlschema-instance"> http://www.w3.org/2001/XMLSchema-instance "
xsi:schemaLhttp://java.sun.com/xml/ns/j2ee"> http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd ">
.........
</web-app>

注意: 改為Schema后主要加強了兩項功能:
(1) 元素不依照順序設定
(2) 更強大的驗證機制
主要體現在:
a.檢查元素的值是否為合法的值
b.檢查元素的值是否為合法的文字字符或者數字字符
c.檢查Servlet,Filter,EJB-ref等等元素的名稱是否唯一
2.新增Filter四種設定:REQUEST、FORWARD、INCLUDE和ERROR。
3.新增Request Listener、Event和Request Attribute Listener、Enent。
4.取消SingleThreadModel接口。當Servlet實現SingleThreadModel接口時,它能確保同時間內,只能有一個thread執行此Servlet。
5.<welcome-file-list>可以為Servlet。
6.ServletRequest接口新增一些方法。
public String getLocalName()
public String getLocalAddr()
public int getLocalPort()
public int getRemotePort()


Servlet 2.5的新特征
2005年9月發布Servlet 2.5
Servlet2.5一些變化的介紹:
1) 基于最新的J2SE 5.0開發的。
2) 支持annotations 。
3) web.xml中的幾處配置更加方便。
4) 去除了少數的限制。
5) 優化了一些實例


servlet的各個版本對監聽器的變化有:
(1)servlet2.2和jsp1.1
新增Listener:HttpSessionBindingListener
新增Event: HttpSessionBindingEvent
(2)servlet2.3和jsp1.2
新增Listener:ServletContextListener,ServletContextAttributeListener
,HttpSessionListener,HttpSessionActivationListener,HttpSessionAttributeListener
新增Event: ServletContextEvent,ServletContextAttributeEvent,HttpSessionEvent
(3)servlet2.4和jsp2.0
新增Listener:ServletRequestListener,ServletRequestAttribureListener
新增Event: ServletRequestEvent,ServletRequestAttributeEvent
三、J2EE規范版本比較
1.J2EE的發展

1997年Servlet技術的產生以及緊接著JSP的產生,為Java對抗PHP,ASP等等服務器端語言帶來了籌碼。1998年,Sun發布了EJB1.0標準,至此J2EE平臺的三個核心技術都已經出現。于是,1999年,Sun正式發布了J2EE的第一個版本。并與1999年底發布了J2EE1.2,在2001年發布了J2EE1.3,2003年發布了J2EE1.4。
2.J2EE1.3
J2EE1.3的架構,其中主要包含了Applet容器,Application Client容器,Web容器和EJB容器,并且包含了Web Component,EJB Component,Application Client Component,以JMS,JAAS,JAXP,JDBC,JAF,JavaMail,JTA等等技術做為基礎。

1.3中引入了幾個值得注意的功能:Java消息服務(定義了JMS的一組API),J2EE連接器技術(定義了擴展J2EE服務到非J2EE應用程序的標準),XML解析器的一組Java API,Servlet2.3,JSP1.2也都進行了性能擴展與優化,全新的CMP組件模型和MDB(消息Bean)。

3.J2EE1.4
J2EE1.4大體上的框架和J2EE1.3是一致的,1.4增加了對Web服務的支持,主要是Web Service,JAX-RPC,SAAJ,JAXR,還對EJB的消息傳遞機制進行了完善(EJB2.1),部署與管理工具的增強(JMX),以及新版本的Servlet2.4和JSP2.0使得Web應用更加容易。
四、Tomcat版本比較
Tomcat 3.x
servlet2.2和jsp1.1標準
Tomcat 4.x
Servlet 2.3 和 JSP 1.2 版本
Tomcat 5.x
Servlet 2.4或2.5 和 JSP 2.0 版本

五、JDK版本比較
已發行的版本:
版本號 名稱 中文名 發布日期
JDK 1.1.4 Sparkler 寶石 1997-09-12
JDK 1.1.5 Pumpkin 南瓜 1997-12-13
JDK 1.1.6 Abigail 阿比蓋爾--女子名 1998-04-24
JDK 1.1.7 Brutus 布魯圖--古羅馬政治家和將軍 1998-09-28
JDK 1.1.8 Chelsea 切爾西--城市名 1999-04-08
J2SE 1.2 Playground 運動場 1998-12-04
J2SE 1.2.1 none 無 1999-03-30
J2SE 1.2.2 Cricket 蟋蟀 1999-07-08
J2SE 1.3 Kestrel 美洲紅隼 2000-05-08
J2SE 1.3.1 Ladybird 瓢蟲 2001-05-17
J2SE 1.4.0 Merlin 灰背隼 2002-02-13
J2SE 1.4.1 grasshopper 蚱蜢 2002-09-16
J2SE 1.4.2 Mantis 螳螂 2003-06-26
將發行的版本:
J2SE 5.0 (1.5.0) Tiger 老虎 已發布了Beta版本
J2SE 5.1 (1.5.1) Dragonfly 蜻蜓 未發布
J2SE 6.0 (1.6.0) Mustang 野馬 未發布
<!--v:3.2-->
?
?
?
Servlet/JSP技術和ASP、PHP等相比,由于其多線程運行而具有很高的執行效率。由于Servlet/JSP默認是以多線程模式執行的,所以,在編寫代碼時需要非常細致地考慮多線程的安全性問題。然而,很多人編寫Servlet/JSP程序時并沒有注意到多線程安全性的問題,這往往造成編寫的程序在少量用戶訪問時沒有任何問題,而在并發用戶上升到一定值時,就會經常出現一些莫明其妙的問題。

  Servlet的多線程機制

Servlet體系結構是建立在Java多線程機制之上的,它的生命周期是由Web容器負責的。當客戶端第一次請求某個Servlet 時,Servlet容器將會根據web.xml配置文件實例化這個Servlet類。當有新的客戶端請求該Servlet時,一般不會再實例化該 Servlet類,也就是有多個線程在使用這個實例。Servlet容器會自動使用線程池等技術來支持系統的運行,如圖1所示。

  圖1 Servlet線程池

  這樣,當兩個或多個線程同時訪問同一個Servlet時,可能會發生多個線程同時訪問同一資源的情況,數據可能會變得不一致。所以在用Servlet構建的Web應用時如果不注意線程安全的問題,會使所寫的Servlet程序有難以發現的錯誤。

  Servlet的線程安全問題

  Servlet的線程安全問題主要是由于實例變量使用不當而引起的,這里以一個現實的例子來說明。

Import javax.servlet. *;
Import javax.servlet.http. *;
Import java.io. *;
Public class Concurrent Test extends HttpServlet {PrintWriter output;
Public void service (HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {String username;
Response.setContentType ("text/html; charset=gb2312");
Username = request.getParameter ("username");
Output = response.getWriter ();
Try {Thread. sleep (5000); //為了突出并發問題,在這設置一個延時
} Catch (Interrupted Exception e){}
output.println("用戶名:"+Username+"<BR>");
}
}

該Servlet中定義了一個實例變量output,在service方法將其賦值為用戶的輸出。當一個用戶訪問該Servlet時,程序會正常的運行,但當多個用戶并發訪問時,就可能會出現其它用戶的信息顯示在另外一些用戶的瀏覽器上的問題。這是一個嚴重的問題。為了突出并發問題,便于測試、觀察,我們在回顯用戶信息時執行了一個延時的操作。假設已在web.xml配置文件中注冊了該Servlet,現有兩個用戶a和b同時訪問該Servlet(可以啟動兩個IE瀏覽器,或者在兩臺機器上同時訪問),即同時在瀏覽器中輸入:

  a: http://localhost: 8080/servlet/ConcurrentTest? Username=a

  b: http://localhost: 8080/servlet/ConcurrentTest? Username=b

  如果用戶b比用戶a回車的時間稍慢一點,將得到如圖2所示的輸出:

  圖2 a用戶和b用戶的瀏覽器輸出

從圖2中可以看到,Web服務器啟動了兩個線程分別處理來自用戶a和用戶b的請求,但是在用戶a的瀏覽器上卻得到一個空白的屏幕,用戶a的信息顯示在用戶b的瀏覽器上。該Servlet存在線程不安全問題。下面我們就從分析該實例的內存模型入手,觀察不同時刻實例變量output的值來分析使該 Servlet線程不安全的原因。

  Java的內存模型JMM(Java Memory Model)JMM主要是為了規定了線程和內存之間的一些關系。根據JMM的設計,系統存在一個主內存(Main Memory),Java中所有實例變量都儲存在主存中,對于所有線程都是共享的。每條線程都有自己的工作內存(Working Memory),工作內存由緩存和堆棧兩部分組成,緩存中保存的是主存中變量的拷貝,緩存可能并不總和主存同步,也就是緩存中變量的修改可能沒有立刻寫到主存中;堆棧中保存的是線程的局部變量,線程之間無法相互直接訪問堆棧中的變量。根據JMM,我們可以將論文中所討論的Servlet實例的內存模型抽象為圖3所示的模型。

  圖3 Servlet實例的JMM模型

  下面根據圖3所示的內存模型,來分析當用戶a和b的線程(簡稱為a線程、b線程)并發執行時,Servlet實例中所涉及變量的變化情況及線程的執行情況,如圖4所示。

調度時刻 a線程 b線程
T1 訪問Servlet頁面 ?
T2 ? 訪問Servlet頁面
T3 output=a的輸出username=a休眠5000毫秒,讓出CPU ?
T4 ? output=b的輸出(寫回主存)username=b休眠5000毫秒,讓出CPU
T5 在用戶b的瀏覽器上輸出a線程的username的值,a線程終止。
T6 ? 在用戶b的瀏覽器上輸出b線程的username的值,b線程終止。

  圖4 Servlet實例的線程調度情況

從圖4中可以清楚的看到,由于b線程對實例變量output的修改覆蓋了a線程對實例變量output的修改,從而導致了用戶a的信息顯示在了用戶b的瀏覽器上。如果在a線程執行輸出語句時,b線程對output的修改還沒有刷新到主存,那么將不會出現圖2所示的輸出結果,因此這只是一種偶然現象,但這更增加了程序潛在的危險性。

  設計線程安全的Servlet

  通過上面的分析,我們知道了實例變量不正確的使用是造成Servlet線程不安全的主要原因。下面針對該問題給出了三種解決方案并對方案的選取給出了一些參考性的建議。

  1、實現 SingleThreadModel 接口

該接口指定了系統如何處理對同一個Servlet的調用。如果一個Servlet被這個接口指定,那么在這個Servlet中的service方法將不會有兩個線程被同時執行,當然也就不存在線程安全的問題。這種方法只要將前面的Concurrent Test類的類頭定義更改為:

Public class Concurrent Test extends HttpServlet implements SingleThreadModel {
…………
}

  2、同步對共享數據的操作

  使用synchronized 關鍵字能保證一次只有一個線程可以訪問被保護的區段,在本論文中的Servlet可以通過同步塊操作來保證線程的安全。同步后的代碼如下:

…………
Public class Concurrent Test extends HttpServlet { …………
Username = request.getParameter ("username");
Synchronized (this){
Output = response.getWriter ();
Try {
Thread. Sleep (5000);
} Catch (Interrupted Exception e){}
output.println("用戶名:"+Username+"<BR>");
}
}
}

  3、避免使用實例變量

  本實例中的線程安全問題是由實例變量造成的,只要在Servlet里面的任何方法里面都不使用實例變量,那么該Servlet就是線程安全的。

  修正上面的Servlet代碼,將實例變量改為局部變量實現同樣的功能,代碼如下:

……
Public class Concurrent Test extends HttpServlet {public void service (HttpServletRequest request, HttpServletResponse
Response) throws ServletException, IOException {
Print Writer output;
String username;
Response.setContentType ("text/html; charset=gb2312");
……
}
}

對上面的三種方法進行測試,可以表明用它們都能設計出線程安全的Servlet程序。但是,如果一個Servlet實現了 SingleThreadModel接口,Servlet引擎將為每個新的請求創建一個單獨的Servlet實例,這將引起大量的系統開銷。 SingleThreadModel在Servlet2.4中已不再提倡使用;同樣如果在程序中使用同步來保護要使用的共享的數據,也會使系統的性能大大下降。這是因為被同步的代碼塊在同一時刻只能有一個線程執行它,使得其同時處理客戶請求的吞吐量降低,而且很多客戶處于阻塞狀態。另外為保證主存內容和線程的工作內存中的數據的一致性,要頻繁地刷新緩存,這也會大大地影響系統的性能。所以在實際的開發中也應避免或最小化 Servlet 中的同步代碼;在Serlet中避免使用實例變量是保證Servlet線程安全的最佳選擇。從Java 內存模型也可以知道,方法中的臨時變量是在棧上分配空間,而且每個線程都有自己私有的棧空間,所以它們不會影響線程的安全。

  小結

Servlet的線程安全問題只有在大量的并發訪問時才會顯現出來,并且很難發現,因此在編寫Servlet程序時要特別注意。線程安全問題主要是由實例變量造成的,因此在Servlet中應避免使用實例變量。如果應用程序設計無法避免使用實例變量,那么使用同步來保護要使用的實例變量,但為保證系統的最佳性能,應該同步可用性最小的代碼路徑。

?

?
?
?

JSP、Servlet、Tomcat、JDK、J2EE版本比較


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产成人久久蜜一区二区 | 日韩不卡 | www神马我不卡影院免费观看 | 手机看片欧美 | 五月天天色 | 精品一区久久 | 在线观看日本免费不卡 | 一级片按摩| 韩国 欧美 日产 国产精品 | 51国产午夜精品免费视频 | 国产免费一级精品视频 | 在线看片a| 激情婷婷综合 | 免费爱爱网站 | 男人天堂日韩 | 91av爱爱| 九九re6精品视频在线观看 | 国产精品v一区二区三区 | 日本黄色一级毛片 | 亚洲一级毛片免费观看 | 久久国产精品亚洲va麻豆 | 久9久9精品视频在线观看 | 精品福利一区二区三区免费视频 | 日本精品视频一区二区三区 | 免费羞羞网站 | 国产www在线观看 | 99精品一区二区三区 | 国产高清免费午夜在线视频 | 色五月天天 | 国产玖玖在线 | 欧美成一级 | 99热网址| 久久精品亚洲日本波多野结衣 | 99精品免费久久久久久久久日本 | 中文字幕久精品免费视频蜜桃视频 | 爱爱一级视频 | 天天鲁天天爱天天鲁天天 | 免费一级毛片在线播放视频 | 久久精品国内偷自一区 | 日韩欧美毛片免费观看视频 | 国产在线精品香蕉综合网一区 |