<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    飛艷小屋

    程序--人生--哲學(xué)___________________歡迎艷兒的加入

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      52 Posts :: 175 Stories :: 107 Comments :: 0 Trackbacks
    4.1 表單數(shù)據(jù)概述  
         如果你曾經(jīng)使用過Web搜索引擎,或者瀏覽過在線書店、股票價格、機(jī)票信息,或許會留意到一些古怪的URL,比如“http://host/path?user=Marty+Hall&origin=bwi&dest=lax”。這個URL中位于問號后面的部分,即“user=Marty+Hall&origin=bwi&dest=lax”,就是表單數(shù)據(jù),這是將Web頁面數(shù)據(jù)發(fā)送給服務(wù)器程序的最常用方法。對于GET請求,表單數(shù)據(jù)附加到URL的問號后面(如上例所示);對于POST請求,表單數(shù)據(jù)用一個單獨(dú)的行發(fā)送給服務(wù)器。  
         以前,從這種形式的數(shù)據(jù)提取出所需要的表單變量是CGI編程中最麻煩的事情之一。首先,GET請求和POST請求的數(shù)據(jù)提取方法不同:對于GET請求,通常要通過QUERY_STRING環(huán)境變量提取數(shù)據(jù);對于POST請求,則一般通過標(biāo)準(zhǔn)輸入提取數(shù)據(jù)。第二,程序員必須負(fù)責(zé)在“&”符號處截?cái)嘧兞棵?變量值對,再分離出變量名字(等號左邊)和變量值(等號右邊)。第三,必須對變量值進(jìn)行URL反編碼操作。因?yàn)榘l(fā)送數(shù)據(jù)的時候,字母和數(shù)字以原來的形式發(fā)送,但空格被轉(zhuǎn)換成加號,其他字符被轉(zhuǎn)換成“%XX”形式,其中XX是十六進(jìn)制表示的字符ASCII(或者ISO Latin-1)編碼值。例如,如果HTML表單中名為“users”的域值為“~hall, ~gates, and ~mcnealy”,則實(shí)際向服務(wù)器發(fā)送的數(shù)據(jù)為“users=%7Ehall%2C+%7Egates%2C+and+%7Emcnealy”。最后,即第四個導(dǎo)致解析表單數(shù)據(jù)非常困難的原因在于,變量值既可能被省略(如“param1=val1&param2=&param3=val3”),也有可能一個變量擁有一個以上的值,即同一個變量可能出現(xiàn)一次以上(如“param1=val1&param2=val2&param1=val3”)。   
         Java Servlet的好處之一就在于所有上述解析操作都能夠自動完成。只需要簡單地調(diào)用一下HttpServletRequest的getParameter方法、在調(diào)用參數(shù)中提供表單變量的名字(大小寫敏感)即可,而且GET請求和POST請求的處理方法完全相同。   
         getParameter方法的返回值是一個字符串,它是參數(shù)中指定的變量名字第一次出現(xiàn)所對應(yīng)的值經(jīng)反編碼得到得字符串(可以直接使用)。如果指定的表單變量存在,但沒有值,getParameter返回空字符串;如果指定的表單變量不存在,則返回null。如果表單變量可能對應(yīng)多個值,可以用getParameterValues來取代getParameter。getParameterValues能夠返回一個字符串?dāng)?shù)組。   
         最后,雖然在實(shí)際應(yīng)用中Servlet很可能只會用到那些已知名字的表單變量,但在調(diào)試環(huán)境中,獲得完整的表單變量名字列表往往是很有用的,利用getParamerterNames方法可以方便地實(shí)現(xiàn)這一點(diǎn)。getParamerterNames返回的是一個Enumeration,其中的每一項(xiàng)都可以轉(zhuǎn)換為調(diào)用getParameter的字符串。
      
    4.2 實(shí)例:讀取三個表單變量  
         下面是一個簡單的例子,它讀取三個表單變量param1、param2和param3,并以HTML列表的形式列出它們的值。請注意,雖然在發(fā)送應(yīng)答內(nèi)容之前必須指定應(yīng)答類型(包括內(nèi)容類型、狀態(tài)以及其他HTTP頭信息),但Servlet對何時讀取請求內(nèi)容卻沒有什么要求。   
         另外,我們也可以很容易地把Servlet做成既能處理GET請求,也能夠處理POST請求,這只需要在doPost方法中調(diào)用doGet方法,或者覆蓋service方法(service方法調(diào)用doGet、doPost、doHead等方法)。在實(shí)際編程中這是一種標(biāo)準(zhǔn)的方法,因?yàn)樗恍枰苌俚念~外工作,卻能夠增加客戶端編碼的靈活性。   
         如果你習(xí)慣用傳統(tǒng)的CGI方法,通過標(biāo)準(zhǔn)輸入讀取POST數(shù)據(jù),那么在Servlet中也有類似的方法,即在HttpServletRequest上調(diào)用getReader或者getInputStream,但這種方法對普通的表單變量來說太麻煩。然而,如果是要上載文件,或者POST數(shù)據(jù)是通過專門的客戶程序而不是HTML表單發(fā)送,那么就要用到這種方法。   
         注意用第二種方法讀取POST數(shù)據(jù)時,不能再用getParameter來讀取這些數(shù)據(jù)。   
    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 = "讀取三個請求參數(shù)";
       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 實(shí)例:輸出所有的表單數(shù)據(jù)  
         下面這個例子尋找表單所發(fā)送的所有變量名字,并把它們放入表格中,沒有值或者有多個值的變量都突出顯示。   
         首先,程序通過HttpServletRequest的getParameterNames方法得到所有的變量名字,getParameterNames返回的是一個Enumeration。接下來,程序用循環(huán)遍歷這個Enumeration,通過hasMoreElements確定何時結(jié)束循環(huán),利用nextElement得到Enumeration中的各個項(xiàng)。由于nextElement返回的是一個Object,程序把它轉(zhuǎn)換成字符串后再用這個字符串來調(diào)用getParameterValues。   
         getParameterValues返回一個字符串?dāng)?shù)組,如果這個數(shù)組只有一個元素且等于空字符串,說明這個表單變量沒有值,Servlet以斜體形式輸出“No Value”;如果數(shù)組元素個數(shù)大于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 = "讀取所有請求參數(shù)";
       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>參數(shù)名字<TH>參數(shù)值");
       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發(fā)送數(shù)據(jù)的表單PostForm.html。就像所有包含密碼輸入域的表單一樣,該表單用POST方法發(fā)送數(shù)據(jù)。我們可以看到,在Servlet中同時實(shí)現(xiàn)doGet和doPost這兩種方法為表單制作帶來了方便。
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
      <HTML>
      <HEAD>
       <TITLE>示例表單</TITLE>
      </HEAD>
      
      <BODY BGCOLOR="#FDF5E6">
      <H1 ALIGN="CENTER">用POST方法發(fā)送數(shù)據(jù)的表單</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>
    posted on 2006-01-19 18:25 天外飛仙 閱讀(235) 評論(0)  編輯  收藏 所屬分類: java
    主站蜘蛛池模板: 久久精品国产精品亚洲艾草网 | 在线观看特色大片免费视频| 亚洲中文无码a∨在线观看| 免费看美女让人桶尿口| 中文字幕高清免费不卡视频| 亚洲国产成人手机在线电影bd| 国产又大又粗又硬又长免费| 青青草原1769久久免费播放| 亚洲愉拍一区二区三区| 好看的电影网站亚洲一区| 最近中文字幕mv免费高清视频7| 在线免费视频你懂的| 亚洲综合av一区二区三区不卡| 国内精品久久久久久久亚洲| 国产情侣激情在线视频免费看| 一级毛片免费播放视频| 亚洲国产成人精品激情| 亚洲日韩精品一区二区三区| 成年人视频在线观看免费| 97无码人妻福利免费公开在线视频| 亚洲国产成人无码AV在线影院| 亚洲AV成人无码久久精品老人| 少妇亚洲免费精品| 国产妇乱子伦视频免费| GOGOGO高清免费看韩国| 国产亚洲精品美女| 亚洲人成人77777网站不卡| 亚洲午夜国产精品无码| 国产免费AV片无码永久免费 | 国产成人精品日本亚洲专区61 | 成人人免费夜夜视频观看| 精品一区二区三区免费| 美女又黄又免费的视频| 亚洲 暴爽 AV人人爽日日碰 | 中文字幕无线码中文字幕免费| 亚洲日韩在线中文字幕综合| 亚洲人成在线免费观看| 91亚洲导航深夜福利| 亚洲国产精品特色大片观看完整版| 又粗又黄又猛又爽大片免费| 四虎影院免费在线播放|