快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

处理表单数据

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方式的返回值是一个字符串,它是参数中指定的变量名字第一次出现所对应的值经反编码得到得字符串(可以直接使用)。假如指定的表单变量存在,但没有值,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等方式)。在实际编程中这是一种标准的方式,因为它只需要很少的额外工作,却能够增加客户端编码的灵活性。

  假如你习惯用传统的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。接下来,程序用循环遍历这个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。就像所有包含密码输入域的表单相同,该表单用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>
返回类别: 教程
上一教程: JAVA 语法介绍(五):条件控制
下一教程: JSP中文留言簿

您可以阅读与"处理表单数据"相关的教程:
· 四、处理表单数据
· 通过处理数据流在网页中显示图像
· 网络数据流的JAVA处理
· Java中数据库事务处理的实现
· 学会如何处理数据库中的NULL
    微笑服务 优质保证 索取样品