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

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

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

    Junky's IT Notebook

    統(tǒng)計(jì)

    留言簿(8)

    積分與排名

    WebSphere Studio

    閱讀排行榜

    評(píng)論排行榜

    get與post方法 (轉(zhuǎn))

    在B/S應(yīng)用程序中,前臺(tái)與后臺(tái)的數(shù)據(jù)交互,都是通過(guò)HTML中Form表單完成的。Form提供了兩種數(shù)據(jù)傳輸?shù)姆绞健猤et和post。雖然它們都是數(shù)據(jù)的提交方式,但是在實(shí)際傳輸時(shí)確有很大的不同,并且可能會(huì)對(duì)數(shù)據(jù)產(chǎn)生嚴(yán)重的影響。雖然為了方便的得到變量值,Web容器已經(jīng)屏蔽了二者的一些差異,但是了解二者的差異在以后的編程也會(huì)很有幫助的。
    Form中的get和post方法,在數(shù)據(jù)傳輸過(guò)程中分別對(duì)應(yīng)了HTTP協(xié)議中的GET和POST方法。二者主要區(qū)別如下:
    1、Get是用來(lái)從服務(wù)器上獲得數(shù)據(jù),而Post是用來(lái)向服務(wù)器上傳遞數(shù)據(jù)。
    2、Get將表單中數(shù)據(jù)的按照variable=value的形式,添加到action所指向的URL后面,并且兩者使用“?”連接,而各個(gè)變量之間使用“&”連接;Post是將表單中的數(shù)據(jù)放在form的數(shù)據(jù)體中,按照變量和值相對(duì)應(yīng)的方式,傳遞到action所指向URL。
    3、Get是不安全的,因?yàn)樵趥鬏斶^(guò)程,數(shù)據(jù)被放在請(qǐng)求的URL中,而如今現(xiàn)有的很多服務(wù)器、代理服務(wù)器或者用戶代理都會(huì)將請(qǐng)求URL記錄到日志文件中,然后放在某個(gè)地方,這樣就可能會(huì)有一些隱私的信息被第三方看到。另外,用戶也可以在瀏覽器上直接看到提交的數(shù)據(jù),一些系統(tǒng)內(nèi)部消息將會(huì)一同顯示在用戶面前。Post的所有操作對(duì)用戶來(lái)說(shuō)都是不可見的。
    4、Get傳輸?shù)臄?shù)據(jù)量小,這主要是因?yàn)槭躑RL長(zhǎng)度限制;而Post可以傳輸大量的數(shù)據(jù),所以在上傳文件只能使用Post(當(dāng)然還有一個(gè)原因,將在后面的提到)。
    5、Get限制Form表單的數(shù)據(jù)集的值必須為ASCII字符;而Post支持整個(gè)ISO10646字符集。
    6、Get是Form的默認(rèn)方法。
    下面我們一個(gè)實(shí)例來(lái)查看二者的不同:






    Username:

    Password:




    //接受數(shù)據(jù)的Servlet文件
    import java.io.*;

    import javax.servlet.*;
    import javax.servlet.http.*;

    public class ParseServlet
    extends HttpServlet {
    public void init(ServletConfig config) throws ServletException {
    super.init(config);
    }

    public void service(HttpServletRequest request, HttpServletResponse response) throws
    IOException, ServletException {
    System.out.println("************** begin ***************");
    String method = request.getMethod();
    System.out.println("method = " + method);
    int contentLength = request.getContentLength();
    System.out.println("contentLength = " + contentLength);
    System.out.println("ContentType = " + request.getContentType());
    //System.out.println("------- 在設(shè)定字符編碼前 -------");
    System.out.println("QueryString = " + request.getQueryString());

    //得到ServletInputStream,請(qǐng)注意:這段代碼和得到user的值的代碼,不能同時(shí)出現(xiàn),否則
    //在后面的那個(gè)將會(huì)得到空值。
    if (method.equalsIgnoreCase("Post")) {
    try {
    ServletInputStream ins = request.getInputStream();
    byte[] arr = new byte[contentLength];
    while (ins.read() != -1)
    ins.read(arr, 0, contentLength);
    System.out.println("content = " + new String(arr));
    } catch (IOException e) {}
    }

    //得到user的值
    //System.out.println("Username = " + request.getParameter("user"));

    //設(shè)置字符編碼,必須放在得到ServletInputStream或者得到user的值的代碼之前,否則將起不
    //到轉(zhuǎn)化編碼的作用。
    try {
    request.setCharacterEncoding("gb2312");
    } catch (UnsupportedEncodingException use) {}

    //System.out.println("------- 在設(shè)定字符編碼后 -------");
    //得到user的值
    //System.out.println("Username = " + request.getParameter("user"));

    //System.out.println("QueryString = " + request.getQueryString());
    System.out.println("************** end ***************");
    }
    }
    首先,我們?cè)O(shè)置form的method="post",提交數(shù)據(jù),則可以得到如下的結(jié)果:
    method=
    從結(jié)果中可以看到,QueryString為null,而content是輸入的值,并且按照variable=value的形式組織,而且變量之間使用“&”連接,這和結(jié)果中的另外一個(gè)變量(ContentType)有關(guān)。在后面將會(huì)提到ContentType的有關(guān)概念。
    接著,我們將form中的method設(shè)置為get,重新提交數(shù)據(jù),則可以得到如下的結(jié)果:
    method=
    可以看到,QueryString的值正是我們?cè)陧?yè)面上的變量及其對(duì)應(yīng)值,而此時(shí)ContentLength=-1。從以上的結(jié)果,我們可以清楚地看到,Get和Post分別將數(shù)據(jù)放在不同的位置來(lái)傳輸。我們還可以將程序中注釋去掉,觀察一下,在Get和Post下設(shè)置字符編碼對(duì)數(shù)據(jù)的影響,會(huì)發(fā)現(xiàn):使用Post傳輸?shù)臄?shù)據(jù),可以通過(guò)設(shè)置編碼的方式正確轉(zhuǎn)化中文;而Get傳輸?shù)臄?shù)據(jù)卻沒(méi)有變化。在以后的程序中,我們一定要注意這一點(diǎn)。
    下面簡(jiǎn)單介紹一下ContentType,它和Form中enctype屬性的相對(duì)應(yīng),它是Form用來(lái)組織數(shù)據(jù)的方式,主要包含了兩種:
    1、application/x-www-form-urlencoded:它是默認(rèn)內(nèi)容類型(content type),在結(jié)果中我們已經(jīng)看到了經(jīng)它編碼的數(shù)據(jù)的效果。編碼方法:i.將空格使用“+”代替,非字母和數(shù)字字符,是用以%HH表示的該字符的ASCII代替(漢字就是這種形式);ii.變量和值使用“=”,各個(gè)變量和值對(duì)之間使用“&”連接。
    2、multipart/form-data:它可以用來(lái)傳輸大量二進(jìn)制數(shù)據(jù)或者非ASCII字符的文本,因此在上傳文件需設(shè)置enctype="multipart/form-data",此時(shí)method必須為post。它傳輸?shù)南艘幌盗械臄?shù)據(jù)塊,每一塊都代表Form中的一個(gè)變量,并且數(shù)據(jù)塊的順序和頁(yè)面上的順序一致,塊與塊之間使用特殊字符(boundary)分隔。如果Form中包含file控件,相應(yīng)的數(shù)據(jù)塊還會(huì)包含一個(gè)Content-Type頭,用來(lái)指定MIME,默認(rèn)值為text/plain。下面是設(shè)置enctype="multipart/form-data"時(shí)content的結(jié)果:
    enctype=
    此時(shí)在Servlet中,使用常規(guī)getParameter(String)方法已經(jīng)不能到值,至于如何解析,可以參考文件上傳的程序。

    posted on 2007-01-25 15:25 junky 閱讀(512) 評(píng)論(0)  編輯  收藏 所屬分類: web

    主站蜘蛛池模板: 影音先锋在线免费观看| 国产99精品一区二区三区免费 | 色婷婷亚洲十月十月色天| 天天影院成人免费观看| 亚洲国产精品成人午夜在线观看| 免费又黄又爽的视频| 国产一精品一av一免费爽爽| 亚洲精品中文字幕无乱码麻豆| 亚洲日本一区二区一本一道| 91老湿机福利免费体验| 含羞草国产亚洲精品岁国产精品| 久久久久亚洲精品男人的天堂| 亚洲网站在线免费观看| 国产亚洲精品国产福利在线观看| 无码国产精品一区二区免费式直播 | 免费a级黄色毛片| 久久aa毛片免费播放嗯啊| 亚洲欧美国产国产一区二区三区| 亚洲日韩精品A∨片无码| 两个人看的www免费视频| 亚洲国产成+人+综合| 国产亚洲美日韩AV中文字幕无码成人| 57pao一国产成视频永久免费| 深夜福利在线免费观看| 亚洲成无码人在线观看| 精品亚洲一区二区三区在线播放| 国产精品视频免费一区二区| 免费91麻豆精品国产自产在线观看| 精品亚洲福利一区二区| 亚洲精品美女视频| 中文字幕在线亚洲精品| 日韩一区二区在线免费观看| 18未年禁止免费观看| 国产真人无码作爱免费视频| 亚洲AV无码一区二区三区牲色| 亚洲五月六月丁香激情| 在线亚洲精品自拍| 免费日本黄色网址| 91免费国产视频| 美美女高清毛片视频黄的一免费| 亚洲人成电影院在线观看|