JAvawebはリクエストに対応する文字化けしの問題を解決する

3901 ワード

Javawebの勉强の过程の中でソフトウェアの设计者はすべて外国人なため、彼らの支持するコードはすべてISO 8859-1私达の中国人にとって中国语でなければならなくて、だから私达の一般的な使うコードはutf-8あるいはGBKで、しかし开発のツールはすべてISO 8859-1で符号化して、私达はutf-8で復号すると文字化けが発生します.
応答文字化けを解決するのは一般的によく解決されています.次のコードを追加するだけでいいです.
response.setContentType("text/html;charset=utf-8");

しかし、要求された文字化けしの解決は、要求された方法によって文字化けしの解決方法が異なり、一般的にPOSTとGETの2つの方法が一般的である.POST方式については以下のコードを使用すれば解決できます.
request.setCharacterEncoding("utf-8");

しかし、get方式のリクエスト方式の上のコードでは解決できません.getの解決策はiso 8859-1の符号化を逆符号化し、utf-8で復号すれば解決できます.
str=new String(str.getByte("iso8859-1"),"utf-8");

したがって、servletのdoGetメソッドでは、文字化けしの問題(POSTコミット方式)を解決することができる.
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
	}
しかし、ここではservletを作成するたびにこのようなコードを追加する必要があり、POSTコミットかGETコミットかを知る必要があります.これは煩雑で、この問題を解決するにはweb開発におけるもう一つの重要な知識点であるフィルタを使用する必要があります.
Filterはサーブレット技術の中で最も実用的な技術であり、WEB開発者はFilter技術を通じてwebサーバを管理している.
すべて
web
リソース:たとえば
Jsp
, Servlet,
静的ピクチャファイルまたは静的
html
ファイル等で行う
ブロックして、いくつかの特殊な機能を実現します.例えば、URLレベルのアクセス制御、機密語彙のフィルタリング、応答情報の圧縮などの高度な機能を実現します.
Filterを開発するには2つのステップがあります.
一、クラスを書いて特定のインタフェースFilterを実現する.
二、webで.xmlファイルにこのFilterを登録します.
	
		 
		EncodingFilter
		com.ruijie.filter.EncodingFilter
		
			encode
			utf-8
		
	
	
		EncodingFilter
		/*
	

実装されたクラスで乱符号化が処理され、すべてのリソースがアクセスされると、このフィルタによってフィルタリングされ、乱符号化を解決する目的を達成する.
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		response.setContentType("text/html;charset="+encode); // 
		chain.doFilter(new MyHttpServletRequest((HttpServletRequest) request), response);
	}

前述したように、乱符号化を解決する過程でget方式がコミットされる方法は主に解決する必要があり、パラメータを取得する過程で通常以下の3つの方法で取得される.
	getParameterMap()
	getParameterValues(String name)
	getParameter(String name)

だから問題はこの3つの方法の文字化け問題を解決することに移行してget方式の文字化け問題を解決することができます.解決策はサーブレットRequestをMyHttpサーブレットRequestに改造することであり、2つの方法で改造することができる.1つは装飾モードであり、1つは動的エージェントである.HttpServeretRequestWrapperが提供されているので、ここでは装飾者モードを使うと便利です
	class MyHttpServletRequest extends HttpServletRequestWrapper{
		private HttpServletRequest request = null;
		private boolean isNotEncode = true;
		public MyHttpServletRequest(HttpServletRequest request) {
			super(request);
			this.request = request;
		}
		
		@Override
		public Map getParameterMap() {
			try{
				if(request.getMethod().equalsIgnoreCase("POST")){//-- post 
					request.setCharacterEncoding(encode);
					return request.getParameterMap();
				}else if(request.getMethod().equalsIgnoreCase("GET")){//-- get 
					Map map = request.getParameterMap();
					if(isNotEncode){// 
						for(Map.Entry entry : map.entrySet()){
							String [] vs = entry.getValue();
							for(int i=0;i

クリックしてソースをダウンロード