隨筆-57  評論-202  文章-17  trackbacks-0
                我在JSP頁面中,當處理<a href></a>時,經常不用<html:link/>的方式處理,而是用下面這樣的方式處理:
                <a href="foo.do?param1=<bean:write name="n1" property="p1"/>&param2=<bean:write name="n2" property="p2"/>">Test</a>
                這樣在處理多個參數時,就不需要先放到一個Collection中。按照<html:link/>的多個參數的處理方法去做,有時確實是很繁瑣。不過這樣帶來一個新的問題,在處理中文參數值時,這樣就行不通了。用request.getParameter("param1")獲取的中文,在中文的個數為奇數個時,就會顯示不正確。例如“三個字”在getParameter中獲取的值是“三個?”。
                這個問題是由于<bean:write />沒有用URLEncoder的encode方法處理值,因為<bean:write />主要是用來在頁面上顯示bean的信息,并不是用在鏈接中當作參數的值。這個問題可以通過給<bean:write />增加新的屬性來解決。
                從Struts的網站上下載Struts 1.2.4的源代碼:http://apache.freelamp.com/struts/source/jakarta-struts-1.2.4-src.zip
                解壓到本地目錄,然后修改文件jakarta-struts-1.2.4-src\src\share\org\apache\struts\taglib\bean\WriteTag.java。新增一個屬性charset,表示需要用什么編碼進行編碼。代碼片斷如下:

              /**
               * Added by George Hill, the string value charset to encoding.
               * 05/19/2005
               
          */

              
          protected String charset = null;

              
          public String getCharset() {
                  
          return (this.charset);
              }


              
          public void setCharset(String charset) {
                  
          this.charset = charset;
              }

                修改方法formatValue,把這段


                  
          if (value instanceof java.lang.String) {
                          
          return (String) value;
                  }
           else {

                  }


                替換為:


                  
          if (value instanceof java.lang.String) {
                      
          if (charset != null && charset.length() != 0)
                          
          return TagUtils.getInstance().encodeURL((String) value, charset);
                      
          else
                          
          return (String) value;
                  }
           else {

                  }


                保存修改后的文件。然后需要修改文件jakarta-struts-1.2.4-src\doc\userGuide\struts-bean.xml。這個文件在ant編譯時會變成strtus-bean.tld文件。在tag write后面增加一個attribute,如下所示:


            
          <tag>
              
          <name>write</name>

              
          <attribute>
                
          <name>charset</name>
                
          <required>false</required>
                
          <rtexprvalue>true</rtexprvalue>
                
          <info>
                
          <p>Added by George Hill, use this charset to encoding the value.</p>
                
          </info>
              
          </attribute>

            
          </tag>

                然后修改一下ant的編譯配置文件build.xml,有幾個部分需要修改:
                1.屬性catalina.home需要修改成你安裝的tomcat的目錄;
                2.compile.classpath需要修改,把jar文件的路徑指向正確;
                3.prepare.library taget部分的copy,把相關的jar文件的路徑指向正確。
                運行ant,編譯后的jar文件保存在jakarta-struts-1.2.4-src\target\library目錄中,把原來的struts.jar和struts-bean.tld文件替換掉,就可以用自定義的<bean:write /> tag了。如果不寫charset屬性,那么和原來的<bean:write />處理是一樣的。
                這樣,類似于下面的鏈接地址:
                <a href="foo.do?param1=<bean:write name="n1" property="p1"/>&param2=<bean:write name="n2" property="p2"/>">Test</a>
                就可以修改成:
                <a href="foo.do?param1=<bean:write name="n1" property="p1" charset="UTF-8"/>&param2=<bean:write name="n2" property="p2" charset="UTF-8"/>">Test</a>
                在request.getParameter("param1")中將會獲得正確的中文值。
                對于struts 1.1,程序又稍微有些不同。我將在下一篇隨筆中介紹。
          posted on 2005-05-20 00:50 小米 閱讀(2094) 評論(5)  編輯  收藏 所屬分類: Struts

          評論:
          # re: 用URLEncoder輸出&lt;bean:write /&gt的值 2005-05-20 11:18 | Dennis
          雖然老實說... struts tag 的設計真的很差...
          其實要應用類似 jsp:forward 的 jsp:param
          加上 html:linkParam 才對

          但, 以你這個例子, 肯定是用 html:link 會比較好

          1. foo.do 是一個 struts action, 而它的 path 和 .do 是可能轉換的

          2.事實上, 可應用 EL 是可以完全替代 bean:write 的
          寫一個 EL function 來作 escape 會比較簡單
          也不必改動 struts 的 source code

          或根本放在 bean 中的 properties 就已經是 escape 了的 string

          3. 不滿意 struts 的 taglib, 可以轉用其他(e.g. jstl)
          或 extends 它, 甚至自行寫一套也可以...
          以 patch 的想法, 改動小許 source 的做法, 會引起相容性問題.

          例如 copy bean.tld 為 mybean.tld
          也 extends org.apache.struts.taglib.bean.WriteTag
            回復  更多評論
            
          # re: 用URLEncoder輸出&lt;bean:write /&gt的值 2005-05-20 11:31 | 小米
          確實,struts在View這一層做的相當不好,設計人員沒有很好的考慮實際開發人員是否方便使用。我一般也是迫不得以才考慮修改struts的源代碼,因為如果隨便修改源代碼的話,在團隊開發中會帶來很大的麻煩,自己還需要維護一套struts的代碼。
          我也在考慮著在View這一層不使用struts的實現。多謝你的指教。  回復  更多評論
            
          # re: 用URLEncoder輸出&lt;bean:write /&gt的值[未登錄] 2008-06-03 11:40 | aaa
          aaaaaaaaaa
          aaaaaaaaaaaaaaaaaaaa
          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
          aaaaaaaaaaaaaaaaaaaa
          aaaaaaaaaa  回復  更多評論
            
          # re: 用URLEncoder輸出&lt;bean:write /&gt的值[未登錄] 2008-06-03 11:40 | aaa
          aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  回復  更多評論
            
          # re: 用URLEncoder輸出&lt;bean:write /&gt的值[未登錄] 2008-06-03 11:44 | aaa
          臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍臥虎藏龍  回復  更多評論
            
          主站蜘蛛池模板: 海南省| 固始县| 昌邑市| 兰州市| 绍兴市| 沅陵县| 平远县| 鄄城县| 浑源县| 西贡区| 株洲市| 达拉特旗| 印江| 宜都市| 奎屯市| 吉安市| 措勤县| 灯塔市| 苍梧县| 合水县| 甘南县| 花垣县| 临泽县| 五家渠市| 临沂市| 湘潭市| 瓮安县| 咸阳市| 博乐市| 孟村| 仁布县| 合水县| 绿春县| 老河口市| 诸城市| 甘孜| 临桂县| 密山市| 洛隆县| 芦溪县| 甘肃省|