IT兄弟連 JavaWeb教程 過濾器3

過濾器案例:字符編碼過濾器html

在JavaWeb程序開發中,因爲Web容器內部所使用編碼格式並不支持中文字符集,因此,處理瀏覽器請求中的中文數據就會出現亂碼現象。java

6fb06ba3acb54a0a94adecf884784aad.png

圖3  無字符編碼過濾器web

 

從上圖能夠看出,因爲Web容器使用了ISO-8859-1編碼格式,因此在Web應用的業務處理中也會使用ISO-8859-1的編碼格式,雖然瀏覽器提交的請求使用的是中文編碼格式UTF-8,但通過業務處理中的ISO-8859-1編碼,仍然會出現中文亂碼現象。解決此問題的方法很是簡單,在業務處理中從新制定中文字符集進行編碼便可。在實際開發過程當中,若是經過每個業務處理指定中文字符集編碼,則操做過於繁瑣,並且容易遺漏某一個業務中的字符編碼設置;若是經過過濾器來處理字符編碼,就能夠作到簡單又萬無一失,如圖4所示。瀏覽器

a52a29e13b1c462aab7485bab5e50c80.png

圖4  使用字符編碼過濾器app

 

在Web應用中部署了字符編碼過濾器之後,即便Web容器的編碼格式不支持中文,但瀏覽器的每一次請求都會通過過濾器進行轉碼,因此,,能夠徹底避免中文亂碼的產生。jsp

下面的案例實現圖書信息的添加功能,並建立字符編碼過濾器,避免中文亂碼現象的產生。ide

●  建立字符編碼過濾器對象,其名稱爲CharactorFilter類。該類實現了javax.servlet.Filter接口,並在doFilter()方法中對請求中的字符編碼格式進行設置。代碼以下:post

package com.xdl.filter;編碼

import javax.servlet.*;url

import java.io.IOException;

public class CharactorFilter implements Filter {

private String encoding = null;

@Override

    public void init(FilterConfig filterConfig) throws ServletException {

        encoding = filterConfig.getInitParameter("encoding");

    }

    @Override

    public void doFilter(ServletRequest request, ServletResponse response,

           FilterChain chain) throws IOException, ServletException {

        if(encoding != null){

            request.setCharacterEncoding("UTF-8");

            response.setContentType("text/html;charset=utf-8");

        }

        chain.doFilter(request,response);

    }

    @Override

    public void destroy() {

        encoding = null;

    }

}

CharactorFilter類是實例中的字符編碼過濾器,它主要經過在doFilter()方法中,指定request與response兩個參數的字符集encoding進行編碼處理,使得目標資源的字符集支持中文。其中,encoding是CharactorFilter類定義的字符編碼格式成員變量,該變量在過濾器的初始化方法init()中被賦值,它的值是經過FilterConfig對象讀取配置文件中的初始化參數獲取的。

在建立了過濾器對象以後,還須要對過濾器進行必定的配置才能夠正常使用。過濾器CharactorFilter的配置代碼以下:

<filter>

    <filter-name>CharactorFilter<.filter-name>

    <filter-class>com.xdl.filter.CharactorFilter</filter-class>

    <init-param>

        <param-name>encoding</param-name>

        <param-value>UTF-8</param-value>

    </init-param>

</filter>

<filter-mapping>

    <filter-name>CharactorFilter</filter-name>

    <url-pattern>/*</url-pattern>

<filter-mapping>

●  建立名稱爲AddServlet的類,該類繼承HttpServlet,是處理添加圖書信息請求的Servlet對象,代碼以下:

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.io.PrintWriter;

public class AddServlet extends HttpServlet {

    @Override

    protected void service(HttpServletRequest request,

          HttpServletResponse response) throws ServletException, IOException {

        PrintWriter out = response.getWriter();

        String id = request.getParameter("id");

        String name = request.getParameter("name");

        String author = request.getParameter("author");

        String price = request.getParameter("price");

        out.print("<h2>圖書信息添加成功</h2><hr>");

        out.print("圖書編號:" + id + "<br>");

        out.print("圖書名稱:" + name + "<br>");

        out.print("圖書做者:" + author + "<br>");

        out.print("圖書價格:" + price + "<br>");

        out.flush();

        out.close();

    }

}

AddServlet的類主要經過service()方法實現添加圖書信息請求的處理,其處理方法是將獲取的圖書信息數據直接輸出到頁面中。

在編寫了Servlet類後,還須要在web.xml文件中對Servlet進行配置,其配置代碼以下:

<servlet>

        <servlet-name>AddServlet</servlet-name>

        <servlet-class>com.xdl.servlet.AddServlet</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>AddServlet</servlet-name>

        <url-pattern>/AddServlet</url-pattern>

    </servlet-mapping>

●  建立名稱爲index.jsp的頁面,它是程序中的主頁,該頁面主要用於放置添加圖書信息的表單,其代碼以下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<head>

    <title>添加圖書信息</title>

</head>

<body>

<h1>添加圖書信息</h1>

<form action="/AddServlet" method="post">

    圖書編號:<input type="text" name="id"><br>

    圖書名稱:<input type="text" name="name"><br>

    圖書做者:<input type="text" name="author"><br>

    圖書價格:<input type="text" name="price"><br>

    <input type="submit" value="提交">

    </form>

    </body>

</html>

編寫完成index.jsp頁面後,便可部署發佈程序,實例運行後,將打開index.jsp頁面,如圖5所示。

ed3a0b069a244e969d299a921fc2d597.png

圖5  index.jsp

 

添加正確的圖書信息後,單擊提交按鈕,其效果如圖6所示。

40ef0cc123eb432c91b8bf189550759b.png

圖6  AddServlet生成的HTML頁面

相關文章
相關標籤/搜索