一、 HttpServlet读取html中form的参数
1、html中form参数提交的两种方式
html中form提交参数一般通过post和get这两种方法,其中get提交参数的方法对应于HttpServlet的doGet方法,而post提交参数的方法对应于HttpServlet的doPost方法。
get方法提交参数的话会在url上显示,假如我们有的数据不想让别人看到(如密码等)则我们不应该让form通过get方法提交(如果我们的html中form的method属性不显示制定的话,默认值为get)。
post方法提交的参数不会在url上显示。
2、 HttpServlet中如何读取form中的参数
对于HttpServlet中读取html form中传递过来的参数是一件很简单的事情,可以不必关心,form的提交方式为get或者post(有的情况下还是稍微有一点不同的,比如servlet和jsp中常见的一个问题:中文乱码的问题,有的form使用post提交到servlet后,中文的参数值可以正常显示,但是如果换成get提交的话,中文可能出现乱码)。我们都可以通过HttpServletRequest接口的String getParameter(String name)和String[] getParameterValues(String name)这两个方法来读取参数的值。
String getParameter(String name)
name为参数名,返回的结果是参数的值。如果一个参数有很多个值得话,这里只返回一个。如果参数名存在,但是对应的值没有的话,返回值为””(也就是一个空字符串)。假如参数名本身不存在的话,返回值为null。需要注意的是这里对参数名的大小写是敏感的,也就是说html的form中参数名如果为Name的话,使用getParameter(“name”)是取不到对应的值的。
String[] getParameterValues(String name)
当使用这个方法时,一般是name这个参数名可能存在多个参数值,它将返回一个由参数值组成的数组。举一个简单的例子,注册一个网站的时候,当需要客户的兴趣爱好资料的时候,一般会给出一个多选框(假设参数名为habit),让用户自己选择。当然每个人的爱好不同,每个人爱好的个数可能是0-N个(让我们先假设一个人可以没有任何爱好),那么我们的HttpServlet读取form的habit的时候,显然应该使用String[] getParameterValues(String name)而不是String getParameter(String name),如果客户有一个到多个爱好时,我们会得到一个表示他爱好的String[]。但是假如我们的客户没有任何爱好的话。。。这个时候的返回值可能是null。所以我们在处理的时候需要先判断返回值是否为null(这个真是一个不友好的做法,友好的做法是返回一个0个元素的String[],很遗憾目前Servlet的API没有这么规定),加入我们不对返回值进行判断而直接开始对String[]做迭代的话,我们会得到一个java.lang.NullPointerException。当然当name的参数名不存在的时候,返回值显然为null。同样String[] getParameterValues(String name)对name的值得大小写也一样是敏感的。
读取form表单参数还可以使用Map getParameterMap()方法,这里不多做介绍。
加入对form表单可能提交上来的参数名不是很明确的话,可以考虑使用Enumeration getParameterNames()方法来获取form表单的参数名。form提交的所有参数名将存放于一个java.util.Enumeration对象中(对Enumeration对象的迭代方法不做介绍)。
最后还是以一个例子来结束HttpServlet读取html中form的参数的介绍。
在这之前为了避免万恶的汉字乱码的问题,让我们先修改tomcat的一个配置文件。
添加<tomcat install dir>/conf/server.xml中的Connector结构的属性
<!--
Define a non-SSL HTTP/1.1 Connector on port 8080
-->
< Connector port ="8080" maxHttpHeaderSize ="8192"
maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"
enableLookups ="false" redirectPort ="8443" acceptCount ="100"
connectionTimeout ="20000" disableUploadTimeout ="true" />
< Connector port ="8080" maxHttpHeaderSize ="8192"
maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"
enableLookups ="false" redirectPort ="8443" acceptCount ="100"
connectionTimeout ="20000" disableUploadTimeout ="true" />
在/>之前添加属性useBodyEncodingForURI="true",修改后如下:
<!--
Define a non-SSL HTTP/1.1 Connector on port 8080
-->
< Connector port ="8080" maxHttpHeaderSize ="8192"
maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"
enableLookups ="false" redirectPort ="8443" acceptCount ="100"
connectionTimeout ="20000" disableUploadTimeout ="true" useBodyEncodingForURI ="true" />
< Connector port ="8080" maxHttpHeaderSize ="8192"
maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"
enableLookups ="false" redirectPort ="8443" acceptCount ="100"
connectionTimeout ="20000" disableUploadTimeout ="true" useBodyEncodingForURI ="true" />
提交form用的html页面,param.html:
<!
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
>
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< META http-equiv ="Content-Type" content ="text/html; charset=GBK" />
< script type ="text/javascript" > ...
function changemethod()
...{
var a = document.getElementsByName("methodtype");
for(i = 0; i < a.length; i++)
...{
if(a[i].checked==true)
...{
fm.method=a[i].value;
break;
}
}
}
</ script >
< title > parameter.html </ title >
</ head >
< body bgcolor ="#FDF5E6" >
< h2 > 参数传递示范 </ h2 >
< form name ="fm" method ="get" action ="ShowParameter" >
< p > 姓名: < input type ="text" name ="username" size ="15" /> </ p >
< p > 密码: < input type ="password" name ="password" size ="15" /> </ p >
< p > 性别: < input type ="radio" name ="sex" value ="Male" checked /> 男
< input type ="radio" name ="sex" value ="Female" /> 女 </ p >
< p > 年龄:
< select name ="old" >
< option value ="10" > 10 - 20 </ option >
< option value ="20" selected > 20 - 30 </ option >
< option value ="30" > 30 - 40 </ option >
< option value ="40" > 40 - 50 </ option >
</ select >
</ p >
< p > 兴趣:
< input type ="checkbox" name ="habit" value ="Reading" /> 看书
< input type ="checkbox" name ="habit" value ="Game" /> 玩游戏
< input type ="checkbox" name ="habit" value ="Travel" /> 旅游
< input type ="checkbox" name ="habit" value ="Music" /> 听音乐
< input type ="checkbox" name ="habit" value ="Tv" /> 看电视
</ p >
< p > 提交方式:
< input name ="methodtype" value ="get" type ="radio" onclick ="changemethod()" checked />
Get
< input name ="methodtype" value ="post" type ="radio" onclick ="changemethod()" />
Post
</ p >
< p >
< input value ="确认" type ="submit" />
< input value ="清除" type ="reset" />
</ p >
</ form >
</ body >
</ html >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< META http-equiv ="Content-Type" content ="text/html; charset=GBK" />
< script type ="text/javascript" > ...
function changemethod()
...{
var a = document.getElementsByName("methodtype");
for(i = 0; i < a.length; i++)
...{
if(a[i].checked==true)
...{
fm.method=a[i].value;
break;
}
}
}
</ script >
< title > parameter.html </ title >
</ head >
< body bgcolor ="#FDF5E6" >
< h2 > 参数传递示范 </ h2 >
< form name ="fm" method ="get" action ="ShowParameter" >
< p > 姓名: < input type ="text" name ="username" size ="15" /> </ p >
< p > 密码: < input type ="password" name ="password" size ="15" /> </ p >
< p > 性别: < input type ="radio" name ="sex" value ="Male" checked /> 男
< input type ="radio" name ="sex" value ="Female" /> 女 </ p >
< p > 年龄:
< select name ="old" >
< option value ="10" > 10 - 20 </ option >
< option value ="20" selected > 20 - 30 </ option >
< option value ="30" > 30 - 40 </ option >
< option value ="40" > 40 - 50 </ option >
</ select >
</ p >
< p > 兴趣:
< input type ="checkbox" name ="habit" value ="Reading" /> 看书
< input type ="checkbox" name ="habit" value ="Game" /> 玩游戏
< input type ="checkbox" name ="habit" value ="Travel" /> 旅游
< input type ="checkbox" name ="habit" value ="Music" /> 听音乐
< input type ="checkbox" name ="habit" value ="Tv" /> 看电视
</ p >
< p > 提交方式:
< input name ="methodtype" value ="get" type ="radio" onclick ="changemethod()" checked />
Get
< input name ="methodtype" value ="post" type ="radio" onclick ="changemethod()" />
Post
</ p >
< p >
< input value ="确认" type ="submit" />
< input value ="清除" type ="reset" />
</ p >
</ form >
</ body >
</ html >
在这个html页面中写了一个写了一个简单的javascript函数,其实现的功能是当用户选择提交方式为get时,采用get方式提交;当选择为post时,采用post方式提交。请注意采用不同方式提交时URL的变化。
我们的HttpServlet来了:
package
squall.servlet.basic;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ShowParameter extends HttpServlet
... {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
...{
System.out.println("doGet invoke!");
showParam( req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
...{
System.out.println("doPost invoke!");
showParam( req, resp);
}
private void showParam(HttpServletRequest req, HttpServletResponse resp) throws IOException
...{
req.setCharacterEncoding("GBK");
resp.setContentType("text/html; charset=GBK");
PrintWriter out = resp.getWriter();
String docType = "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";
String name = req.getParameter("username");
String password = req.getParameter("password");
String sex = req.getParameter("sex");
String old = req.getParameter("old");
String habit[] = req.getParameterValues("habit");
String unknow = req.getParameter("unknow");
out.println(docType + "<HTML> " + "<HEAD><TITLE> showparam"
+ "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "
+" 姓名:" + name + " </br>"
+" 密码:" + password + " </br>"
+" 性别:" + sex + " </br>"
+" 年龄:" + old + " </br>"
+" 兴趣:"
);
if(habit == null)
out.println(habit);
if(habit != null)
for(int i = 0; i < habit.length; ++i)
out.println(habit[i] + " ");
out.println("</br>");
out.println(" 未知:" + unknow + " </br>");
out.println(" 提交方式:" + req.getParameter("methodtype") + " </br>");
out.println("</body></html>");
}
}
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ShowParameter extends HttpServlet
... {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
...{
System.out.println("doGet invoke!");
showParam( req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
...{
System.out.println("doPost invoke!");
showParam( req, resp);
}
private void showParam(HttpServletRequest req, HttpServletResponse resp) throws IOException
...{
req.setCharacterEncoding("GBK");
resp.setContentType("text/html; charset=GBK");
PrintWriter out = resp.getWriter();
String docType = "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";
String name = req.getParameter("username");
String password = req.getParameter("password");
String sex = req.getParameter("sex");
String old = req.getParameter("old");
String habit[] = req.getParameterValues("habit");
String unknow = req.getParameter("unknow");
out.println(docType + "<HTML> " + "<HEAD><TITLE> showparam"
+ "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "
+" 姓名:" + name + " </br>"
+" 密码:" + password + " </br>"
+" 性别:" + sex + " </br>"
+" 年龄:" + old + " </br>"
+" 兴趣:"
);
if(habit == null)
out.println(habit);
if(habit != null)
for(int i = 0; i < habit.length; ++i)
out.println(habit[i] + " ");
out.println("</br>");
out.println(" 未知:" + unknow + " </br>");
out.println(" 提交方式:" + req.getParameter("methodtype") + " </br>");
out.println("</body></html>");
}
}