导读简介描述:平顶山海鑫网络:JSP处理表单数据4.1表单数据概述如果你曾经使用过web搜索引擎,或者浏览过在线书店、股票价格、机票信息,或许会留意到一些古怪的url,比如“http://host/path?user=marty+hall&origin=bwi&dest=lax”最后,即第四个导致解析表单数据非常困难的原因在于,变量值既可能被省略(如“param1=val1&param2=&param3=val3”),也有可能一个变量拥有一个以上的值,即同一个变量可能出现一次以上(如“param1=val1&param2=val2&param1=val3”)threeparams.javapackageha
个人/企业网站建设:698元,联系电话:15093778828
更多网站建设 商城系统程序 定制程序开发需求请咨询在线客服!
内容太多没有时间看?快速免费咨询了解 >
4.1 表单数据概述
如果你曾经使用过web搜索引擎,或者浏览过在线书店、股票价格、机票信息,或许会留意到一些古怪的url,比如“http://host/path?user=marty+hall&origin=bwi&dest=lax”。这个url中位于问号后面的部分,即“user=marty+hall&origin=bwi&dest=lax”,就是表单数据,这是将web页面数据发送给服务器程序的最常用方法。对于get请求,表单数据附加到url的问号后面(如上例所示);对于post请求,表单数据用一个单独的行发送给服务器。
以前,从这种形式的数据提取出所需要的表单变量是cgi编程中最麻烦的事情之一。首先,get请求和post请求的数据提取方法不同:对于get请求,通常要通过query_string环境变量提取数据;对于post请求,则一般通过标准输入提取数据。第二,程序员必须负责在“&”符号处截断变量名字-变量值对,再分离出变量名字(等号左边)和变量值(等号右边)。第三,必须对变量值进行url反编码操作。因为发送数据的时候,字母和数字以原来的形式发送,但空格被转换成加号,其他字符被转换成“%xx”形式,其中xx是十六进制表示的字符ascii(或者iso latin-1)编码值。例如,如果html表单中名为“users”的域值为“~hall, ~gates, and ~mcnealy”,则实际向服务器发送的数据为“users=%7ehall%2c+%7egates%2c+and+%7emcnealy”。最后,即第四个导致解析表单数据非常困难的原因在于,变量值既可能被省略(如“param1=val1&param2=&param3=val3”),也有可能一个变量拥有一个以上的值,即同一个变量可能出现一次以上(如“param1=val1&param2=val2&param1=val3”)。
java servlet的好处之一就在于所有上述解析操作都能够自动完成。只需要简单地调用一下httpservletrequest的getparameter方法、在调用参数中提供表单变量的名字(大小写敏感)即可,而且get请求和post请求的处理方法完全相同。
getparameter方法的返回值是一个字符串,它是参数中指定的变量名字第一次出现所【更多内容请关注:河南海鑫联诚信息技术有限公司(jdtuics.hd-performance.com)】对应的值经反编码得到得字符串(可以直接使用)。如果指定的表单变量存在,但没有值,getparameter返回空字符串;如果指定的表单变量不存在,则返回null。如果表单变量可能对应多个值,可以用getparametervalues来取代getparameter。getparametervalues能够返回一个字符串数组。
最后,虽然在实际应用中servlet很可能只会用到那些已知名字的表单变量,但在调试环境中,获得完整的表单变量名字列表往往是很有用的,利用getparamerternames方法可以方便地实现这一点。getparamerternames返回的是一个enumeration,其中的每一项都可以转换为调用getparameter的字符串。
4.2 实例:读取三个表单变量
下面是一个简单的例子,它读取三个表单变量param1、param2和param3,并以html列表的形式列出它们的值。请注意,虽然在发送应答内容之前必须指定应答类型(包括内容类型、状态以及其他http头信息),但servlet对何时读取请求内容却没有什么要求。
另外,我们也可以很容易地把servlet做成既能处理get请求,也能够处理post请求,这只需要在dopost方法中调用doget方法,或者覆盖service方法(service方法调用doget、dopost、dohead等方法)。在实际编程中这是一种标准的方法,因为它只需要很少的额外工作,却能够增加客户端编码的灵活性。
如果你习惯用传统的【更多内容请关注:河南海鑫联诚信息技术有限公司(jdtuics.hd-performance.com)】cgi方法,通过标准输入读取post数据,那么在servlet中也有类似的方法,即在httpservletrequest上调用getreader或者getinputstream,但这种方法对普通的表单变量来说太麻烦。然而,如果是要上载文件,或者post数据是通过专门的客户程序而不是html表单发送,那么就要用到这种方法。
注意用第二种方法读取post数据时,不能再用getparameter来读取这些数据。
threeparams.java
package hall;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class threeparams extends httpservlet {
public void doget(httpservletrequest request,
httpservletresponse response)
throws servletexception, ioexception {
response.setcontenttype(text/html);
printwriter out = response.getwriter();
string title = 读取三个请求参数;
out.println(servletutilities.headwithtitle(title) +
<body>\n +
<h1 align=center> + title + </h1>\n +
<ul>\n +
<li>param1:
+ request.getparameter(param1) + \n +
<li>param2:
+ request.getparameter(param2) + \n +
<li>param3:
+ request.getparameter(param3) + \n +
</ul>\n +
</body></html>);
}
public void dopost(httpservletrequest request,
httpservletresponse response)
throws servletexception, ioexception {
doget(request, response);
}
}
4.3 实例:输出所有的表单数据
下面这个例子寻找表单所发送的所有变量名字,并把它们放入表格中,没有值或者有多个值的变量都突出显示。
首先,程序通过httpservletrequest的getparameternames方法得到所有的变量名字,getparameternames返回的是一个enumeration。接下来,程序用【更多内容请关注:河南海鑫联诚信息技术有限公司(jdtuics.hd-performance.com)】循环遍历这个enumeration,通过hasmoreelements确定何时结束循环,利用nextelement得到enumeration中的各个项。由于nextelement返回的是一个object,程序把它转换成字符串后再用这个字符串来调用getparametervalues。
getparametervalues返回一个字符串数组,如果这个数组只有一个元素且等于空字符串,说明这个表单变量没有值,servlet以斜体形式输出“no value”;如果数组元素个数大于1,说明这个表单变量有多个值,servlet以html列表形式输出这些值;其他情况下servlet直接把变量值放入表格。
showparameters.java
注意,showparameters.java用到了前面介绍过的servletutilities.java。
package hall;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class showparameters extends httpservlet {
public void doget(httpservletrequest request,
httpservletresponse response)
throws servletexception, ioexception {
response.setcontenttype(text/html);
printwriter out = response.getwriter();
string title = 读取所有请求参数;
out.println(servletutilities.headwithtitle(title) +
<body bgcolor=\#fdf5e6\>\n +
<h1 align=center> + title + </h1>\n +
<table border=1 align=center>\n +
<tr bgcolor=\#ffad00\>\n +
<th>参数名字<th>参数值);
enumeration paramnames = request.getparameternames();
while(paramnames.hasmoreelements()) {
string paramname = (string)paramnames.nextelement();
out.println(<tr><td> + paramname + \n<td>);
string[] paramvalues = request.getparametervalues(paramname);
if (paramvalues.length == 1) {
string paramvalue = paramvalues[0];
if (paramvalue.length() == 0)
out.print(<i>no value</i>);
else
out.print(paramvalue);
} else {
out.println(<ul>);
for(int i=0; i<paramvalues.length; i++) {
out.println(<li> + paramvalues[i]);
}
out.println(</ul>);
}
}
out.println(</table>\n</body></html>);
}
public void dopost(httpservletrequest request,
httpservletresponse response)
throws servletexception, ioexception {
doget(request, response);
}
}
测试表单
下面是向上述servlet发送数据的表单postform.html。就像所有包含密码输入域的表单一样,该【更多内容请关注:河南海鑫联诚信息技术有限公司(jdtuics.hd-performance.com)】表单用post方法发送数据。我们可以看到,在servlet中同时实现doget和dopost这两种方法为表单制作带来了方便。
<!doctype html public -//w3c//dtd html 4.0 transitional//en>
<html>
<head>
<title>示例表单</title>
</head>
<body bgcolor=#fdf5e6>
<h1 align=center>用post方法发送数据的表单</h1>
<form action=/servlet/hall.showparameters
method=post>
item number:
<input type=text name=itemnum><br>
quantity:
<input type=text name=quantity><br>
price each:
<input type=text name=price value=><br>
<hr>
first name:
<input type=text name=firstname><br>
last name:
<input type=text name=lastname><br>
middle initial:
<input type=text name=initial><br>
shipping address:
<textarea name=address rows=3 cols=40></textarea><br>
credit card:<br>
<input type=radio name=cardtype
value=visa>visa<br>
<input type=radio name=cardtype
value=master card>master card<br>
<input type=radio name=cardtype
value=amex>american express<br>
<input type=radio name=cardtype
value=discover>discover<br>
<input type=radio name=cardtype
value=java smartcard>java smartcard<br>
credit card number:
<input type=password name=cardnum><br>
repeat credit card number:
<input type=password name=cardnum><br><br>
<center>
<input type=submit value=submit order>
</center>
</form>
</body>
</html>
本文出自:平顶山海鑫网络
看完还有疑惑?专属客服在线为您解答!
个人/企业网站建设:698元,联系电话:15093778828
更多网站建设 商城系统程序 定制程序开发需求请咨询在线客服!
本文地址:http://jdtuics.hd-performance.com/public_info/info/459
转载请注明来自:http://jdtuics.hd-performance.com/public_info/info/459
关键词标签:表单namebrservletinputtype
推荐你喜欢的内容
发送后我们会尽快联系您!
18年行业经验,10万用户的选择
感谢留言 我们会尽快与您联系 关闭 150 9377 8828 发送 在线咨询欢迎您!
点击按钮接通人工客服!
15093778828