澳门新葡亰平台官网下载-平台游戏app > 前端 >
四澳门新葡亰平台官网下载:、处理表单数据

4.1 表单数据概述

   假让你早就选取过Web寻找引擎,可能浏览过在线书报摊、股价、机票新闻,大概会介怀到一些美妙的UOdysseyL,比方“

   在此以前,从这种方式的数码提收取所要求的表单变量是CGI编制程序中最麻烦的事情之大器晚成。首先,GET乞请和POST央浼的多寡提取方法差异:对于GET央浼,平日要经过QUE途观Y_ST酷路泽ING意况变量提取数据;对于POST哀告,则相同通过正式输入提取数额。第二,技师必需负责在“&”符号处截断变量名字-变量值对,再分别出变量名字(等号左侧)和变量值(等号左边)。第三,必须对变量值实行U大切诺基L反编码操作。因为发送数据的时候,字母和数字以本来的方式发送,但空格被转变来加号,其余字符被调换来“%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="CENTE途观">用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>

上一篇:没有了