posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          1. tomcat的manager中可以reload一個servlet,但是貌似這樣容易導致死機,還是每次需要重載的時候重啟tomcat比較安全。

          posted @ 2007-05-13 20:00 ZelluX 閱讀(149) | 評論 (0)編輯 收藏

          1. Filter 簡介
          這方面的內容以前看的幾本書里都找不到,想到了Sun J2EE的Tutorial,果然里面有比較詳細的解釋。
          Filter是一個傳輸請求或者響應的報頭和內容的對象,通常的作用是:
          a) 根據不同情況處理請求。
          b) 阻止請求-響應的過遠傳送。(Block the request-and-response pair from passing any further.)
          c) 通過自定義新的請求版本,修改請求報頭和數據。
          d) 通過自定義新的響應版本,修改響應報頭和數據。
          e) 和外部資源交互。

          2. Filter 編程
          filtering API由javax.servlet包中的Filter, FilterChain和FilterConfig接口定義。
          其中最重要的方法是doFilter。它可以用來:
          a) 檢查請求報頭。
          b) 自定義請求對象。
          c) 自定義響應對象。
          d) 調用過濾鏈(filter chain)中的下一個實體(entity)。如果當前過濾器已經是鏈中最后一個過濾器了,下一個實體就是鏈尾的資源;否則它就是在WAR中設置的下一個過濾器。當然也可以在此時通過不調用下一個實體來中斷請求、
          e) 在響應報頭調用下一個過濾器后檢查。
          f) 拋出反應處理錯誤的異常。

          3. 一個 Duke's Bookstore 的例子
          HitCounterFilter在servlet被訪問時計數。
          public final class HitCounterFilter implements Filter {
            private FilterConfig filterConfig = null;

            public void init(FilterConfig filterConfig)
              throws ServletException {
              this.filterConfig = filterConfig;
            }
            public void destroy() {
              this.filterConfig = null;
            }
            public void doFilter(ServletRequest request,
              ServletResponse response, FilterChain chain)
              throws IOException, ServletException {
              if (filterConfig == null)
                return;
              StringWriter sw = new StringWriter();
              PrintWriter writer = new PrintWriter(sw);
              Counter counter = (Counter)filterConfig.
                getServletContext().
                getAttribute("hitCounter");
              writer.println();
              writer.println("===============");
              writer.println("The number of hits is: " +
                counter.incCounter());
              writer.println("===============");
              // Log the resulting string
              writer.flush();
              System.out.println(sw.getBuffer().toString());
              ...
              chain.doFilter(request, wrapper);
              ...
            }
          }

          4. 設置過濾器映射
          部署描述符文件的2.3版本引入了兩個用于過濾器的元素,分別是:filter和filter-mapping。filter元素向系統注冊一個過濾對象,filter-mapping元素指定該過濾對象所應用的URL。
          1.filter元素
          filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六個可能的子元素:
          icon 這是一個可選的元素,它聲明IDE能夠使用的一個圖象文件。
          filter-name 這是一個必需的元素,它給過濾器分配一個選定的名字。
          display-name 這是一個可選的元素,它給出IDE使用的短名稱。
          description 這也是一個可選的元素,它給出IDE的信息,提供文本文檔。
          filter-class 這是一個必需的元素,它指定過濾器實現類的完全限定名。
          init-param 這是一個可選的元素,它定義可利用FilterConfig的getInitParameter方法讀取的初始化參數。單個過濾器元素可包含多個init-param元素。

          filter-mapping元素
          filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三個可能的子元素::
          l filter-name 這個必需的元素必須與用filter元素聲明時給予過濾器的名稱相匹配。
          l url-pattern 此元素聲明一個以斜杠(/)開始的模式,它指定過濾器應用的URL。所有filter-mapping元素中必須提供url-pattern或servlet-name。但不能對單個filter-mapping元素提供多個url-pattern元素項。如果希望過濾器適用于多個模式,可重復整個filter-mapping元素。
          l servlet-name 此元素給出一個名稱,此名稱必須與利用servlet元素給予servlet或JSP頁面的名稱相匹配。不能給單個filter-mapping元素提供多個servlet-name元素項。如果希望過濾器適合于多個servlet名,可重復這個filter-mapping元素。

           

          posted @ 2007-05-13 17:12 ZelluX 閱讀(548) | 評論 (0)編輯 收藏

          1. 使用DisplayTag時一直報錯,檢查了出錯信息后發現是common-lang的某個類出錯。
          估計是MyEclipse自動添加Struts相關庫文件時使用的commons包比較早的緣故,于是把那些包都替換成了最新的版本,問題解決。

          2. HQL查詢中的屬性名應當是beans的屬性名
          數據庫的Book表中有inner_id這一字段
          對應于Hibernate逆向工程生成的Book類的innerId屬性
          查詢id為bookId的書時應該使用
          session.createQuery("from Book b where b.innerId='" + bookId + "'")
                 .list()
                 .get(0);

          3. DisplayTag分頁顯示功能中,使用的List變量必須是Session及以上級別的。

          4. iframe的使用,設置iframe的name屬性,然后就能通過<a target"iframename" href="#">控制iframe的瀏覽對象了。

          posted @ 2007-05-12 21:57 ZelluX 閱讀(177) | 評論 (0)編輯 收藏

          感覺比去年那個簡單點。不少地方都簡化了,比如圖書分類,使用了enum類型,而不像去年的需要多表查詢才能獲得分類。
          使用了Struts + Hibernate,準備先把基本功能做出來,然后再加上Ajax。
          1. html:select 的列表框選擇
          在csdn上看到的兩種方法:
          1)
          <html:select   property="personnelId">  
                <html:option   value="">請選擇</html:option>  
                <html:options  collection="personList"   property="personId"   labelProperty="personName"/>  
            </html:select>  
            html:options自動幫你迭代personList中的內容,前提是personList是Collection類型的,而且封裝的是一個包含personId,personName屬性的對象  
            property顯示的是value,labelProperty顯示的是頁面看到的內容


          2)
          <html:select>  
            <html:option   value="">請選擇***</html:option>  
            <logic:notEmpty>  
              <logic:iterate>  
                <option   value='11'>11</option>  
              </logic:iterate>  
            </logic:notEmpty>  
          </html:select>

          2. jsp頁面中用戶權限判斷的問題
          BBS上問了下,一般是采用Filter類的。具體方法明天再看吧。

          posted @ 2007-05-11 22:32 ZelluX 閱讀(242) | 評論 (0)編輯 收藏

          1. Dictionary 類型
          1) 類似于Java中的Hashtable類,Dictionary定義了鍵和值的一對一的關系。
          2) 定義:{key:value}
          d = {"server":"Tomcat", "database":"MySQL"}
          3) key對大小寫敏感。
          4) 可混用各種數據類型。
          5) 刪除元素 del d["server"]
          6) 清除所有元素 d.clear()

          2. List 類型
          1) 定義:
          li = ["a", "b", 1]
          2) 下標從0開始。
          3) 負數索引從list的尾部向前計數來存取元素,即
          li[-n] == li[len(li) - n]
          4) 分片(slice)
          >>> li = ['a', 'b', 'mpilgrim', 'z', 'example']
          >>> li[1:3]   //從第2個元素到第3個元素
          ['b', 'mpilgrim']
          >>> li[1:-1]  //從第2個元素到倒數第2個元素
          ['b', 'mpilgrim', 'z']
          >>> li[:3]
          ['a', 'b', 'mpilgrim']
          >>> li[3:] 
          ['z', 'example']
          >>> li[:]
          ['a', 'b', 'mpilgrim', 'z', 'example']

          5) 增加元素
          a) append 末尾追加單個元素
          b) insert 將單個元素插入某個位置
          >>> li
          ['a', 'b', 'mpilgrim', 'z', 'example', 'new']
          >>> li.insert(2, "new")           
          >>> li
          ['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new']
          c) extend 合并另一個List

          6) 搜索
          a) index 查找一個值的首次出現并返回索引值,如果沒有找到則引發異常,與Java不同
          b) in 操作符測試一個值是否在list內

          7) 刪除元素
          a) remove 刪除某個元素,如不存在則引發異常
          b) pop 彈出棧頂元素,即刪除最后一個值并返回該值

          8) List運算符 真方便啊 -,=
          >>> li = ['a', 'b', 'mpilgrim']
          >>> li = li + ['example', 'new']
          >>> li
          ['a', 'b', 'mpilgrim', 'example', 'new']
          >>> li += ['two']               
          >>> li
          ['a', 'b', 'mpilgrim', 'example', 'new', 'two']
          >>> li = [1, 2] * 3             
          >>> li
          [1, 2, 1, 2, 1, 2]

          posted @ 2007-05-11 16:22 ZelluX 閱讀(251) | 評論 (0)編輯 收藏

          1. Javascript中的繼承要自己模擬實現。一些常用方法:
          a) Object masquerading
          function ClassA(sColor) {
              
          this.color = sColor;
              
          this.sayColor = function () {
                  alert(
          this.color);
              }
          ;
          }

          function ClassB(sColor, sName) {
              
          this.newMethod = ClassA;
              
          this.newMethod(sColor);
              
          delete this.newMethod;
              
          this.name = sName;
              
          this.sayName = function () {
                  alert(
          this.name);
              }
          ;
          }
          通過調用ClassA的生成方法,ClassB繼承了ClassA的屬性和方法,同時newMethod所占用的空間也被釋放。

          另外,Object masquerading還支持多重繼承,方法類似。

          b) 使用call()方法
          感覺這個方法類似于Java反射機制中的invoke方法,第一個參數是個調用的對象主體,后面是被調用方法的參數。
          function ClassB(sColor, sName) {
              ClassA.call(
          this, sColor);
              
          this.name = sName;
              
          this.sayName = function () {
                  alert(
          this.name);
              }
          ;
          }
          ClassB通過調用ClassA的生成方法完成了初始化。

          c) 使用apply()方法
          和call()方法很相似,不同的是apply方法只有兩個參數,一個是調用對象主體,一個是參數數組。
          因此只要被上例的call語句改成ClassA.apply(this, new Array(sColor));即可

          d) prototype鏈
          function ClassA() {
          }

          ClassA.prototype.color 
          = “red”;
          ClassA.prototype.sayColor 
          = function () {
              alert(
          this.color);
          }
          ;
          function ClassB() {
          }

          ClassB.prototype 
          = new ClassA();
          注意被繼承的類ClassA構造方法里沒有任何參數。
          ClassB新的屬性要在prototype被賦值后再添加,否則就會被刪除。
          這種方法的好處在于,使用instanceof判斷子類對象和父類的關系的結果是true,和面向對象的思想一致。

          e) 混合
          Object masquerading的缺點在于性能不好,而prototype鏈又只能用無參構造器。因此要把兩者結合起來。
          function ClassA(sColor) {
              
          this.color = sColor;
          }

          ClassA.prototype.sayColor 
          = function () {
              alert(
          this.color);
          }
          ;
          function ClassB(sColor, sName) {
              ClassA.call(
          this, sColor);
              
          this.name = sName;
          }

          ClassB.prototype 
          = new ClassA();
          ClassB.prototype.sayName 
          = function () {
              alert(
          this.name);
          }
          ;
          要求ClassA在創建的時候也使用了prototype和constructor方法。

          f) 動態創建的類的繼承
          function Triangle(iBase, iHeight) {
              Polygon.call(
          this3);
              
          this.base = iBase;
              
          this.height = iHeight;
              
          if (typeof Triangle._initialized ==     “undefined”) {
                  Triangle.prototype.getArea 
          = function () {
                      
          return 0.5 * this.base * this.height;
                  }
          ;
                  Triangle._initialized 
          = true;
              }

          }

          Triangle.prototype 
          = new Polygon();
          注意prototype繼承這一語句是在最后執行的,也不能被封裝進構造器中。

          2. zInherit庫
          簡略的看了下,基本功能Prototype框架都提供。

          3.xbObjects
          同樣是個庫,略

          posted @ 2007-05-05 18:57 ZelluX 閱讀(300) | 評論 (0)編輯 收藏

          看到Firebug升級到1.0.5了,就去官網看了下
          更新內容沒什么,不過發現一個不錯的腳本插件Firebug lite,適用于其他瀏覽器。
          http://www.getfirebug.com/releases/firebuglite1.0-b1.zip
          http://www.aygfsteel.com/Files/zellux/firebug.rar
          使用方法很簡單,解壓到要測試的網頁目錄下(包括目錄)
          在html中加入
          <script language="javascript" type="text/javascript" src="/firebug/firebug.js"></script>
          然后在html標簽中聲明
          <html debug="true">
          就可以在網頁中使用Ctrl+Shift+F12打開Firebug的控制欄進行調試了。

          posted @ 2007-05-05 12:26 ZelluX 閱讀(1472) | 評論 (6)編輯 收藏

               摘要: 1. 面向對象語言的四個要素:封裝、聚合(Aggregation)、繼承、多態。ps. Aggragation - the capability to store one object inside of another object(貌似這本書并沒有區分Object-based和Object-oriented)2. 創建對象基本和Java一樣,但對于無參構造器,也可以使用類似Delphi的沒有括...  閱讀全文

          posted @ 2007-05-04 23:06 ZelluX 閱讀(457) | 評論 (0)編輯 收藏

          越來越發現JavaScript其實是一門很強大、很精深的語言,要好好學習下。
          以下例子都摘自于Professional JavaScript for Web Developers

          1. JavaScript中函數不能重載。

          2. 每個函數有一個對應的arguments[]數組,包含所有的參數,且數量不需固定。

          function howManyArgs() {
              alert(arguments.length);
          }

          3. 函數也是一個對象,使用Function類創建函數的方法是:
          var function_name = new Function(argument1, argument2,..,argumentN, function_body);
          這里所有的參數都必須是字符串。
          var sayHi = new Function("sName", Message""alert(\"Hello \" + sName + \", \" + sMessage + \”);”);
          從這個角度看,不支持函數重載的原因也很簡單。
          doAdd = new Function("iNum""alert(iNum + 100)");
          doAdd 
          = new Function("iNum""alert(iNum + 10)");
          doAdd(
          10);
          可以推出的幾個結論:
          a) 第二次函數聲明使得doAdd指向了另一個對象,自然不可能實現重載。
          b) 函數可以通過句柄很容易的復制。
          c) 函數能作為參數傳遞給另一個函數。
          d) func.toString()可以得到函數的具體內容。

          4. 閉包 Closure
          簡單的定義就是使用了函數體之外的引用。
          var sMessage = “Hello World!”;
          function sayHelloWorld() {
              alert(sMessage);
          }

          sayHelloWorld();
          var iBaseNum = 10;
          function addNumbers(iNum1, iNum2) {
              
          function doAddition() {
                  
          return iNum1 + iNum2 + iBaseNum;
              }

              
          return doAddition();
          }
          例二中的內嵌方法doAddition()使用了外部方法的參數。

          posted @ 2007-05-04 22:20 ZelluX 閱讀(323) | 評論 (0)編輯 收藏

          java.util.AbstractCollection
          感謝BBS上的outerheaven解答了add(E o)方法的問題。在把add方法寫成拋出異常不是為了防止子類向上轉型時錯誤地調用AbstractCollection的這個方法,而是為了讓不支持add方法的子類繼承,比如EnumSet類,它的元素是在創建時就決定的,不支持add方法。

          java.util.AbstractList
          1) 包含了
          private class Itr implements Iterator<E>
          private class ListItr extends Itr implements ListIterator<E>
          而ListIterator又是繼承Iterator接口的。
          分成兩個類寫是不是為了使代碼清晰呢?

          2) 使用了modCount變量檢查并發操作時容易發生的問題。
          Iterator中有一個expectedModCount變量,每次通過Iterator操作時,都會調用checkForComodification()方法,檢查expectedModCount是否和AbstractList的modCount相等,如果不同則拋出ConcurrentModificationException。

          3) subList方法和SubList類和視圖view有關(是不是Observer模式的應用呢?),先不看了

          4) equals方法中最后那個判斷語句有點新穎(或者我土了)
          public boolean equals(Object o) {
            
          if (o == this)
              
          return true;
            
          if (!(o instanceof List))
              
          return false;

            ListIterator
          <E> e1 = listIterator();
            ListIterator e2 
          = ((List) o).listIterator();
            
          while(e1.hasNext() && e2.hasNext()) {
              E o1 
          = e1.next();
              Object o2 
          = e2.next();
              
          if (!(o1==null ? o2==null : o1.equals(o2)))
                
          return false;
              }

              
          return !(e1.hasNext() || e2.hasNext());
            }

          }

          5) hashCode的生成:
          hashCode(e1, e2, ..., en) = Sigma(hashCode(ei) * 32^i)
          沒有考慮溢出之類的情況,因為只是個hashCode嘛

          posted @ 2007-05-04 13:11 ZelluX 閱讀(935) | 評論 (0)編輯 收藏

          僅列出標題
          共39頁: First 上一頁 25 26 27 28 29 30 31 32 33 下一頁 Last 
          主站蜘蛛池模板: 南皮县| 铜梁县| 阿巴嘎旗| 中宁县| 台湾省| 彰化市| 垦利县| 石景山区| 正阳县| 张家界市| 南华县| 丹凤县| 白朗县| 丹巴县| 合水县| 两当县| 隆昌县| 上蔡县| 绥德县| 九龙坡区| 石嘴山市| 什邡市| 江川县| 蓬安县| 乐平市| 旅游| 科技| 涪陵区| 广丰县| 澳门| 富顺县| 安宁市| 灌南县| 和静县| 如东县| 独山县| 墨脱县| 平罗县| 饶河县| 揭东县| 繁峙县|