1. 程式人生 > >【Filter】利用過濾器Filter解決post傳遞的編碼問題與利用EL表示式簡化引數傳遞

【Filter】利用過濾器Filter解決post傳遞的編碼問題與利用EL表示式簡化引數傳遞

post傳遞的編碼問題,解決的方式有兩種,一種是修改Tomcat的配置檔案,這種方式是我反對的,因為你並不能保證自己的工程在任意一個Tomcat都能跑,當然如果以後出現什麼情況,處理修改Tomcat配置檔案,沒有別的的話,那麼才修改也不遲,另一種是在頁面取值之前使用:

request.setCharacterEncoding("utf-8");  
本來這樣沒什麼的,不就一行程式碼嗎?但是在現在JSP程式設計不停強調頁面絕對不能出現後端程式碼的趨勢下,不能使用《【Jsp】使用Post與Get正確傳遞表單資訊與亂碼問題》(點選開啟連結)的方式去取值,你必須使用更加強大的技術。下面舉例子說明如果利用利用過濾器Filter解決post傳遞的編碼問題與利用EL表示式簡化引數傳遞。

一、基本目標

還是一個基礎得不能再基礎的頁面,不會就不要跟別人說自己學過伺服器網頁程式設計,

如下所示,設定一個過濾器,保證post傳遞是正常的,但是get方法只能保持英文傳遞是正常,做到這裡就不要有強迫症了,畢竟一般不用get傳遞重要資訊,都是一些數字、英文之類,配合翻頁這樣的小功能。


二、基本準備

網路目錄結構圖如下所示,還是放入servlet的jar包,


為了避免在頁面使用JSP程式碼,使用過濾器Filter,也不用每次取值都要:

request.getParameter("xx");

所以寫一個encodingFilter.java設定所有頁面的都要經過這個java,相當於網站的巨集彙編的作用,在web.xml檔案中設定過濾器,不明白過濾器者,可以參考我此前寫的《【Filter】攔截器Filter》(

點選開啟連結

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>encodingFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>
三、製作過程

1、過濾器的程式碼如下:

import java.io.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class encodingFilter implements Filter {

	// config變數也不是必須的,建構函式與解構函式可以為空
	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	// 相當於在每個網址執行之前,都要經過這個方法的所有程式碼,直到讀到chain.doFilter(request, response);為止
	// 所以再也不用擔心用post傳遞的編碼問題了
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf-8");
		chain.doFilter(request, response);
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub

	}

}

2、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>form</title>
</head>
<body>
	post:
	<form method="post" action="ExpressionGetPost.jsp">
		name:<input type="text" name="name" /><br />
		password:<input type="password" name="password"/><br />
		sex:<input type="radio" name=sex value="男" />男<input type="radio" name=sex value="女" />女<br />   
		checkbox:<input type="checkbox" name="checkbox" value="一" />一<input type="checkbox" name="checkbox" value="二" />二<br /> 
		<input type="submit" value="post" />
	</form>
	<br /> 
	get:
	<form method="get" action="ExpressionGetPost.jsp">
		name:<input type="text" id="name" name="name" /><br /> 
		<input type="checkbox" name="checkbox" value="one" />一<input type="checkbox" name="checkbox" value="two" />二
		<input type="submit" value="get" />
	</form>
</body>
</html>

3、ExpressionGetPost.jsp可以利用EL表示式簡化引數傳遞,EL的中文名字就是表示式語言,EL表示式必須在JSP2.2的版本使用,但請注意到我們的web.xml裡面的version值寫著等於2.5,所以你可以毫無顧忌的使用,告別:
request.getParameter("xx");
同時能夠像php類似一句${}就完事。但請注意到取複選框與取其他東西的方式不同,複選框傳遞過來的東西是一個數組。其他東西只是一個普通的值。
<%@ 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>index</title>
</head>
<body>
	<!-- 裡面可以是表示式 -->
	${1+3}<br />
	<%-- 可以這樣去到當前的ip地址 -->
	ip地址:${header.host}<br />
	<%-- param.xx,xx為引數名就能夠取到相應的引數值 -->
	<%-- 如果複選框第X個值被選中,可以利用${paramValues.checkbox[x]}取到,當然還可以給複選框不同的選項設定不同的名字 --%>
	傳遞過來的值:name=${param.name},password=${param.password},sex=${param.sex},checkbox=${paramValues.checkbox[0]},${paramValues.checkbox[1]},<br />
</body>
</html>
EL表示式還能有以下的取值方式:


不過注意,el表示式僅能用來取值,不可以像php還能設定session容器內某一項的值。