在進行web應用程序開發的過程中中文問題經常困擾著很多程序員因此在接下來的兩個課程的學習中我將根據實踐經驗來談一下web應用中的中文問題的解決方法讓大家不再為此而頭痛
我們就前那個登錄驗證的例子進行進階處理中文亂碼問題前面例子中只要用戶名和密碼都是才返回成功的頁面為了處理中文我們判斷只有用戶名是張三才登陸成功
一程序進階
既然是中文亂碼處理頁面的用戶輸入就是中文了相應的action的if處理也要變成: if (usernameequals(張三) &&userpassequals())
效果圖
我們以結果為導向首先大家先看看要完成的效果圖對接下來要做的事情有個清晰的認識
如圖鍵入中文
顯示結果如下圖
為什麼會到錯誤頁面呢?我們明明都寫正確了呀是的沒有錯誤這是什麼原因呢?
請看下圖
我們打印才發現原來username的值傳到action中成了亂碼這主要由於客戶端和服務器端采用了不同的字符集中文亂碼我們沒有處理
二解決辦法
A直接轉編碼
我們新建一個包命名為util在包下新建一個類文件命名為EncodingUtil類的功能就是提供一個字符集轉換的一個方法具體代碼如下所示
package util;
public class Encoding {
public static String isToGB(String src) {
String strRet = null;
try {
strRet = new String(srcgetBytes(ISO__) GBK);
} catch (Exception e) {
eprintStackTrace();
}
return strRet;
}
}
小結這辦法雖然能解決中文亂碼但是每次還得調用是不是很不方便呢?如果忘記了調用這個方法那程序又亂碼了維護起來很困難下面我們看另一種解決方案
B繼承RequestProcessor類
RequestProcessor類處理ActionServlet接收到的所有請求根據它的處理方式可將每個請求分解為多個小任務分別由不同的方法執行這就允許針對請求的各個單獨部分自定義處理
RequestProcessor類的部分方法如下
processPath() 獲取客戶端請求的路徑URI
processMapping() 根據請求URI獲取所需的映射信息
processRoles() 檢查用戶的角色是否允許他訪問請求的資源
processActionForm() 新建一個Form Bean或從請求會話中檢索Form Bean
processForward() 處理元素forward以匹配當前的請求路徑
processValidate() 調用Form Bean的validate()方法
processPreprocess() 告訴請求處理器調用此方法後是否應繼續處理請求
processLocale() 為請求選擇一個語言環境
processActionCreate() 實例化當前ActionMapping指定的類的實例
processActionPerform() 將調用action的perform()或execute()方法
呵呵發沒發現RequestProcess類的所有方法都有一個前綴proess接著往下看吧
RequestProcessor在action之前所以我們應著手RequestProcessor要開發自己的RequestProcessor類步驟如下
() 創建一個繼承orgapachestrutsactionRequestProcessor的類在改類中顯示定義一個無參方法體為空的構造器
() 重寫所需的方法加入我們的功能
具體代碼如下所示
package servlets;
import javaioUnsupportedEncodingException;
import javaxservlethttpHttpServletRequest;
import javaxservlethttpHttpServletResponse;
import orgapachestrutsactionRequestProcessor;
public class EncodingHandler extends RequestProcessor {
public boolean processPreprocess(HttpServletRequest servletRequest
HttpServletResponse serveltResponse) {
try {
servletRequestsetCharacterEncoding(GBK);
Systemoutprintln(請求被處理);
} catch (UnsupportedEncodingException ex) {
exprintStackTrace();
}
return true;
}
}
() 修改配置文件sturtsconfigxml在其中加入一個名為的元素用以指定我們定制的RequestProcessor類
<?xml version= encoding=UTF?>
<!DOCTYPE strutsconfig PUBLIC //Apache Software Foundation//DTD Struts Configuration //EN config__dtd>
<strutsconfig>
<formbeans>
<formbean name=loginActionForm type=formbeansLoginActionForm />
</formbeans>
<actionmappings>
<action
path=/login
name=loginActionForm
scope=request
type=actionsLoginAction>
<forward name=success path=/successjsp/>
<forward name=error path=/wrongjsp/>
</action>
</actionmappings>
<controller processorClass=servletsEncodingHandler />
</strutsconfig>
上面就是我們自己的定義的RequestProcessor類使用標簽類定義
如圖
小結這樣做呢?問題是解決了每一個請求先經過這個方法並轉換了字符集再交給action做處理這樣我們不用在操心中文亂碼但RequestProcessor是與struts耦合在一塊兒如果不用struts框架我們又該如何處理中文問題呢?是否又更好的辦法呢?那就接著跟我往下看吧
CFilter來解決中文問題
Filter是不是你腦子裡閃現了這個詞呢?下面就來看看如何用它來改寫我們上一章節的例子吧!
() 首先在工程中新建一包命名為filter在下面新建一類文件命名為EncodingServlet並繼承HttpServlet實現Filter接口注意並實現接口的方法
在Servlet中filter起著過濾器的作用當一個請求發送到服務器的時候需要把請求首先交給filter來處理然後交給action做處理EncodingServlet負責處理請求的字符集在此就起這麼個功能具體代碼請依照如下所示
package servlets;
import javaxservletFilter;
import javaxservletFilterChain;
import javaxservletFilterConfig;
import javaxservletServletException;
import javaxservletServletRequest;
import javaxservletServletResponse;
import javaxservlethttpHttpServlet;
public class EncodingServlet extends HttpServlet implements Filter {
private static final long serialVersionUID = L;
public void doFilter(ServletRequest servletRequest
ServletResponse serveltResponse FilterChain filterChain) {
try {
servletRequestsetCharacterEncoding(GBK);
filterChaindoFilter(servletRequest serveltResponse);
} catch (Exception ex) {
}
}
public void init(FilterConfig arg) throws ServletException {
}
}
() 修改webxml加入我們的filter
EncodingServlet
servletsEncodingServlet
EncodingServlet
/*
小結這個中文亂碼處理用了fileter而且適用與任何場合比較實用
怎麼樣通過三個處理中文亂碼的方案有和感想呀是不是程序很有意思呀那就跟著我繼續看看struts別的東東吧……
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28691.html