<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    athrunwang

    紀元
    數據加載中……

    使用Struts 2防止表單重復提交

      用戶重復提交表單在某些場合將會造成非常嚴重的后果。例如,在使用信用卡進行在線支付的時候,如果服務器的響應速度太慢,用戶有可能會多次點擊提交按鈕,而這可能導致那張信用卡上的金額被消費了多次。因此,重復提交表單會對你的系統(tǒng)帶來邏輯影響,必須采取一些措施防止這類情況的發(fā)生。

      用戶重復提交同一個HTML表單的原因有: 一、快速多次點擊了提交按鈕;二、提交表單后按下瀏覽器的刷新按鈕。


    設置Struts 2的預防表單重復提交的功能 

          Struts 2已經內置了能夠防止用戶重復提交同一個HTML表單的功能。它的工作原理:讓服務器生成一個唯一標記,并在服務器和表單里各保存一份這個標記的副本。此后,在用戶提交表單的時候,表單里的標記將隨著其他請求參數一起發(fā)送到服務器,服務器將對他收到的標記和它留存的標記進行比較。如果兩者匹配,這次提交的表單被認為是有效的,服務器將對之做出必要的處理并重新設置一個新標記。隨后,提交相同的表單就會失敗,因為服務器上的標記已經重置。 

      Struts 2標簽中的token標簽,可以用來生成一個獨一無二的標記。這個標記必須嵌套在form標簽中使用,它會在表單里插入一個隱藏字段并把標記保存到HttpSession對象里。toke標簽必須與Token或Token Session攔截器配合使用,兩個攔截器都能對token標簽進行處理。Token攔截器遇到重復提交表單的情況,會返回一個"invalid.token"結果并加上一個動作級別的錯誤。Token Session攔截器擴展了Token攔截器并提供了一種更復雜的服務,它采取的做法與Token攔截器不同,它只是阻斷了后續(xù)的提交,這樣用戶不提交多少次,就好像只是提交了一次。 


    示例:使用Token攔截器預防表單重復提交

    1.  配置struts.xml文件,聲明動作

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
    >
    <struts>
    <package name="avoidPackage" extends="struts-default">
    <action name="avoid" class="struts2.action.AvoidAction">
    <interceptor-ref name="token"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>

    <result name="invalid.token">/error.jsp</result>
    <result name="input">/input.jsp</result>
    <result name="success">/output.jsp</result>
    </action>
    </package>
    </struts>

    此時,需要在動作的聲明中,為動作添加token攔截器,因為token攔截器不在defaultStack攔截器棧中,注意,需要將攔截器放在攔截器棧的第一位,這是因為判斷表單是否被重復提交的邏輯應該在表單處理前。

    2. 創(chuàng)建動作類

    public class AvoidAction extends ActionSupport {
    private static final long serialVersionUID = 2676453800249807631L;

    private String username;
    private Date birthday;

    public String getUsername() {
    return username;
    }
    public void setUsername(String username) {
    this.username = username;
    }
    public Date getBirthday() {
    return birthday;
    }
    public void setBirthday(Date birthday) {
    this.birthday = birthday;
    }

    @Override
    public String execute()
    {
    try {
    Thread.sleep(4000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }

    return SUCCESS;
    }

    }

    這個動作邏輯處理為掛起4秒鐘,讓我們有機會多次點擊提交按鈕,測試效果。

    3. 創(chuàng)建頁面:

    input.jsp

    <s:form action="avoid">
    <s:token></s:token>
    <s:textfield name="username" label="Enter your name"></s:textfield>
    <s:textfield name="birthday" label="Enter your birthday"></s:textfield>
    <s:submit value="submit"></s:submit>
    </s:form>

    要使用Struts 2的防止表單重復提交功能,需要在form標簽中使用token標簽,他會產生一個唯一的標識符,與其他參數一起提交到服務器,服務器會根據token標簽所產生的標識符判斷表單是否為重復提交的表單,這個功能是由Token攔截器完成的。

    error.jsp

    <body>
    do not duplicate submissions form!
    </body>

    當表單重復提交,Token攔截器會返回一個"invalid.token"結果,結果將頁面轉到這個頁面,提示用戶錯誤信息。

    output.jsp

    <body>
    Your Name : <s:property value="username"/>
    <br />
    Your Birthday : <s:property value="birthday"/>
    </body>

    若沒有重復提交表單,那么就顯示正確的頁面。

    4. 測試

    在瀏覽器中輸入:http://localhost:8081/AvoidDuplicateSubmissions/input.jsp,得到如下界面

    連續(xù)多次點擊"submit"按鈕,查看效果

    可以看到,token攔截器的設置生效了,他阻止了表單的重復提交,并給出了錯誤提示

    這次我們只點擊一次提交(請重新輸入URL,或后退到輸入頁面后刷新一下,這是因為token的標示在提交一次后已被修改,不刷新標示符是不可能與服務器存留的標示符一致的)

    可以看到,表單被正確的處理了。

    處理表單重復提交的另一個攔截器是 tokenSession,使用該攔截器與使用token攔截器并沒有什么差異只需要,引用該攔截器,其他與token攔截器完全一致

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
    >
    <struts>
    <package name="avoidPackage" extends="struts-default">
    <action name="avoid" class="struts2.action.AvoidAction">
    <interceptor-ref name="tokenSession"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>

    <result name="invalid.token">/error.jsp</result>
    <result name="input">/input.jsp</result>
    <result name="success">/output.jsp</result>
    </action>
    </package>
    </struts>

    posted @ 2011-11-18 10:43 AthrunWang 閱讀(158) | 評論 (0)編輯 收藏
    Struts 2的調試與性能分析功能

    Struts 2標簽庫里的debug標簽以及Struts 2提供的Debugging攔截器大大簡化了Web應用程序的調試工作,Profiling攔截器可以分析應用程序中的性能瓶頸。

    使用debug標簽獲取調試信息

    debug標簽的用途是顯示ValueStack棧和其他對象的內容,它非常易用,只需要在需要調試的頁面插入如下語句:

    <s:debug></s:debug>

    示例:

    index.jsp

    <body>
    <s:debug></s:debug>
    </body>

    在瀏覽器中輸入:http://localhost:8081/DebugAndProfiling/index.jsp,獲得如下頁面:

    點擊"[Debug]",會獲得如下界面

    可以看到獲取了各種棧對象和ContextMap里的對象。這些信息可以幫助我們快速排查Web應用程序里的潛在隱患。


    使用Debugging攔截器獲取調試信息

          Debugging攔截器是默認攔截器棧defaultStack的一員,若引用了默認攔截器棧,則不需要特意去引用。使用該攔截器可以使我們查看ValueStack和其他一些對象內容。觸發(fā)這個攔截器的方法是在用來觸發(fā)某個動作的URL地址欄里添加debug=xml或者debug=console參數。

      debug=xml參數將會導致產生一個XML文件,它包含ValueStack和其他一些對象的值:

    示例:

    input.jsp

    <body>
    <s:form action="debug.action?debug=xml">
    <s:textfield name="username" label="Enter your name"></s:textfield>
    <s:submit value="submit"></s:submit>
    </s:form>
    </body>

    struts.xml

    <struts>
    <constant name="struts.devMode" value="true"></constant>

    <package name="debugAndProfilingPackage" extends="struts-default">
    <action name="debug" class="struts2.action.DebugAction">
    <result name="success">/index.jsp</result>
    </action>
    </package>
    </struts>

    struts.devMode的默認值為false,需要將其修改為true,才可以使該功能生效。

    動作類:

    public class DebugAction extends ActionSupport {
    private static final long serialVersionUID = -1345567815879866335L;

    private String username;

    public String getUsername() {
    return username;
    }

    public void setUsername(String username) {
    this.username = username;
    }

    @Override
    public String execute()
    {
    return SUCCESS;
    }
    }

    index.jsp

    <body>
    <s:property value="username"/>,Welcome
    </body>

    在瀏覽器中輸入:http://localhost:8081/DebugAndProfiling/input.jsp,獲得如下頁面:

    點擊"submit"按鈕,查看結果:

    可以看到,ValueStack和其他對象的信息。debug=console的設置與xml一致,只是好像IE不支持console選項。


    使用Profiling攔截器分析應用程序的性能

          Struts 2自帶的性能分析功能可以幫助我們找出應用程序里的瓶頸。該功能是由com.opensymphony.xwork2.util.profiling.UtilTimerStack類提供的支持,讓Struts 2可以跟蹤記錄它的過濾器調度程序、每一個攔截器、每個動作和每個結果的執(zhí)行用時情況。Profiling攔截器可以幫助我們激活性能分析功能。

      激活Profiling攔截器與激活Debugging攔截器相似,也是在某個動作的URL地址里加上profiling=true或profiling=yes請求參數。還必須將struts.devMode屬性設置為true才能使用這個功能,否則設置不會生效。

    示例:

    修改上面例子的struts.xml文件

    <struts>
    <constant name="struts.devMode" value="true"></constant>

    <package name="debugAndProfilingPackage" extends="struts-default">
    <action name="debug" class="struts2.action.DebugAction">
    <interceptor-ref name="profiling"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>

    <result name="success">/index.jsp</result>
    </action>
    </package>
    </struts>

    因為profiling攔截器不屬于defaultStack攔截器棧,需要特別引用,還需要注意Profiling攔截器所處的的位置,決定了它分析性能的范圍。

    修改input.jsp

    <body>
    <s:form action="debug.action?profiling=true">
    <s:textfield name="username" label="Enter your name"></s:textfield>
    <s:submit value="submit"></s:submit>
    </s:form>
    </body>

    其他不用修改,在瀏覽器輸入: http://localhost:8081/DebugAndProfiling/input.jsp,獲得如下頁面:

    點擊"submit"按鈕,查看結果:

          該結果是在我的IDE(MyEclipse9.0)的控制臺頁面獲取的.可以看到我們設置的Profiling攔截器生效了,它打印出了每一個流程所花費的時間。每一行代表一個活動。每行最左邊的數字是截止到即將觸發(fā)這個活動時已經耗用的時間。

    posted @ 2011-11-18 10:42 AthrunWang 閱讀(804) | 評論 (0)編輯 收藏
    為Struts 2應用程序創(chuàng)建進度條(等待頁面)

    Struts 2模擬進度條的原理

          對于一些需要較長時間才能完成的任務,在Web開發(fā)中,會由HTTP協議會因為超時而斷開而面臨許多風險,這是在桌面開發(fā)不曾遇到的。Struts 2提供的execAndWait攔截器就是為了處理和應付這種情況而設計的。注意,該攔截器不在"defaultStack"中,所以必須在使用它的動作里聲明它,并且必須放在攔截器棧的最后一個。

          使用了該攔截器后,動作依然正常執(zhí)行,只是該攔截器會分配一個后臺線程處理動作的運行,并在動作完成之前把用戶帶到一個"等待"頁面。,該頁面每隔一段時間刷新一次,直到那個后臺線程執(zhí)行完畢為止。如果用戶隨后又觸發(fā)了同一個動作,但頂一個動作尚未執(zhí)行完畢,這個攔截器將繼續(xù)向用戶發(fā)送"等待"結果;如果他已經執(zhí)行完畢,用戶會看到該動作的最終結果。

          "等待"結果的行為與"dispatcher"結果的行為很相似,但是要注意的是,"等待"結果對應的視圖帶有如下的meta標簽:

    <meta http-equiv="refresh" content="5;url=/Struts2/default_progressbar.action"/>

    該標簽的作用就每隔多少秒就重新加載一次同樣的URL。這里"5"表示5秒,"url=/Struts2/default_progressbar.action"表示要加載的URL。

       Struts 2是一個靈活強大的框架,如果你不喜歡Struts 2提供的默認"等待頁面",你也可以自己設計自己的等待頁面,若在動作聲明中,沒有找到"等待"結果,將使用默認值。


    execAndWait攔截器

    execAndWait攔截器 可以接收以下參數:

    • threadPriority:分配給相關線程的優(yōu)先級,默認值為Thread.NORM_PRIORITY。
    • delay:向用戶發(fā)送"等待"結果前的毫秒數,默認值為0。如果你不想立刻發(fā)送"等待"結果,可以將該參數設置為一個值。例如,你想讓動作超過2秒還未完成時才發(fā)送"等待"結果,需要將其值設置為2000.
    • delaySleepInterval:每隔多少毫秒喚醒主線程(處理動作的后臺線程)去檢查后臺線程是否已經處理完成,默認值是100。這個值設為0時無效。

    示例:使用默認視圖與自定義視圖

    創(chuàng)建一個動作類,該動作類的工作為掛起30秒:

    public class ProgressbarAction extends ActionSupport
    {
    private static final long serialVersionUID = 7441785390598480063L;

    private int complete = 0;

    // 獲取進度值
    public int getComplete()
    {
    complete += 10;
    return complete;
    }

    @Override
    public String execute()
    {
    try
    {
    Thread.sleep(30000);
    }
    catch (InterruptedException e)
    {
    e.printStackTrace();
    }
    return SUCCESS;
    }
    }

    配置struts.xml文件:

    <package name="progressbar" extends="struts-default">
    <action name="default_progressbar" class="struts2.suxiaolei.progressbar.action.ProgressbarAction">
    <interceptor-ref name="defaultStack"></interceptor-ref>
    <interceptor-ref name="execAndWait">
    <param name="delay">1500</param>
    </interceptor-ref>
    <result name="success">/state_ok.jsp</result>
    </action>

    <action name="customer_progressbar" class="struts2.suxiaolei.progressbar.action.ProgressbarAction">
    <interceptor-ref name="defaultStack"></interceptor-ref>
    <interceptor-ref name="execAndWait">
    <param name="delay">1500</param>
    </interceptor-ref>
    <result name="wait">/customer_wait.jsp</result>
    <result name="success">/state_ok.jsp</result>
    </action>
    </package>

    測試頁面:

    <body>
    <s:a href="/Struts2/default_progressbar.action">default_view</s:a>
    <br />
    <s:a href="/Struts2/customer_progressbar.action">customer_view</s:a>
    </body>

    自定義等待頁面:

    <html>
    <head>
    <base href="<%=basePath%>">

    <title>My JSP 'customer_wait.jsp' starting page</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">

    <!-- 下面的meta元素才是重點,其他的沒什么影響,是IDE自帶的 -->
    <meta http-equiv="refresh" content="3;url=/Struts2/customer_progressbar.action">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

    </head>

    <body>
    <div>
    Please wait...(<s:property value="complete"/>)% complete
    </div>
    </body>
    </html>

    最終結果頁面:

    <body>
    OK!
    </body>

    在瀏覽器中輸入:http://localhost:8081/Struts2/test.jsp,獲得如下頁面

    首先點擊,"default_view"鏈接:


    查看它的源代碼:

    <html>
    <head>
    <meta http-equiv="refresh" content="5;url=/Struts2/default_progressbar.action"/>
    </head>
    <body>
    Please wait while we process your request...
    <p/>

    This page will reload automatically and display your request when it is completed.
    </body>
    </html>

    這次點擊"customer_view"鏈接:

    ...

    ...

    這是自定義界面,最后動作執(zhí)行完畢后,都會獲得最終頁面

    我們使用Struts 2模擬進度條就完成了!

    posted @ 2011-11-18 10:40 AthrunWang 閱讀(1026) | 評論 (0)編輯 收藏
    LinkedHashMap/HashMap(數?據?緩?存?準?備?)

    顧名思義LinkedHashMap是比HashMap多了一個鏈表的結構。與HashMap相比LinkedHashMap維護的是一個具有雙重鏈表的HashMap,LinkedHashMap支持2中排序一種是插入排序,一種是使用排序,最近使用的會移至尾部例如 M1 M2 M3 M4,使用M3后為 M1 M2 M4 M3了,LinkedHashMap輸出時其元素是有順序的,而HashMap輸出時是隨機的,如果Map映射比較復雜而又要求高效率的話,最好使用LinkedHashMap,但是多線程訪問的話可能會造成不同步,所以要用Collections.synchronizedMap來包裝一下,從而實現同步。其實現一般為: 
        Map<String String> map = Collections.synchronizedMap(new LinkedHashMap(<String String));

    HashMap,LinkedHashMap,TreeMap都屬于Map

    Map 主要用于存儲鍵(key)值(value)對,根據鍵得到值,因此鍵不允許鍵重復,但允許值重復。

    HashMap 是一個最常用的Map,它根據鍵的HashCode 值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為 Null;HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap;可能會導致數據的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力。

    LinkedHashMap LinkedHashMap也是一個HashMap,但是內部維持了一個雙向鏈表,可以保持順序

    TreeMap 不僅可以保持順序,而且可以用于排序

    HashMap例子:

        public static void main(String[] args) {
    Map<String, String> map = new HashMap<String, String>();
    map.put("a3", "aa");
    map.put("a2", "bb");
    map.put("b1", "cc");
    for (Iterator iterator = map.values().iterator(); iterator.hasNext();) {
    String name = (String) iterator.next();
    System.out.println(name);
    }
    }

    LinkedHashMap例子:

        public static void main(String[] args) {
    Map<String, String> map = new LinkedHashMap<String, String>();
    map.put("a3", "aa");
    map.put("a2", "bb");
    map.put("b1", "cc");
    for (Iterator iterator = map.values().iterator(); iterator.hasNext();) {
    String name = (String) iterator.next();
    System.out.println(name);
    }
    }

    TreeMap例子:

        public static void main(String[] args) {
    Map<String, String> map = new TreeMap<String, String>(new Comparator<Object>(){
    Collator collator = Collator.getInstance();
    public int compare(Object o1, Object o2) {
    CollationKey key1 = collator.getCollationKey(o1.toString());
    CollationKey key2 = collator.getCollationKey(o2.toString());
    return key1.compareTo(key2);
    //return collator.compare(o1, o2);
    }});
    map.put("a3", "aa");
    map.put("a2", "bb");
    map.put("b1", "cc");
    for (Iterator iterator = map.values().iterator(); iterator.hasNext();) {
    String name = (String) iterator.next();
    System.out.println(name);
    }
    }

    運行這三個例子,體會一下它們之間的區(qū)別。

    posted @ 2011-11-18 10:30 AthrunWang 閱讀(168) | 評論 (0)編輯 收藏
    淺談Http之Get Post請求的區(qū)別

    1. get是從服務器上獲取數據,post是向服務器傳送數據。 
    2.get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。post是通過HTTP 
    post機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。 
    3. 對于get方式,服務器端用Request.QueryString獲取變量的值,對于post方式,服務器端用Request.Form獲取提交的數據。 
    4. get傳送的數據量較小,不能大于2KB。post傳送的數據量較大,一般被默認為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。 
    5. get安全性非常低,post安全性較高。

    posted @ 2011-11-18 10:28 AthrunWang 閱讀(160) | 評論 (0)編輯 收藏
    [筆記]war,jar包是啥

    經常聽開發(fā)說war,jar,car,這些是個什么東東呢?

    .jar :
    java archive;
    包含:class、properties文件,是文件封裝的最小單元;
    部署文件:application-client.xml ;
    級別:小;

    .war :
    Web Archive;
    包含: Servlet、JSP頁面、JSP標記庫、JAR庫文件、HTML/XML文檔和其他公用資源文件,如圖片、音頻文件等;
    部署文件: web.xml;
    級別:中;
    war包生成:
    a.用eclipse等IDE,可以再項目上右擊選擇“導出”,即可;
    b.手工制作:執(zhí)行jar -cvf 將要生成的包名.war 要壓縮的目錄名
    war包其實就是經過zip壓縮的文件,用winrar壓縮成zip格式,修改擴展名為war即可。


    .ear :
    Enterprise Archive;
    包含:除了包含JAR、WAR以外,還包括EJB組件;
    部署文件:application.xml;
    級別:大;

    以最終客戶的角度來看,.jar文件就是一種封裝,他們不需要知道.jar文件中有多少個.class文件,每個文件中的功能與作用,同樣可以得到他們希望的結果。
    war包:是做好一個web應用后,通常是網站,打成包部署到容器中。
    jar包:通常是開發(fā)時要引用通用類,打成包便于存放管理。
    ear包:企業(yè)級應用,通常是EJB打成ear包。
    所有的包都是用jar打的,只不過目標文件的擴展名不一樣

    jar--封裝類
    war--封裝web站點
    ear--封裝ejb

    一個web組件開發(fā)者執(zhí)行以下的任務來傳遞一個包含web組件的WAR文件:
    | 編寫并編譯servlet源代碼
    | 編寫jsp、html文件
    | 指定web的開發(fā)描述符
    | 邦定.class,.jsp,.html和部署描述符到一個WAR文件。

    war包可以放在webapps或者work目錄下都可以,隨著tomcat的啟動,它可以自動被解壓.
    或者通過tomcat的管理頁面,也可以發(fā)布war包,發(fā)布實際上就是把war包復制到webapps目錄下. 


    最后關于war、jar包的打包方法,命令行方式和使用 jbuilder或者eclipse,點這里http://www.iteye.com/topic/254141

    posted @ 2011-11-18 10:05 AthrunWang 閱讀(7436) | 評論 (1)編輯 收藏
    使用eclipse統(tǒng)計項目代碼行數

    在eclipse中, 

    打開File Search對話框, 
    選中正則表達式,在搜索文本框輸入 \n 
    文件名稱輸入 *.java 
    在范圍里選中Enclosing projects 
    然后就可以統(tǒng)計出整個項目的代碼行數。 

    posted @ 2011-11-16 12:58 AthrunWang 閱讀(376) | 評論 (0)編輯 收藏
    applicationContext.xml

    <bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
    <list>
    <value>classpath:configuration.properties</value>
    </list>
    </property>
    </bean>
    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
    <value>${jndi}</value>
    </property>
    </bean>
    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
    </bean>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="get*" read-only="true" />
    <tx:method name="*" rollback-for="Exception" />
    </tx:attributes>
    </tx:advice>
    <aop:config>
    <aop:pointcut expression="execution(public * com.a.b.service.*.*(..))"
    id="myPointcut" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" />
    </aop:config>

    posted @ 2011-11-02 19:12 AthrunWang 閱讀(164) | 評論 (0)編輯 收藏
    spring 委派Servlet代理類

    import java.io.IOException;
    import javax.servlet.GenericServlet;
    import javax.servlet.Servlet;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import org.springframework.web.context.WebApplicationContext;
    import org.springframework.web.context.support.WebApplicationContextUtils;
    public class DelegatingServletProxy extends GenericServlet implements Servlet {
    private String targetBean;
    private Servlet proxy;
    public void init() throws ServletException {
    this.targetBean = getServletName();
    getServletBean();
    proxy.init(getServletConfig());
    }
    public void service(ServletRequest req, ServletResponse res)
    throws ServletException, IOException {
    proxy.service(req, res);
    }
    private void getServletBean() {
    WebApplicationContext wac = WebApplicationContextUtils
    .getRequiredWebApplicationContext(getServletContext());
    this.proxy = (Servlet) wac.getBean(targetBean);
    }
    }

    posted @ 2011-11-02 19:11 AthrunWang 閱讀(449) | 評論 (0)編輯 收藏
    J2EE的核心API與組件

     J2EE平臺由一整套服務(Services)、應用程序接口(APIs)和協議構成,它對開發(fā)基于Web的多層應用提供了功能支持,下面對J2EE中的13種技術規(guī)范進行簡單的描述(限于篇幅,這里只能進行簡單的描述):

    JDBC(Java Database Connectivity)

      JDBC API為訪問不同的數據庫提供了一種統(tǒng)一的途徑,象ODBC一樣,JDBC對開發(fā)者屏蔽了一些細節(jié)問題,另外,JDBC對數據庫的訪問也具有平臺無關性。

    JNDI(Java Name and Directory Interface)

      JNDI API被用于執(zhí)行名字和目錄服務。它提供了一致的模型來存取和操作企業(yè)級的資源如DNS和LDAP,本地文件系統(tǒng),或應用服務器中的對象。

    EJB(Enterprise JavaBean)

      J2EE技術之所以贏得媒體廣泛重視的原因之一就是EJB。它們提供了一個框架來開發(fā)和實施分布式商務邏輯,由此很顯著地簡化了具有可伸縮性和高度復雜的企業(yè)級應用的開發(fā)。EJB規(guī)范定義了EJB組件在何時如何與它們的容器進行交互作用。容器負責提供公用的服務,例如目錄服務、事務管理、安全性、資源緩沖池以及容錯性。但這里值得注意的是,EJB并不是實現J2EE的唯一途徑。正是由于J2EE的開放性,使得有的廠商能夠以一種和EJB平行的方式來達到同樣的目的。

    RMI(Remote Method Invoke)

      正如其名字所表示的那樣,RMI協議調用遠程對象上的方法。它使用了序列化方式在客戶端和服務器端傳遞數據。RMI是一種被EJB使用的更底層的協議。

    Java IDL/CORBA

      在Java IDL的支持下,開發(fā)人員可以將Java和CORBA集成在一起。他們可以創(chuàng)建Java對象并使之可在CORBA ORB中展開, 或者他們還可以創(chuàng)建Java類并作為和其它ORB一起展開的CORBA對象的客戶。后一種方法提供了另外一種途徑,通過它Java可以被用于將你的新的應用和舊的系統(tǒng)相集成。

    JSP(Java Server Pages)

      JSP頁面由HTML代碼和嵌入其中的Java代碼所組成。服務器在頁面被客戶端所請求以后對這些Java代碼進行處理,然后將生成的HTML頁面返回給客戶端的瀏覽器。

    Java Servlet

      Servlet是一種小型的Java程序,它擴展了Web服務器的功能。作為一種服務器端的應用,當被請求時開始執(zhí)行,這和CGI Perl腳本很相似。Servlet提供的功能大多與JSP類似,不過實現的方式不同。JSP通常是大多數HTML代碼中嵌入少量的Java代碼,而servlets全部由Java寫成并且生成HTML。

    XML(Extensible Markup Language)

      XML是一種可以用來定義其它標記語言的語言。它被用來在不同的商務過程中共享數據。
      XML的發(fā)展和Java是相互獨立的,但是,它和Java具有的相同目標正是平臺獨立性。通過將Java和XML的組合,您可以得到一個完美的具有平臺獨立性的解決方案。

    JMS(Java Message Service)

      JMS是用于和面向消息的中間件相互通信的應用程序接口(API)。它既支持點對點的域,有支持發(fā)布/訂閱(publish/subscribe)類型的域,并且提供對下列類型的支持:經認可的消息傳遞,事務型消息的傳遞,一致性消息和具有持久性的訂閱者支持。JMS還提供了另
      一種方式來對您的應用與舊的后臺系統(tǒng)相集成。

    JTA(Java Transaction Architecture)

      JTA定義了一種標準的API,應用系統(tǒng)由此可以訪問各種事務監(jiān)控。
      11. JTS(Java Transaction Service):
      JTS是CORBA OTS事務監(jiān)控的基本的實現。JTS規(guī)定了事務管理器的實現方式。該事務管理器是在高層支持Java Transaction API (JTA)規(guī)范,并且在較底層實現OMG OTS specification的Java映像。JTS事務管理器為應用服務器、資源管理器、獨立的應用以及通信資源管理器提供了事務服務。

    JavaMail

      JavaMail是用于存取郵件服務器的API,它提供了一套郵件服務器的抽象類。不僅支持SMTP服務器,也支持IMAP服務器。

    JAF(JavaBeans Activation Framework)

      JavaMail利用JAF來處理MIME編碼的郵件附件。MIME的字節(jié)流可以被轉換成Java對象,或者轉換自Java對象。大多數應用都可以不需要直接使用JAF。

    posted @ 2011-10-25 14:51 AthrunWang 閱讀(130) | 評論 (0)編輯 收藏
    僅列出標題
    共8頁: 上一頁 1 2 3 4 5 6 7 8 下一頁 
    主站蜘蛛池模板: 亚洲第一香蕉视频| 亚洲免费观看网站| 亚洲色偷偷综合亚洲AV伊人蜜桃| 久久久久亚洲AV成人网人人网站| 毛片免费视频在线观看| 免费国产污网站在线观看15| 无套内射无矿码免费看黄| 亚洲国产视频久久| 亚洲男女性高爱潮网站| 亚洲日韩精品无码一区二区三区| 国产大片51精品免费观看| 欧美在线看片A免费观看| 久别的草原电视剧免费观看| 丰满妇女做a级毛片免费观看| 国产人成亚洲第一网站在线播放| 亚洲国产综合第一精品小说| 亚洲国产精品无码一线岛国| 亚洲综合色区在线观看| 亚洲av手机在线观看| 成年女人男人免费视频播放 | 在线看片无码永久免费视频| 久久午夜伦鲁片免费无码| 99视频在线观看免费| jizz18免费视频| 丰满少妇作爱视频免费观看| 无遮挡国产高潮视频免费观看| 亚洲a∨国产av综合av下载| 亚洲AV无码专区亚洲AV桃| 亚洲性无码AV中文字幕| 亚洲看片无码在线视频| 亚洲娇小性xxxx| 亚洲一区中文字幕在线电影网| 亚洲成人高清在线观看| 亚洲三级在线视频| 亚洲va在线va天堂成人| 亚洲综合伊人制服丝袜美腿| 亚洲AV综合色区无码二区偷拍| 亚洲AV色吊丝无码| 亚洲综合久久精品无码色欲| 亚洲精品理论电影在线观看| 亚洲国产一区二区三区在线观看|