athrunwang

          紀(jì)元
          數(shù)據(jù)加載中……

          使用Struts 2防止表單重復(fù)提交

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

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


          設(shè)置Struts 2的預(yù)防表單重復(fù)提交的功能 

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

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


          示例:使用Token攔截器預(yù)防表單重復(fù)提交

          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攔截器棧中,注意,需要將攔截器放在攔截器棧的第一位,這是因為判斷表單是否被重復(fù)提交的邏輯應(yīng)該在表單處理前。

          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秒鐘,讓我們有機(jī)會多次點擊提交按鈕,測試效果。

          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的防止表單重復(fù)提交功能,需要在form標(biāo)簽中使用token標(biāo)簽,他會產(chǎn)生一個唯一的標(biāo)識符,與其他參數(shù)一起提交到服務(wù)器,服務(wù)器會根據(jù)token標(biāo)簽所產(chǎn)生的標(biāo)識符判斷表單是否為重復(fù)提交的表單,這個功能是由Token攔截器完成的。

          error.jsp

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

          當(dāng)表單重復(fù)提交,Token攔截器會返回一個"invalid.token"結(jié)果,結(jié)果將頁面轉(zhuǎn)到這個頁面,提示用戶錯誤信息。

          output.jsp

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

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

          4. 測試

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

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

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

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

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

          處理表單重復(fù)提交的另一個攔截器是 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 閱讀(160) | 評論 (0)編輯 收藏
          Struts 2的調(diào)試與性能分析功能

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

          使用debug標(biāo)簽獲取調(diào)試信息

          debug標(biāo)簽的用途是顯示ValueStack棧和其他對象的內(nèi)容,它非常易用,只需要在需要調(diào)試的頁面插入如下語句:

          <s:debug></s:debug>

          示例:

          index.jsp

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

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

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

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


          使用Debugging攔截器獲取調(diào)試信息

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

            debug=xml參數(shù)將會導(dǎo)致產(chǎn)生一個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的默認(rèn)值為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"按鈕,查看結(jié)果:

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


          使用Profiling攔截器分析應(yīng)用程序的性能

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

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

          示例:

          修改上面例子的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"按鈕,查看結(jié)果:

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

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

          Struts 2模擬進(jìn)度條的原理

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

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

                "等待"結(jié)果的行為與"dispatcher"結(jié)果的行為很相似,但是要注意的是,"等待"結(jié)果對應(yīng)的視圖帶有如下的meta標(biāo)簽:

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

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

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


          execAndWait攔截器

          execAndWait攔截器 可以接收以下參數(shù):

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

          示例:使用默認(rèn)視圖與自定義視圖

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

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

          private int complete = 0;

          // 獲取進(jìn)度值
          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>

          最終結(jié)果頁面:

          <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模擬進(jìn)度條就完成了!

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

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

          HashMap,LinkedHashMap,TreeMap都屬于Map

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

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

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

          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 閱讀(170) | 評論 (0)編輯 收藏
          淺談Http之Get Post請求的區(qū)別

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

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

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

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

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


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

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

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

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

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


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

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

          在eclipse中, 

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

          posted @ 2011-11-16 12:58 AthrunWang 閱讀(378) | 評論 (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 閱讀(168) | 評論 (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 閱讀(451) | 評論 (0)編輯 收藏
          J2EE的核心API與組件

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

          JDBC(Java Database Connectivity)

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

          JNDI(Java Name and Directory Interface)

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

          EJB(Enterprise JavaBean)

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

          RMI(Remote Method Invoke)

            正如其名字所表示的那樣,RMI協(xié)議調(diào)用遠(yuǎn)程對象上的方法。它使用了序列化方式在客戶端和服務(wù)器端傳遞數(shù)據(jù)。RMI是一種被EJB使用的更底層的協(xié)議。

          Java IDL/CORBA

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

          JSP(Java Server Pages)

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

          Java Servlet

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

          XML(Extensible Markup Language)

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

          JMS(Java Message Service)

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

          JTA(Java Transaction Architecture)

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

          JavaMail

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

          JAF(JavaBeans Activation Framework)

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

          posted @ 2011-10-25 14:51 AthrunWang 閱讀(132) | 評論 (0)編輯 收藏
          僅列出標(biāo)題
          共8頁: 上一頁 1 2 3 4 5 6 7 8 下一頁 
          主站蜘蛛池模板: 霍山县| 长丰县| 玉环县| 淳化县| 丹棱县| 霍州市| 临汾市| 乐安县| 陆河县| 黔南| 辉南县| 于都县| 昌宁县| 沙湾县| 南皮县| 达拉特旗| 辉南县| 界首市| 凭祥市| 平舆县| 寿光市| 黄浦区| 车致| 涿鹿县| 朝阳区| 宁强县| 上思县| 汕头市| 闽清县| 泾川县| 双牌县| 呼和浩特市| 吉安市| 方山县| 酒泉市| 巴彦县| 连平县| 德格县| 民丰县| 大兴区| 浮山县|