大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Servlet教程

Servlet Filter實(shí)現(xiàn)全站統(tǒng)一編碼,解決中文亂碼問題

在開發(fā) Web 項(xiàng)目時(shí),解決中文亂碼問題是不可避免的。在前面所學(xué)的知識(shí)中,解決亂碼的通常做法是在 Servlet 程序中設(shè)置編碼方式,但是,當(dāng)多個(gè) Servlet 程序都需要設(shè)置編碼方式時(shí),就會(huì)書寫大量重復(fù)的代碼。

為了解決這一問題,我們可以在 Filter 中對(duì)獲取到的請(qǐng)求和響應(yīng)消息進(jìn)行編碼處理,這樣就可以實(shí)現(xiàn)全站編碼方式的統(tǒng)一。本節(jié)將分步驟演示如何使用 Filter 實(shí)現(xiàn)全站編碼的統(tǒng)一。

1、編寫 form.jsp 頁面

在 filterDemo01 項(xiàng)目的 WebContent 目錄中編寫一個(gè) 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 行代碼是一個(gè)請(qǐng)求方式為 GET 的超鏈接;第 17~35 行代碼是一個(gè) POST 提交方式 form 表單。

2、創(chuàng)建 Servlet

在 filterDemo01 項(xiàng)目的 com.mengma.filter 包中創(chuàng)建一個(gè)名稱為 CharacterServlet 的 Servlet 類,該類用于獲取用戶輸入的請(qǐng)求參數(shù),并將參數(shù)輸出到控制臺(tái),其代碼如下所示。

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、創(chuàng)建過濾器

在 filterDemo01 項(xiàng)目的 com.mengma.filter 包中創(chuàng)建一個(gè)名稱為 CharacterFilter 的 Filter 類,該類用于攔截用戶的請(qǐng)求訪問,并實(shí)現(xiàn)全站編碼的統(tǒng)一,其具體實(shí)現(xiàn)代碼如下所示。

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;
        // 攔截所有的請(qǐng)求,解決全站中文亂碼,指定request和response的編碼
        request.setCharacterEncoding("utf-8"); // 只對(duì)消息體有效
        response.setContentType("text/html;charset=utf-8");
        // 對(duì) request 進(jìn)行包裝
        CharacterRequest characterRequest = new CharacterRequest(request);
        chain.doFilter(characterRequest,response);
    }
    public void destroy() {
    }
}
// 繼承默認(rèn)包裝類 HttpServletRequestWrapper
class CharacterRequest extends HttpServletRequestWrapper {
    private HttpServletRequest request;
    public CharacterRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }
    // 子類繼承父類一定會(huì)覆寫一些方法,此處用于重寫getParameter()方法
    public String getParameter(String name) {
        // 調(diào)用被包裝對(duì)象getParameter()方法,獲得請(qǐng)求參數(shù)
        String value = super.getParameter(name);
        if (value == null) {
            return null;
        }
        String method = super.getMethod(); // 判斷請(qǐng)求方式
        if ("get".equalsIgnoreCase(method)) {
            try {
                value = new String(value.getBytes("iso-8859-1"), "utf-8");
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }
        }
        return value; // 解決亂碼后返回結(jié)果
    }
}

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

需要注意的是,由于要攔截用戶訪問資源的所有請(qǐng)求,因此需要將 CharacterFilter 映射信息中 元素?cái)r截的路徑設(shè)置為“/*”,如下所示:

<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、運(yùn)行項(xiàng)目并查看結(jié)果

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

圖 1 運(yùn)行結(jié)果

單擊圖 1 中的【登錄】按鈕提交表單,此時(shí),MyEclipse 控制臺(tái)顯示的結(jié)果如圖 2 所示。

圖 2 控制臺(tái)窗口

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

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

全部教程
主站蜘蛛池模板: 久久精品资源 | 日韩欧美在线中文字幕 | 久久精品亚洲精品国产色婷 | 五月色婷婷琪琪综合伊人 | 精品成人免费播放国产片 | 成年女人毛片 | 精品久久久久久 | 热久久久久久 | 天天摸天天舔天天操 | 成人高清视频在线观看大全 | 国产成人久久精品麻豆二区 | 绿色视频在线看 | 视频在线一区二区三区 | 国产一区二区三区影院 | 国产成人精品男人免费 | 女性毛片 | 精品视自拍视频在线观看 | 国产免费专区 | 欧美另类精品 | 精品成人免费视频 | 亚洲精品14p | 久久98精品久久久久久婷婷 | 天天射天天操天天色 | 成熟的女性强烈交性视频 | 国产成人精品日本亚洲语言 | 久久精品亚洲牛牛影视 | 亚洲一级生活片 | 欧美特黄一级大黄录像 | 91视频播放| 欧美成人免费观看的 | 欧美成人伊人十综合色 | 国产精品99久久久久久人 | 中国精品白嫩bbwbbw | 牛牛影院免费永久地址 | 在线欧美激情 | 女十八毛片| 综合色图 | 亚洲涩涩精品专区 | 国产免费播放一区二区 | a级在线观看视频 | 国产日 |