基于Curl的RIA系统开发入门(四)

List 9  Curl向服务器发送数据请求

{curl 6.0 applet}

{curl-file-attributes character-encoding=”utf-8”}

{define-proc public {qx-get-http-data

 the-url:Url, form-data:HttpFormData}:#{Array-of StringBuf}

  let input-stream:#TextInputStream

  let lines:#{Array-of StringBuf}

  let cnt:#int

  {try

    let file:HttpFile = {the-url.instantiate-File} asa HttpFile

    set input-stream = {file.http-read-open

      request-data = form-data,

      request-method = HttpRequestMethod.get,

      character-encoding= {get-character-encoding-by-name "utf-8"}

    }

    set (lines, cnt) = {input-stream.read-lines}

  catch e:HttpException do

    {output {value e}}

  catch e:IOException do

    {output {value e}}

  finally

    {if-non-null input-stream then {input-stream.close}}

  }

  {return lines}

}

{define-proc public {qx-http-form-data ...}:HttpFormData

  let form-data:HttpFormData = {HttpFormData

    mime-type = HttpFormData.urlencoded-mime-type,

    default-character-encoding=

{get-character-encoding-by-name "utf-8"}

  }

  {for (x, k) in ... do

    {if-non-null k then

      {form-data.append {new HttpFormStringParam, k, {String x}}}

    }

  }

  {return form-data}

}

||下面是方法

{let form-data:HttpFormData = {qx-http-form-data

    dep=”营业部”, mon=”2004/10”

}

{let the-url:Url = {url "http://localhost:8080/query.jsp"}}

{do

  let lines:#{Array-of StringBuf}

  {try

    set lines = {qx-get-http-data the-url, form-data}

    {output "Get line master is OK. --> " & lines.size }

  catch th:Throwable do

    {output "Http access error. Try test data."}

  }

}

 

3.3.4 Curl程序中的XML数据处理

以上说明了如何在服务器站点生成XML数据和如何将数据返回到Curl客户端。此外还讲了如何向服务器端发出数据请求的方法。单是从服务器获取XML数据,那么使用List 9中的{ qx-get-http-data}就可以了。但是,{ qx-get-http-data}获取的仅仅是XML文本。如果不对其进行解析的话,那就不算是富客户端了。解析XML文本可使用Curl内置的SAX2解析器。使用SAX2解析器时,需要明确地导入CURL.XML.SAX.PARSER程序包。

使用SAX2解析XML的步骤如下:

① 先定义好存储XML解析结果的数据区。这里可以使用{RecordSet}、自定义的类或类数组等等;

② 继承{DefaultHandler},定义一个自己的Hander类。这个类必须重载DefaultHandler5个方法, 即:(1) start-document (2)start-element (3)characters (4)end-element(5)end-document。 通过这些方法,可以把XML数据解析到相应的数据存储区;

③ 设定{SAXParser}实体的解析用Hander以及错误处理用Hander

④ 给{SAXParser}实体的parse方法传入XML数据源参数以后,XML的解析过程便开始了。解析过程中,如有发生不符合数据类型结构的数据,那么会自动调用错误处理Hander

⑤ 解析好的数据可以在浏览器中以树状结构表示出来。

例如,List 10XML数据结构可以使用List 11中的类和Handler来处理。

List 10 XML数据格式

<?xml version=”1.0”?>

<persons>

  <person id=”10001”>

    <fname>小王</fname>

    <lname>小李</lname>

  </person>

<person id=”10002”>

    <fname>老张</fname>

    <lname>老蔡</lname>

  </person>

</persons>

List 11  List 10XML处理程序

{curl 6.0 applet}

{import * from CURL.XML.SAX.PARSER}  ||显式导入

{define-class public Person  ||定义数据解析保存区

  field public id:String = ""

  field public fname:String = ""

  field public lname:String = ""

}

{define-class public MyHandler {inherits DefaultHandler}

  field public persons:{Array-of Person}= {{Array-of Persons}}

  field private person:Person= {Person}

  field private text:StringBuf={StringBuf}   ||test hash

  {constructor public {default}

{construct-super}

  }

  {method public {start-document}:void  ||根标签

    {self.persons.clear} || 清除

  }

  {method public {start-element uri:String, 

            name:String, qname:String, atts:Attributes}:void

    {self.text.clear} ||清除文本

    {if name == "person" then || person的条件下取id

      set self.person = {Person} ||生成新的Person

      {for i:int = 0 below {atts.get-length} do

        {if {atts.get-qname i} == "id" then

          set self.person.id = {{atts.get-value i}.to-String}

        }

      }

    }

  }

  {method public {characters ch:StringBuf, start:int, ength:int}:void

    {self.text.concat{ch.substr start, length}}

  } ||链接字符串

  {method public {end-element uri:String,

                        name:String, qname:String}:void

    {switch name

     case "fname" do  ||fname结束

        set self.person.fname = {self.text.to-String}

     case "lname" do  ||lname结束

        set self.person.lname = {self.text.to-String}

     case "person" do ||person结束

        {self.persons.append self.person}

     else

    }

  }

  {method public {end-document}:void

  } || 终止根标签

}

{let my-parser:SAXParser = {SAXParser}}

{let my-handler:MyHandler = {MyHandler}}

{let my-url:Url} = {url “http://localhost:8080/get-xml.asp}}

{let my-file:HttpFile = {my-url.instantiate-File} asa HttpFile

{let my-stream:#TextInputStream}

{do || try catch添加异常处理。

set my-stream = {my-file.http-read-open

  request-method = HttpRequestMethod.get, character-encoding

={get-character-encoding-by-name "utf-8"}}

  {my-parser.set-content-handler my-handler}

  {my-parser.set-error-handler my-handler}

  {my-parser.parse {InputSource character-stream=my-stream }}

}

{value

|| 追加my-handler.persons的表示code

}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值