黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

Servlet教程

Servlet Filter實現全站統一編碼,解決中文亂碼問題

在開發 Web 項目時,解決中文亂碼問題是不可避免的。在前面所學的知識中,解決亂碼的通常做法是在 Servlet 程序中設置編碼方式,但是,當多個 Servlet 程序都需要設置編碼方式時,就會書寫大量重復的代碼。

為了解決這一問題,我們可以在 Filter 中對獲取到的請求和響應消息進行編碼處理,這樣就可以實現全站編碼方式的統一。本節將分步驟演示如何使用 Filter 實現全站編碼的統一。

1、編寫 form.jsp 頁面

在 filterDemo01 項目的 WebContent 目錄中編寫一個 form.jsp 頁面,該頁面用于提交用戶登錄的表單信息,如下所示。

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                            "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>用戶登錄</title>
</head>
<center>
    <h3>用戶登錄</h3>
</center>
<body style="text-align:center;">
    <a href="<%=request.getContextPath()%>/CharacterServlet?name=張三&password=1234">
        單擊超鏈接登錄
    </a>
    <form action="<%=request.getContextPath()%>/CharacterServlet" method="post">
        <table border="1" width="600px" cellpadding="0" cellspacing="0" align="center">
            <tr>
                <td height="30" align="center">用戶名:</td>
                <td>&nbsp;<input type="text" name="name" /></td>
            </tr>
            <tr>
                <td height="30" align="center">密&nbsp;碼</td>
                <td>&nbsp;<input type="password" name="password" /></td>
            </tr>
            <tr>
                <td height="30" colspan="2" align="center">
                    <input type="submit" value="登錄"/>
                    &nbsp;&nbsp;&nbsp;&nbsp;
                    <input type="reset" value="重置" />
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

在 form.jsp 中,第 14~16 行代碼是一個請求方式為 GET 的超鏈接;第 17~35 行代碼是一個 POST 提交方式 form 表單。

2、創建 Servlet

在 filterDemo01 項目的 com.mengma.filter 包中創建一個名稱為 CharacterServlet 的 Servlet 類,該類用于獲取用戶輸入的請求參數,并將參數輸出到控制臺,其代碼如下所示。

package com.mengma.filter;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CharacterServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println(request.getParameter("name"));
        System.out.println(request.getParameter("password"));
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

3、創建過濾器

在 filterDemo01 項目的 com.mengma.filter 包中創建一個名稱為 CharacterFilter 的 Filter 類,該類用于攔截用戶的請求訪問,并實現全站編碼的統一,其具體實現代碼如下所示。

package com.mengma.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
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.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
public class CharacterFilter implements Filter {
    public void init(FilterConfig fConfig) throws ServletException {
    }
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        // 攔截所有的請求,解決全站中文亂碼,指定request和response的編碼
        request.setCharacterEncoding("utf-8"); // 只對消息體有效
        response.setContentType("text/html;charset=utf-8");
        // 對 request 進行包裝
        CharacterRequest characterRequest = new CharacterRequest(request);
        chain.doFilter(characterRequest,response);
    }
    public void destroy() {
    }
}
// 繼承默認包裝類 HttpServletRequestWrapper
class CharacterRequest extends HttpServletRequestWrapper {
    private HttpServletRequest request;
    public CharacterRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }
    // 子類繼承父類一定會覆寫一些方法,此處用于重寫getParameter()方法
    public String getParameter(String name) {
        // 調用被包裝對象getParameter()方法,獲得請求參數
        String value = super.getParameter(name);
        if (value == null) {
            return null;
        }
        String method = super.getMethod(); // 判斷請求方式
        if ("get".equalsIgnoreCase(method)) {
            try {
                value = new String(value.getBytes("iso-8859-1"), "utf-8");
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }
        }
        return value; // 解決亂碼后返回結果
    }
}

在 CharacterFilter 中,針對請求的方式不同,采用了不同的亂碼解決方式。其中,由于 POST 方式的請求參數存放在消息體中,所以通過 setCharacterEncoding() 方法進行設置,而 GET 方式的請求參數存放在消息頭中,通過 HttpServletRequestWrapper 類對 HttpServletRequest 類進行包裝,并通過重寫 getParameter() 的方式設置 GET 方式提交參數的編碼。

需要注意的是,由于要攔截用戶訪問資源的所有請求,因此需要將 CharacterFilter 映射信息中 元素攔截的路徑設置為“/*”,如下所示:

<filter>
    <filter-name>CharacterFilter</filter-name>
    <filter-class>com.mengma.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

4、運行項目并查看結果

啟動 Tomcat 服務器,在瀏覽器的地址欄中輸入地址 http://localhost:8080/filterDemo01/form.jsp,此時,瀏覽器窗口中會顯示一個用戶登錄的表單,在這個表單中輸入用戶名“張三”和密碼“1234”,如圖 1 所示。

圖 1 運行結果

單擊圖 1 中的【登錄】按鈕提交表單,此時,MyEclipse 控制臺顯示的結果如圖 2 所示。

圖 2 控制臺窗口

從圖 2 中可以看出,form.jsp 表單中輸入的信息已經顯示在了控制臺窗口中,而且中文的用戶名也沒有出現亂碼。需要注意的是,由于 form.jsp 表單的提交方式是 POST,因此可以說明使用 CharacterFilter 類可以解決 POST 提交方式的中文亂碼問題。

接下來驗證 GET 方式提交表單的亂碼問題是否可以解決。單擊圖 1 中的“單擊超鏈接登錄”鏈接后(這種提交方式相當于 GET 方式提交信息),MyEclipse 控制臺窗口顯示的結果同樣如圖 2 所示。因此可以說明,使用 CharacterFilter 類可以解決 GET 提交方式的中文亂碼問題。

全部教程
主站蜘蛛池模板: 久久久久久久999精品视频 | 国产日韩欧美精品一区 | 日韩手机在线观看 | 免费日韩精品 | 国产成人a毛片在线 | 涩涩视频在线观看入口 | a一级爱做片免费观看欧美 a一级爱做片免费 | 伦理第一页 | 精品在线一区二区 | 六月丁香啪啪六月激情 | papa视频| 窝窝影院午夜看片 | 日日夜夜操美女 | 伊人中文字幕在线观看 | xxxx国产| 日本一本高清视频 | 午夜影院小视频 | 波多野在线视频 | 黄大色大片免费久久 | 日本夜夜夜 | 9191精品国产费久久 | 手机看片日韩高清国产欧美 | 曰批免费视频 | 天天操狠狠 | 亚洲天堂久久久 | 欧美日韩亚洲色图 | 最近的2019中文字幕国语hd | 日韩成a人片在线观看日本 日韩操操操 | 久久综合欧美 | 精品国产v无码大片在线观看 | 交视频在线播放 | 日韩毛片在线视频 | 国产高清看片日韩欧美久久 | 国产卡1卡2卡三卡网站免费 | 欧美日韩一区二区在线视频播放 | 制服丝袜 自拍偷拍 | aaa免费看| 日日骑夜夜骑 | 亚洲成人中文字幕 | aaa一级特黄 | 热99re久久精品2久久久 |