1. 程式人生 > >Struts中文亂碼的解決方法

Struts中文亂碼的解決方法

在進行struts開發的過程中。總也是出現非常多的亂碼問題。但歸根究竟,也僅僅是下面三種情況: 

㈠頁面顯示中文亂碼 

㈡傳遞引數中文亂碼 

㈢國際化資原始檔亂碼
 

以下就這三中情況介紹怎麼在詳細專案中處理這些亂碼問題。

而對於總體的處理思想。是要統一編碼為: UTF-8.(以myeclipse6支援的struts1.3為準) 

㈠頁面顯示中文亂碼 

      對於在頁面中顯示出現亂碼,這個問題比較簡單,便是檢查你的JSP檔案中是不是出現了中文要處理。由於JSP預設的編碼格式為“ISO-8859-1”。當JSP中出現要處理的中文時。其顯示就出現亂碼了,這樣的情況一般出如今手寫JSP,或改動時。由於在myeclipse6.0中,假設出現了編碼錯誤時,程式不會讓你儲存,而是會提示你注意編碼,這點非常好。

詳細的改動辦法是把

Html程式碼

<%@ page language="java" import="java.util." pageEncoding="ISO-8859-1">  


改成:

Html程式碼 

<%@ page language="java" import="java.util." pageEncoding="UTF-8"> 


㈡傳遞引數中文亂碼 

         傳遞參數出現的亂碼,引數的內容為中文。比方在struts應用中,簡單的一個登入介面中。須要傳遞的登入名為中文時,你沒經處理之前,是會出現亂碼傳遞的。為了讓我們能看到顯示的亂碼,我們在相應的Action類的子類裡,改動一下。用System.out把接受到的引數輸出,程式碼例如以下:

Java程式碼

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,   
        HttpServletResponse response) ...{   
    DynaActionForm loginForm = (DynaActionForm) form;   
  
    String username = (String) loginForm.get("username");   
    String password = (String) loginForm.get("password");   
    System.out.println("username:"+username);   
    System.out.println("password:"+password);   
    if (username.equals("ivorytower") && password.equals("123456")) ...{   
        return mapping.findForward("success");   
    }   
    return mapping.findForward("fail");   
    }  


那麼當你提交了中文輸入後就會出現亂碼了。 

詳細的解決方法: 

①改動Tomcat---->conf----->server.xml檔案,在改動port的標籤後面加一行程式碼。例如以下:

Xml程式碼

port="8080" protocol="HTTP/1.1"    
              connectionTimeout="20000"    
              redirectPort="8443"  URIEncoding="UTF-8"/>  


②編寫過濾器Filter

Java程式碼

    

import java.io.IOException;   
  
import javax.servlet.Filter;   
import javax.servlet.FilterChain;   
import javax.servlet.FilterConfig;   
import javax.servlet.ServletException;   
import javax.servlet.ServletRequest;   
import javax.servlet.ServletResponse;   
  
public class CharacterEncodingFilter implements Filter ...{   
    String charSet; //儲存編碼引數
    @Override  
    public void destroy() ...{   
    }   
  
    @Override  
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException   {   
    		request.setCharacterEncoding(charSet); //xml初始化函式中賦值過了,後面給出web.xml程式碼
		HttpServletRequest req=(HttpServletRequest) request;
		HttpServletResponse resp=(HttpServletResponse) response;
		HttpSession ses=req.getSession();   //HttpSession!
		if(ses.getAttribute("username")!=null) {
			chain.doFilter(request, response);
		}else {
			//request.getRequestDispatcher("/login/login.html").forward(request,response);
			resp.sendRedirect("/login/login.html");  //跳轉之後再登陸404
		}
		// pass the request along the filter chain
		//chain.doFilter(request, response);
    }   
  
    @Override  
    public void init(FilterConfig arg0) throws ServletException {   
    }   
  
}  


  利用過濾器,把request傳遞的中文引數都設成“UTF-8”編碼。 

然後web.xml檔案配置過濾器

    開啟專案裡的web.xml檔案,在前面加上例如以下程式碼:

Xml程式碼

<filter>
    <filter-name>Login</filter-name>
    <filter-class>filter.LoginFilter</filter-class>
    <init-param>
      <param-name>charSet</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Login</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


注意其過濾的URL為“/*”,表示當前的request請求。

為了使設定生效,重起tomcat。 

中文亂碼