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

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

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

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

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

          3. 一個 Duke's Bookstore 的例子
          HitCounterFilter在servlet被訪問時計數(shù)。
          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. 設(shè)置過濾器映射
          部署描述符文件的2.3版本引入了兩個用于過濾器的元素,分別是:filter和filter-mapping。filter元素向系統(tǒng)注冊一個過濾對象,filter-mapping元素指定該過濾對象所應(yīng)用的URL。
          1.filter元素
          filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六個可能的子元素:
          icon 這是一個可選的元素,它聲明IDE能夠使用的一個圖象文件。
          filter-name 這是一個必需的元素,它給過濾器分配一個選定的名字。
          display-name 這是一個可選的元素,它給出IDE使用的短名稱。
          description 這也是一個可選的元素,它給出IDE的信息,提供文本文檔。
          filter-class 這是一個必需的元素,它指定過濾器實現(xiàn)類的完全限定名。
          init-param 這是一個可選的元素,它定義可利用FilterConfig的getInitParameter方法讀取的初始化參數(shù)。單個過濾器元素可包含多個init-param元素。

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

           

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

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

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

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

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

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

          感覺比去年那個簡單點。不少地方都簡化了,比如圖書分類,使用了enum類型,而不像去年的需要多表查詢才能獲得分類。
          使用了Struts + Hibernate,準(zhǔn)備先把基本功能做出來,然后再加上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中的內(nèi)容,前提是personList是Collection類型的,而且封裝的是一個包含personId,personName屬性的對象  
            property顯示的是value,labelProperty顯示的是頁面看到的內(nèi)容


          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頁面中用戶權(quán)限判斷的問題
          BBS上問了下,一般是采用Filter類的。具體方法明天再看吧。

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

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

          2. List 類型
          1) 定義:
          li = ["a", "b", 1]
          2) 下標(biāo)從0開始。
          3) 負(fù)數(shù)索引從list的尾部向前計數(shù)來存取元素,即
          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個元素到倒數(shù)第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 查找一個值的首次出現(xiàn)并返回索引值,如果沒有找到則引發(fā)異常,與Java不同
          b) in 操作符測試一個值是否在list內(nèi)

          7) 刪除元素
          a) remove 刪除某個元素,如不存在則引發(fā)異常
          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 閱讀(247) | 評論 (0)編輯 收藏

          1. Javascript中的繼承要自己模擬實現(xiàn)。一些常用方法:
          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);
              }
          ;
          }
          通過調(diào)用ClassA的生成方法,ClassB繼承了ClassA的屬性和方法,同時newMethod所占用的空間也被釋放。

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

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

          c) 使用apply()方法
          和call()方法很相似,不同的是apply方法只有兩個參數(shù),一個是調(diào)用對象主體,一個是參數(shù)數(shù)組。
          因此只要被上例的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構(gòu)造方法里沒有任何參數(shù)。
          ClassB新的屬性要在prototype被賦值后再添加,否則就會被刪除。
          這種方法的好處在于,使用instanceof判斷子類對象和父類的關(guān)系的結(jié)果是true,和面向?qū)ο蟮乃枷胍恢隆?

          e) 混合
          Object masquerading的缺點在于性能不好,而prototype鏈又只能用無參構(gòu)造器。因此要把兩者結(jié)合起來。
          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在創(chuàng)建的時候也使用了prototype和constructor方法。

          f) 動態(tài)創(chuàng)建的類的繼承
          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繼承這一語句是在最后執(zhí)行的,也不能被封裝進(jìn)構(gòu)造器中。

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

          3.xbObjects
          同樣是個庫,略

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

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

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

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

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

          越來越發(fā)現(xiàn)JavaScript其實是一門很強(qiáng)大、很精深的語言,要好好學(xué)習(xí)下。
          以下例子都摘自于Professional JavaScript for Web Developers

          1. JavaScript中函數(shù)不能重載。

          2. 每個函數(shù)有一個對應(yīng)的arguments[]數(shù)組,包含所有的參數(shù),且數(shù)量不需固定。

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

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

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

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

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

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

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

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

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

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

          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 閱讀(932) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共39頁: First 上一頁 25 26 27 28 29 30 31 32 33 下一頁 Last 
          主站蜘蛛池模板: 即墨市| 垣曲县| 麻城市| 镇宁| 衡山县| 阳高县| 辽阳县| 平顶山市| 广安市| 广东省| 天门市| 建湖县| 阳城县| 黎平县| 贵溪市| 策勒县| 白玉县| 大余县| 贡山| 宜丰县| 合水县| 临沭县| 定襄县| 平原县| 思茅市| 桓仁| 庐江县| 柳州市| 嘉黎县| 肃宁县| 苏尼特右旗| 开封市| 沂源县| 汝阳县| 宁海县| 常熟市| 柳河县| 香河县| 雷山县| 大悟县| 阜宁县|