Leo's Blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            13 隨筆 :: 3 文章 :: 18 評論 :: 0 Trackbacks

          昨天在整合Spring MVC和Velocity,Sitemesh時,又碰到了久違的中文問題。唉,JSP, mysql, struts,每次都會碰到這樣的問題,總是以為這種以后不會碰到這種看似初級的問題了,結果還是躲不過。網上沒查到相關資料,于是開始動手跟蹤Spring和Velocity的源碼,弄了一天終于搞定。后來一個同學告訴我這個問題在Spring中文論壇里有精華貼,跟我最后的解決方案一樣的,氣死我也。不過跟蹤Spring的源代碼收獲還是不錯的,現在又對Spring的MVC framework有了更深的認識。這里把以前碰到的中文問題大概列一下,方便以后參考。

          1、JSP頁面顯示的中文問題
          這是最初級的東西,網上到處都有,不過還是列一下吧:
          Page的第一行改成:<%@ page contentType="text/html; charset=gb2312" %>
          Head里加:
          2、頁面Form 內容提交的中文問題
          在web.xml里加入:

          CharacterEncodingFilter
          Character Encoding Filter
          no description
          org.springframework.web.filter.CharacterEncodingFilter

          encoding
          GB2312


          forceEncoding
          true



          CharacterEncodingFilter
          /*

          呵呵,這是個簡單得要命的filter,如果不用Spring的話,完全可以自己寫一個。其實任何的interceptor機制都可以處理這個的,不管用Webwork還是Spring的interceptor,甚至用AOP,只要在取參數前加那么一句:request.setCharacterEncoding("GB2312");就行了。以前我用struts就是在它的RequestProcessor的populate之前加了這么一行。
          3、request 的parameter里要傳中文參數的問題
          這個問題跟Web Container有關系,記得以前我同學用WebLogic時好象沒出現這樣的問題。(我一般不傳中文參數,呵呵)。
          Tomcat里的解決方案是在server.xml里Connector port="8080"的attribute里加URIEncoding="GB2312"
          當然還有最土的解決方案,雖然不太會用到,不過還是列出來,以備最無奈的時候使用:
          String encodeStr=new String(fieldValue.getBytes("8859_1"), "gb2312");
          4、mysql的中文問題
          首先要修改mysql配置文件的encoding為GB2312,這部分的操作不記得了,畢竟好久沒用mysql了。不過據說新版的mysql里有wizard可以設的。然后把jdbc connection改成如下:
          jdbc:mysql://localhost:3306/bsfbookstore?useUnicode=true;characterEncoding=GB2312
          另外在寫程序成盡量用PrepareStatement,少用Statement,好象jdbc驅動在解析statement里的SQL包含中文時會有問題。(用PrepareStatement也是好習慣, hibernate里全用PrepareStatement的,哈哈)
          5、Spring與Veclocity結合的中文問題
          第一步:
          在"velocityConfig"里配置velocity.propeties文件,加下面一行:
          /WEB-INF/velocity.properties
          呵呵,也可以在config里直接用Map把參數寫進去,這樣就不用properties文件,這個Spring的文檔里都有。
          然后在velocity.properties里寫:
          input.encoding=GB2312
          output.encoding=GB2312
          default.contentType=text/html; charset=GB2312(ms這一行沒有用處,Spring有個地方讀進這個參數,不過后來又覆蓋掉了)
          第二步:
          接下來就是我昨天調了半天的那個地方,最后的解決方案很簡單,在viewResolver配置里加一行:
          text/html; charset=GB2312
          呵呵,就這么一行害我debug了好久,跟蹤了Velocity的Context設置,甚至改了Spring的源碼,用了Filter,Spring的Handler interceptor來設置reponse的contentType就是沒效果,結果發現Spring在Velocity View的render里加了這么一行:
          response.setContentType(getContentType());
          呵呵,原先設好的contentType都被沖掉了,因為render的時機是在postHandler之后,呵呵。
          這個參數對jsp是沒有用的,因為jsp會根據自己頁面的contentType設定的,所以每個JSP必須設置自己的contentType,Velocity就不用啦。難怪以前用JSP的時候沒碰到這個問題。

          posted on 2005-09-14 10:37 Leo 閱讀(1087) 評論(3)  編輯  收藏 所屬分類: 技術隨文

          評論

          # re: Spring MVC與Veclocity結合中文問題及常用中文問題總結 2005-12-03 14:02 csand
          thx  回復  更多評論
            

          # re: Spring MVC與Veclocity結合中文問題及常用中文問題總結 2005-12-14 22:03 rlj
          該方案不完整,非終極解決方案  回復  更多評論
            

          # re: Spring MVC與Veclocity結合中文問題及常用中文問題總結 2006-01-07 11:56 nickey's home
          為什么那么喜歡gb2312? getTemplate的時候用getTemplate(xxx,"utf-8")加載模版不行嗎?  回復  更多評論
            

          主站蜘蛛池模板: 桃园县| 易门县| 高雄县| 长寿区| 静宁县| 忻州市| 南澳县| 永川市| 岱山县| 苍溪县| 大竹县| 温泉县| 周宁县| 耒阳市| 佛山市| 昭苏县| 贵港市| 建阳市| 万安县| 黔南| 宁南县| 济宁市| 高安市| 花莲市| 安徽省| 陕西省| 洪湖市| 九龙城区| 芷江| 东安县| 嘉义县| 井冈山市| 喜德县| 苏尼特左旗| 门头沟区| 崇明县| 成安县| 武汉市| 博白县| 京山县| 湄潭县|