程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Struts從零開始二、解決中文亂碼的問題實例

Struts從零開始二、解決中文亂碼的問題實例

編輯:關於JAVA

在進行web應用程序開發的過程中,中文問題經常困擾著很多程序員。因此,在接下來的兩個課程的學習中,我將根據實踐經驗來談一下web應用中的中文問題的解決方法。讓大家不再為此而頭痛。

我們就前那個登錄驗證的例子,進行進階,處理中文亂碼問題。前面例子中,只要用戶名和密碼都是123,才返回成功的頁面。為了處理中文,我們判斷只有用戶名是張三才登陸成功。

一、程序進階:

既然是中文亂碼處理,頁面的用戶輸入就是中文了,相應的action的if處理也要變成: if (username.equals("張三") &&userpass.equals("123"));

效果圖:

我們以結果為導向,首先大家先看看要完成的效果圖,對接下來要做的事情有個清晰的認識。

1、如圖鍵入:中文

顯示結果如下圖:

為什麼會到錯誤頁面呢?我們明明都寫正確了呀,是的,沒有錯誤,這是什麼原因呢?

請看下圖:

我們打印才發現原來username的值傳到action中,成了亂碼,這主要由於客戶端和服務器端采用了不同的字符集,中文亂碼我們沒有處理。

二、解決辦法:

A、直接轉編碼

我們新建一個包,命名為util,在包下新建一個類文件,命名為EncodingUtil,類的功能就是提供一個字符集轉換的一個方法,具體代碼如下所示:

package util;
public class Encoding {
public static String isToGB(String src) {
String strRet = null;
try {
strRet = new String(src.getBytes("ISO_8859_1"), "GBK");
} catch (Exception e) {
e.printStackTrace();
}
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類,步驟如下:

(1) 創建一個繼承org.apache.struts.action.RequestProcessor的類,在改類中顯示定義一個無參,方法體為空的構造器。

(2) 重寫所需的方法,加入我們的功能。

具體代碼如下所示:

package servlets;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.RequestProcessor;
public class EncodingHandler extends RequestProcessor {
public boolean processPreprocess(HttpServletRequest servletRequest,
HttpServletResponse serveltResponse) {
try {
servletRequest.setCharacterEncoding("GBK");
System.out.println("請求被處理.");
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
return true;
}
}

(3) 修改配置文件sturts-config.xml,在其中加入一個名為的元素,用以指定我們定制的RequestProcessor類。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<form-beans>
<form-bean name="loginActionForm" type="formbeans.LoginActionForm" />
</form-beans>
<action-mappings>
<action
path="/login"
name="loginActionForm"
scope="request"
type="actions.LoginAction">

<forward name="success" path="/success.jsp"/>
<forward name="error" path="/wrong.jsp"/>
</action>
</action-mappings>
<controller processorClass="servlets.EncodingHandler" />
</struts-config>

上面就是我們自己的定義的RequestProcessor類,使用標簽類定義。

如圖:

小結:這樣做呢?問題是解決了,每一個請求先經過這個方法,並轉換了字符集再交給action做處理,這樣我們不用在操心中文亂碼,但RequestProcessor是與struts耦合在一塊兒。如果不用struts框架,我們又該如何處理中文問題呢?是否又更好的辦法呢?那就接著跟我往下看吧。

C、Filter來解決中文問題

Filter,是不是你腦子裡閃現了這個詞呢?下面就來看看如何用它來改寫我們上一章節的例子吧!

(1) 首先在工程中新建一包,命名為filter,在下面新建一類文件,命名為EncodingServlet,並繼承HttpServlet、實現Filter接口,注意並實現接口的方法。

在Servlet中filter起著過濾器的作用,當一個請求發送到服務器的時候,需要把請求首先交給filter來處理,然後交給action做處理。EncodingServlet負責處理請求的字符集,在此就起這麼個功能,具體代碼請依照如下所示:

package servlets;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
public class EncodingServlet extends HttpServlet implements Filter {
private static final long serialVersionUID = 1L;
public void doFilter(ServletRequest servletRequest,
ServletResponse serveltResponse, FilterChain filterChain) {
try {
servletRequest.setCharacterEncoding("GBK");
filterChain.doFilter(servletRequest, serveltResponse);
} catch (Exception ex) {
}
}
public void init(FilterConfig arg0) throws ServletException {
}
}

(2) 修改web.xml,加入我們的filter。

EncodingServlet
servlets.EncodingServlet
EncodingServlet
/*

小結:這個中文亂碼處理用了fileter,而且適用與任何場合,比較實用。

怎麼樣,通過三個處理中文亂碼的方案,有和感想呀,是不是程序很有意思呀,那就跟著我繼續看看struts別的東東吧……

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved