【Filter】利用過濾器Filter解決post傳遞的編碼問題與利用EL表示式簡化引數傳遞
阿新 • • 發佈:2019-01-09
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容器內某一項的值。