您的位置:首页 > 其它

黑马day04 表单请求参数&中文乱码分析

2015-06-18 14:12 399 查看
实验:

1.获取post以及get请求方式的参数

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>param.html</title>
	
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
<body>
<h1>POST提交</h1><hr/>
   <form action="/day04/servlet/ParamServlet" method="post">
   		姓名:<input name="username" type="text"/><br/>
   		地址:<input name="address" type="text"/><br/>
   		<input type="submit" value="提交"/><br/>
   </form>
<h1>GET提交</h1><hr/>
   <form action="/day04/servlet/ParamServlet" method="post">
   		姓名:<input name="username" type="text"/><br/>
   		地址:<input name="address" type="text"/><br/>
   		<input type="submit" value="提交"/><br/>
   </form>
</body>
</html>
运行界面:



2.然后填写表单会转到ParamServlet...

package cn.itheima.request;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ParamServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获取param.html的请求参数
		Enumeration enumeration = request.getParameterNames();
		while(enumeration.hasMoreElements()){
			String name = (String) enumeration.nextElement();
			String value = request.getParameter(name);
			System.out.println(name+":"+value);
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}


我们采用英文不会出现乱码...

4.接下来我使用中文对Post方式:



控制台结果:



5.分析post方式乱码的原因:

当填写post表单的时候,那个html的头<meta http-equiv="content-type" content="text/html; charset=UTF-8">这行会使用utf-8对参数进行编码....然后传送到ParamServlet..

服务器会使用默认的编码即老外喜欢的iso8859-1进行解码...因此编码和解码不一致,造成乱码...

6.post方式的解决方式:

告知服务器使用utf-8进行解码...

request.setCharacterEncoding("utf-8");

package cn.itheima.request;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ParamServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		//获取param.html的请求参数
		Enumeration enumeration = request.getParameterNames();
		while(enumeration.hasMoreElements()){
			String name = (String) enumeration.nextElement();
			String value = request.getParameter(name);
			System.out.println(name+":"+value);
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
此时我在访问...结果是:、


乱码解决

7.get方式提交:同样的道理也会乱码...

但是使用request.setCharacterEncoding("utf-8");发现没有起任何作用.这是因为这句话的意思是告诉服务器对请求参数的实体内容进行解码,但是对于get方式,是在路径后直接?形式的。因此这种方式不可用。

8.解决方式:

package cn.itheima.request;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ParamServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
//		request.setCharacterEncoding("utf-8");
		//我们采用的是逆向将iso8859-1进行逆向
		//对于get提交只能手动解决请求参数中的乱码
		String username = request.getParameter("username");
		//虽然服务器使用了iso8850-1进行了解码,然后我么逆向边边编码,然后转化为utf-8进行解码
		username = new String(username.getBytes("iso8859-1"),"utf-8");
		System.out.println(username);
		//获取param.html的请求参数
//		Enumeration enumeration = request.getParameterNames();
//		while(enumeration.hasMoreElements()){
//			String name = (String) enumeration.nextElement();
//			String value = request.getParameter(name);
//			System.out.println(name+":"+value);
//		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
9.get方式的运行结果:





10.总结:

获取请求参数

getParameter(name) --- String 通过name获得值

getParameterValues(name) --- String[ ] 通过name获得多值 checkbox

getParameterNames --- Enumeration<String> 获得所有请求参数名称组成的枚举

getParameterMap --- Map<String,String[ ]> 获取所有请求参数的组成的Map集合,注意,其中的键为String,值为String[]

获取请求参数时乱码问题:

浏览器发送的请求参数使用什么编码呢?当初浏览器打开网页时使用什么编码,发送就用什么编码。

服务器端获取到发过来的请求参数默认使用ISO8859-1进行解码操作,中文一定有乱码问题

对于Post方式提交的数据,可以设置request.setCharacterEncoding("gb2312");来明确指定获取请求参数时使用编码。但是此种方式只对Post方式提交有效。

对于Get方式提交的数据,就只能手动解决乱码:String newName = new String(name.getBytes("ISO8859-1"),"gb2312");此种方法对Post方式同样有效。

在tomcat的server.xml中可以配置http连接器的URIEncoding可以指定服务器在获取请求参数时默认使用的编码,从而一劳永逸的决绝获取请求参数时的乱码问题。也可以指定useBodyEncodingForURI参数,令request.setCharacterEncoding也对GET方式的请求起作用,但是这俩属性都不推荐使用,因为发布环境往往不允许修改此属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: