JAVA

          人生若只如初見,何事秋風悲畫扇。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            50 隨筆 :: 25 文章 :: 157 評論 :: 0 Trackbacks

          首先看下看下相對簡單些的--向服務器發送一個包含有名/值對的簡單查詢串

          在這種情況下XHP即可以用GET也可以用POST。

          GET

          function ?doRequestUsingGET()? {
          ????createXMLHttpRequest();
          ????
          ????
          var ?queryString? = ? " GetAndPostExample? " ;
          ????queryString?
          = ?queryString? + ?createQueryString()?
          ????????
          + ? " &timeStamp= " ? + ? new ?Date().getTime();
          ????xmlHttp.onreadystatechange?
          = ?handleStateChange;
          ????xmlHttp.open(
          " GET " ,?queryString,? true );
          ????xmlHttp.send(
          null );
          }


          POST

          function ?doRequestUsingPOST()? {
          ????createXMLHttpRequest();
          ????
          ????
          var ?url? = ? " GetAndPostExample?timeStamp= " ? + ? new ?Date().getTime();
          ????
          var ?queryString? = ?createQueryString();
          ????
          ????xmlHttp.open(
          " POST " ,?url,? true );
          ????xmlHttp.onreadystatechange?
          = ?handleStateChange;
          ????xmlHttp.setRequestHeader(
          " Content-Type " ,? " application/x-www-form-urlencoded " );????
          ????xmlHttp.send(queryString);
          }


          queryString就是名/值對的參數形式了(如name=LiLin&age=23),在調用OPEN方法中,當請求方法是用POST的時候為了確保服務器知道請求體中有請求參數,需要調用setRequestHeader,將Content-Type值設置為
          application/x-www-form-urlencoded.當然也可不放在請求體中(那就不要用POST啦!)

          此時server處理:

          import ?java.io. * ;
          import ?java.net. * ;
          import ?javax.servlet. * ;
          import ?javax.servlet.http. * ;

          public ? class ?GetAndPostExample? extends ?HttpServlet? {
          ????
          ????
          protected ? void ?processRequest(HttpServletRequest?request,?
          ????????????HttpServletResponse?response,?String?method)
          ????
          throws ?ServletException,?IOException? {
          ????????
          ????????
          // Set?content?type?of?the?response?to?text/xml
          ????????response.setContentType( " text/xml " );
          ????????
          ????????
          // Get?the?user's?input
          ????????String?firstName? = ?request.getParameter( " firstName " );
          ????????String?middleName?
          = ?request.getParameter( " middleName " );
          ????????String?birthday?
          = ?request.getParameter( " birthday " );
          ????????
          ????????
          // Create?the?response?text
          ????????String?responseText? = ? " Hello? " ? + ?firstName? + ? " ? " ? + ?middleName
          ????????????????
          + ? " .?Your?birthday?is? " ? + ?birthday? + ? " . "
          ????????????????
          + ? " ?[Method:? " ? + ?method? + ? " ] " ;
          ????????
          ????????
          // Write?the?response?back?to?the?browser
          ????????PrintWriter?out? = ?response.getWriter();
          ????????out.println(responseText);

          ????????
          // Close?the?writer
          ????????out.close();
          ????}

          ????
          ????
          protected ? void ?doGet(HttpServletRequest?request,?HttpServletResponse?response)
          ????
          throws ?ServletException,?IOException? {
          ????????
          // Process?the?request?in?method?processRequest
          ????????processRequest(request,?response,? " GET " );
          ????}

          ????
          ????
          protected ? void ?doPost(HttpServletRequest?request,?HttpServletResponse?response)
          ????
          throws ?ServletException,?IOException? {
          ????????
          // Process?the?request?in?method?processRequest
          ????????processRequest(request,?response,? " POST " );
          ????}

          }


          對get and post方法都用processRequest來處理。



          要向服務器發送相關復雜的查詢串,可以將模型變化為XML發送到server 。

          client端:

          function ?createXML()? {
          ????
          var ?xml? = ? " <pets> " ;
          ????
          ????
          var ?options? = ?document.getElementById( " petTypes " ).childNodes;
          ????
          var ?option? = ? null ;
          ????
          for ( var ?i? = ? 0 ;?i? < ?options.length;?i ++ )? {
          ????????option?
          = ?options[i];
          ????????
          if (option.selected)? {
          ????????????xml?
          = ?xml? + ? " <type> " ? + ?option.value? + ? " <\/type> " ;
          ????????}

          ????}

          ????
          ????xml?
          = ?xml? + ? " <\/pets> " ;
          ????
          return ?xml;
          }


          function ?sendPetTypes()? {
          ????createXMLHttpRequest();
          ????
          ????
          var ?xml? = ?createXML();
          ????
          var ?url? = ? " PostingXMLExample?timeStamp= " ? + ? new ?Date().getTime();
          ????
          ????xmlHttp.open(
          " POST " ,?url,? true );
          ????xmlHttp.onreadystatechange?
          = ?handleStateChange;
          ????xmlHttp.setRequestHeader(
          " Content-Type " ,? " application/x-www-form-urlencoded " );????
          ????xmlHttp.send(xml);
          }



          createXML方法無非就是將內容以DOM的樣式存到var xml(變量)里。有時也可能出現client直接將本地的一個XML文件
          直接以DOM(當然可以edit)的樣式傳送.(也放這個時個的Content-Type應該為text/xml了!)
          這時可能要用到ActiveXObject("MSXML2.DOMDocument.3.0")這樣一個控件了。
          關于這個控件有個方法可以在各broswer中通用的JS代碼:

          // --------------------------------------------------------------------
          //
          ?Function:?CreateXMLDOM
          //
          //
          ?Purpose:?Creates?a?new?XML?DOM.
          //
          //
          ?Parameters:?None
          //
          //
          ?Returns:?XMLDOM?object?OR?null
          //
          --------------------------------------------------------------------
          function ?CreateXmlDOM()
          {
          ?
          var ?oXML? = ? new ?ActiveXObject(GetXmlParserProgID());
          ?
          try
          ?
          {
          ??oXML.setProperty(
          " AllowXsltScript " ,? true );
          ?}

          ?
          catch (err) {}
          ?
          ?oXML.async?
          = ? false ;
          ?oXML.validateOnParse?
          = ? false ;
          ?oXML.resolveExternals?
          = ? false ;
          ?oXML.setProperty(
          " SelectionLanguage " ,? " XPath " );
          ?
          try ? {oXML.setProperty( " NewParser " ,? true );} ? catch (e) {}

          ?
          return ?oXML;
          }


          // --------------------------------------------------------------------
          //
          ?Function:?GetXmlParserProgID
          //
          //
          ?Purpose:
          //
          ?Gets?the?ProgID?of?the?highest?available?version?of?the?
          //
          ?Microsoft?XML?parser.
          //
          //
          ?Parameters:?None
          //
          //
          ?Returns:?String?(i.e.?"Msxml2.DOMDocument.4.0")
          //
          //
          --------------------------------------------------------------------
          function ?GetXmlParserProgID()
          {
          ?
          var ?MAX_MAJOR_PARSER_VERSION? = ? 10 ;
          ?
          var ?MIN_MAJOR_PARSER_VERSION? = ? 0 ;
          ?
          var ?MAX_MINOR_PARSER_VERSION? = ? 9 ;
          ?
          var ?MIN_MINOR_PARSER_VERSION? = ? 0 ;
          ?
          ?
          var ?sProgID? = ?g_sXmlParserProgID;
          ?
          var ?bFound? = ? false ;

          ?
          if ?( ! sProgID)
          ?
          {
          ??
          // ?Iterate?through?possible?versions
          ???? for ?( var ?nMajor? = ?MAX_MAJOR_PARSER_VERSION;?nMajor? >= ?MIN_MAJOR_PARSER_VERSION;?nMajor -- )
          ??
          {
          ???
          for ?( var ?nMinor? = ?MAX_MINOR_PARSER_VERSION;?nMinor? >= ?MIN_MINOR_PARSER_VERSION;?nMinor -- )
          ???
          {
          ????
          // ?Set?up?the?classname?for?the?version?that?we're?trying?to?instantiate
          ????sProgID? = ? " Msxml2.DOMDocument. " ? + ?nMajor? + ? " . " ? + ?nMinor;

          ????
          try
          ????
          {?
          ?????????
          if ?( new ?ActiveXObject(sProgID))?
          ?????
          {
          ??????bFound?
          = ? true ;
          ??????
          break ;
          ?????}

          ????}

          ????
          catch (e)
          ????
          {
          ????}

          ???}


          ???
          if ?(bFound)
          ???
          {
          ????
          // ?store?in?a?global?variable?to?speedup?subsequent?calls
          ????g_sXmlParserProgID? = ?sProgID;
          ????
          break ;
          ???}

          ??}

          ?}

          ?
          ?
          return ?sProgID;
          }


          然后直接用其load方法(本地)。

          var ?xmlDoc? = ? new ?ActiveXObject( " MSXML2.DOMDocument.3.0 " );
          xmlDoc.load(local_XML_FileName);

          當然也可以直接從server取來(用get方法即可),然后以responseText的方法

          xmlht.Open( " GET " ,server_XML_FileName, true );
          xmlht.onreadystatechange?
          = ?stateChange;
          xmlht.Send(
          null );
          ?
          function ?handleStateChange()? {
          ????
          if (xmlHttp.readyState? == ? 4 )? {
          ????????
          if (xmlHttp.status? == ? 200 )? {
          ?????????????xmlDoc.loadXML(xmlht.responseText);
          ????????}

          ????}

          }

          實際上xmlDoc.loadXML(xmlht.responseText)所得到的就是一個于內存中的DOM了,而直接用responseXML的話就直接可以解析為一個DOM了!(注意load(FILE)與loadXML(DOM)是不同的)


          此時servert process :

          import ?java.io. * ;
          import ?javax.servlet. * ;
          import ?javax.servlet.http. * ;
          import ?javax.xml.parsers.DocumentBuilderFactory;
          import ?javax.xml.parsers.ParserConfigurationException;
          import ?org.w3c.dom.Document;
          import ?org.w3c.dom.NodeList;
          import ?org.xml.sax.SAXException;

          public ? class ?PostingXMLExample? extends ?HttpServlet? {
          ????
          ????
          protected ? void ?doPost(HttpServletRequest?request,?HttpServletResponse?response)
          ????
          throws ?ServletException,?IOException? {
          ????????
          ????????String?xml?
          = ?readXMLFromRequestBody(request);
          ????????Document?xmlDoc?
          = ? null ;
          ????????
          try ? {
          ????????????xmlDoc?
          = ?
          ????????????????????DocumentBuilderFactory.newInstance().newDocumentBuilder()
          ????????????????????.parse(
          new ?ByteArrayInputStream(xml.getBytes()));
          ????????}

          ????????
          catch (ParserConfigurationException?e)? {
          ????????????System.out.println(
          " ParserConfigurationException:? " ? + ?e);
          ????????}

          ????????
          catch (SAXException?e)? {
          ????????????System.out.println(
          " SAXException:? " ? + ?e);
          ????????}


          ????????
          /* ?Note?how?the?Java?implementation?of?the?W3C?DOM?has?the?same?methods
          ?????????*?as?the?JavaScript?implementation,?such?as?getElementsByTagName?and?
          ?????????*?getNodeValue.
          ?????????
          */

          ????????NodeList?selectedPetTypes?
          = ?xmlDoc.getElementsByTagName( " type " );
          ????????String?type?
          = ? null ;
          ????????String?responseText?
          = ? " Selected?Pets:? " ;
          ????????
          for ( int ?i? = ? 0 ;?i? < ?selectedPetTypes.getLength();?i ++ )? {
          ???????????type?
          = ?selectedPetTypes.item(i).getFirstChild().getNodeValue();
          ???????????responseText?
          = ?responseText? + ? " ? " ? + ?type;
          ????????}

          ????????
          ????????response.setContentType(
          " text/xml " );
          ????????response.getWriter().print(responseText);
          ????}

          ????
          ????
          private ?String?readXMLFromRequestBody(HttpServletRequest?request) {
          ????????StringBuffer?xml?
          = ? new ?StringBuffer();
          ????????String?line?
          = ? null ;
          ????????
          try ? {
          ????????????BufferedReader?reader?
          = ?request.getReader();
          ????????????
          while ((line? = ?reader.readLine())? != ? null )? {
          ????????????????xml.append(line);
          ????????????}

          ????????}

          ????????
          catch (Exception?e)? {
          ????????????System.out.println(
          " Error?reading?XML:? " ? + ?e.toString());
          ????????}

          ????????
          return ?xml.toString();
          ????}

          }


          DOM,JDOM,JAXP隨便你自己選好了!

          參考資料:foundations-of-ajax

          相關鏈接: Ajax---通過JSON與服務器通信(發送請求和處理響應)

          posted on 2006-03-29 15:04 Jkallen 閱讀(3930) 評論(0)  編輯  收藏 所屬分類: AJAX
          主站蜘蛛池模板: 镇雄县| 珲春市| 曲松县| 陆河县| 日喀则市| 新泰市| 织金县| 东乌珠穆沁旗| 句容市| 延寿县| 鄂托克旗| 古浪县| 甘泉县| 清镇市| 千阳县| 芒康县| 长兴县| 石景山区| 桃园市| 信阳市| 双辽市| 都匀市| 五原县| 祁连县| 乾安县| 寻乌县| 那曲县| 和田市| 康保县| 东源县| 荔波县| 卓尼县| 翼城县| 太谷县| 郯城县| 余江县| 新建县| 江源县| 阳高县| 定兴县| 微博|