一、 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的一个配置文件。

添加/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" 
    
  />

在/>之前添加属性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" 
    
  />