这个是网页编程中一个很简单、最基本的问题,但是,这个看似简单的问题来Jsp到中,往往有人在传值取值的过程中做不好,不能正确地传递中文,然后从网上寻找一大堆代码生搬硬套地放进自己的工程,最后终于搞出来,不明觉厉就过去了,更有甚者在网上找来代码还弄不好。这也难怪的,Jsp的网页与网页之间传值取值,不像Asp与PHP无论是Post或者Get,通通都是一句相同代码了事,也基本没有乱码问题。Asp是Request.Form(),PHP则是$_REQUEST[""]。主要是Asp与PHP封装好了一大堆乱码处理方法,这是它们优秀的地方。那么Jsp中到底如何才能做到正确传递表单信息,没有乱码问题呢?
一、基本目标
在一个网页中有两个表单,一个使用到Post方法传值,一个使用Get方法传值。即使传递的是中文,也能够丝毫不差地传递到目标页。
Post方法与Get方法的区别,大家都见到了,Post方法传递的参数不会在网页地址栏显示,具有一定的安全性,但是它传递的东西封装在网络层,速度较慢,而Get方法则会把传递的参数显示在网页地址栏,但是它传递的东西封装在应用层,速度较快。所以,应该因地制宜地选择表弟参数传递方法。
二、制作过程
1、网络工程结构如下图,除了Jsp工程中应该有的文件与文件夹以外,就三个页面:
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>
<form method="post" action="post.jsp">
<input type="text" name="name" />
<input type="checkbox" name="checkbox" value="一" />一
<input type="checkbox" name="checkbox" value="二" />二
<input type="submit" value="post" />
</form>
<form method="get" action="get.jsp">
<input type="text" name="name" />
<input type="checkbox" name="checkbox" value="一" />一
<input type="checkbox" name="checkbox" value="二" />二
<input type="submit" value="get" />
</form>
</body>
</html>
这里只用单行文本框与复选框做例子。因为除了复选框以外,什么单选框、下拉列表、多行文本框的传值取值都与单行文本框相同。
从上面的代码可以清晰地看到,一个表单用post方法传递到post.jsp,另一个表单用get方法传递到get.jsp。
Jsp对于Post方法传值的处理与Get方法的处理是不同的。具体怎么处理,如下所示。
这里顺便说一句,在本表单中的任何组件都不能加上disabled="disabled",如果加了,该表单与不再生成请求参数,也就是无法把这个组件的值通过post或者get传递,总是你看到里面存在值,但没有用。
2、post.jsp的代码如下,也就是post方法的取值。
<%@ 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>post</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String name=request.getParameter("name");
String[] checkbox=request.getParameterValues("checkbox");
out.println("name:"+name);
out.print("checkbox:");
for(String s:checkbox){
out.print(s+" ");
}
out.println();
%>
</body>
</html>
对于post方法传递过来的值,必须使用request.setCharacterEncoding("utf-8");先声明之后的值将会以utf-8处理,甭管你在开头写了多少个utf-8以用来说明我这一页是utf-8编码。如果你不加就不然乱码。这句在本post方法取值处理页单独一页即可,不用想一些网站所说的那样,还要在传值页,也就是form.jsp再画蛇添足地加一句jsp代码来编码,这样反而越整越乱。其余单选框、下拉列表、多行文本框的传值取值都与单行文本框一样用request.getParameter("xx");来正常取值即可。复选框由于在form.jsp被编制了同一个name,所以必须把传过来的东西,用一个数组接住,再对这个数组进行输出,这里用到了JDK1.5新型的遍历方法,此前我已经在《【Java】用JDK1.5之后的新型数组遍历方法遍历HashMap、HashMap不应该存储多元组》(
点击打开链接)介绍过。
3、get.jsp的代码如下,也就是get方法的取值:
<%@ 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>get</title>
</head>
<body>
<%
String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8");
String[] checkbox=request.getParameterValues("checkbox");
out.println("name:"+name);
out.print("checkbox:");
for(String s:checkbox){
s=new String(s.getBytes("ISO-8859-1"),"utf-8");
out.print(s+" ");
}
out.println();
%>
</body>
</html>
这里无须使用request.setCharacterEncoding("utf-8");来解码,即使你这样解码也得不到正常的值,同样是不管在页面头声明了多少个utf-8,你还是对传递过来的值进行处理。你首先要把地址栏的值使用request.getParameter("xx")方法取过来,再把它改成一种网页原始编码ISO-8859-1,最后转化为utf-8就正常了。
ISO-8859-1如果大家有留意的话,它是Eclipse for JavaEE新建网页的Jsp File模板的默认编码。
最后得到的值大家该怎么玩就怎么玩了。
那么这种get方法的取值处理能否用于post呢?答案是可以的,也就是说get与post的取值处理,你都可以用3的代码处理。不过一般程序猿对于post的处理,都使用2的代码。好像有一个效率比较高的理由在里面。