平顶山海鑫网络:JSP处理表单数据

河南海鑫联诚信息技术有限公司 阅读 2024-12-21 10:35:28

导读简介描述:平顶山海鑫网络: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方法的返回值是一个字符串,它是参数中指定的变量名字第一次出现所【更多内容请关注:河南海鑫联诚信息技术有限公司(m.heinzperformance-asia.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等方法)。在实际编程中这是一种标准的方法,因为它只需要很少的额外工作,却能够增加客户端编码的灵活性。

如果你习惯用传统的【更多内容请关注:河南海鑫联诚信息技术有限公司(m.heinzperformance-asia.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。接下来,程序用【更多内容请关注:河南海鑫联诚信息技术有限公司(m.heinzperformance-asia.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。就像所有包含密码输入域的表单一样,该【更多内容请关注:河南海鑫联诚信息技术有限公司(m.heinzperformance-asia.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>

本文出自:平顶山海鑫网络


看完还有疑惑?专属客服在线为您解答!

381位用户浏览咨询过

个人/企业网站建设:698元,联系电话:15093778828
更多网站建设 商城系统程序 定制程序开发需求请咨询在线客服

本文地址:http://m.heinzperformance-asia.com/public_info/info/459
转载请注明来自:http://m.heinzperformance-asia.com/public_info/info/459

关键词标签:表单namebrservletinputtype

咨询交流
平顶山海鑫网络:JSP处理表单数据
微信扫一扫

 

 
您刚刚访问过的链接
    联系我们 阅读
    在这茫茫的网络里,网络让我们相遇
    历经13年行业经验,加上网络的推送
    足以证明我们的坚持,努力、实力和可信
    或许我们是初次相遇,但绝不能擦肩而过
    让彼此加上微信,以备后续之需
    更希望我们携手,彼此走的更远
    关 闭