sbf123官网

必须对变量值进行URL反编码操作

4.1 表单数据概述

  
借使您早已采取过Web搜索引擎,或许浏览过在线书报摊、股价、机票音信,大概会在意到一些蹊跷的USportageL,举例“

  
以前,从这种样式的多少提收取所必要的表单变量是CGI编制程序中最麻烦的政工之意气风发。首先,GET诉求和POST乞求的数量提取方式分歧:对于GET伏乞,日常要透过QUE景逸SUVY_STHighlanderING情状变量提取数额;对于POST伏乞,则平日经过职业输入提取数额。第二,程序猿必得负责在“&”符号处截断变量名字-变量值对,再分开出变量名字(等号左侧)和变量值(等号左侧)。第三,必需对变量值举行U奥迪Q5L反编码操作。因为发送数据的时候,字母和数字以本来的款型发送,但空格被转变到加号,其余字符被转形成“%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>参数值”State of Qatar;
    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兰德XC60″>用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>

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章