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

 

List 5  xml_maker.php

function escape_xml ($str) {

  return htmlspecialchars ($str, ENT_QUOTES);

}

//DB类型转换成Curl类型

$curltypes = array(

  'VARCHAR' => 'String',

  'DOUBLE' => 'double',

  'CURRENCY' => 'double',

  'DECIMAL' => 'double',

  'INTEGER' => 'int',

  'COUNTER' => 'int',

  'DATETIME' => 'DateTime',

  'BIT' => 'bool',

);

//请求执行后将数据转换成XML返回给客户端。

function query_results_xml ($connect, $sql) {

  global $curltypes;

  $sql = stripslashes ($sql);

  $result = odbc_exec ($connect, $sql);

  if ($result == FALSE) {

    print "<Fault message = /"$sql/" />";

    return;

  }

  print ("<?xml version=/"1.0/" encoding=/"Shift_JIS/"?>");

  $recordset_type = "RecordSet"; //根标签

  $record_type = "Record";  //Record标签

  print ("<$recordset_type>");

  $ncols = (odbc_num_fields ($result));

  $fields_type = "Fields";    //Fields标签

  $field_type = "Field";     //Field标签

//域信息标签

  print ("/n  <$fields_type>");

  for ( $i = 1; $i <= $ncols; $i++ ){

    $key = (odbc_field_name ($result, $i));

    $typ = (odbc_field_type ($result, $i));

    $curltyp = $curltypes[$typ];

    if (strlen ($curltyp) == 0) {

      print ("/n    <!-- $typ -->");

      $curltyp = 'any';

    }

    print ("/n    <$field_type");

    print ("/n      name = /"$key/"");

    print ("/n      domain = /"$curltyp/"");

    print (" />");

  }

  print ("/n  </$fields_type>");

  while (odbc_fetch_row ($result)) {

    //Record信息标签

    print ("/n  <$record_type");

    for ( $i = 1; $i <= $ncols; $i++ ){

      $key = (odbc_field_name ($result, $i));

      $val = (escape_xml (odbc_result ($result, $i)));

      print ("/n    $key = /"$val/"");

    }

    print (" />");

  }

  print ("/n</$recordset_type>");

}

 

List 6所示的XML格式正好和Curl 6.0的标准类{RecordSet}相对应。Curl应用程序将这些数据转换成{RecordSet}后,再传给{RecordGrid}{RecordForm}等类,进行富编辑和表现。

 

List 6  List 5的输出例子(para1=Boston&para2=1962)

<?xml version="1.0" encoding=Shift_JIS?>

< RecordSet>

  <Fields>

<field name=”name” domain=”String”/>

<field name=”region” domain=”String”/>

<field name=”year” domain=”DateTime”/>

</Fields>

<Record name=”Michael” region=”Boston” year=”1962”/>

<Record name=”Scott” region=”Boston” year=”1962”/>

</RecordSet>

 

3.3.2 用JSP编写服务器端程序

List 7是使用JSP编写服务器端程序的例子。在这个例子中,数据库是MySQL,数据库名是demo,表是plsum。用List 7JSP程序输出生成的XML数据如List 8所示。List8XMLList6XML相比,List6拥有很多属性,而List8只用了标签。也就是说,XML文本的形式也是没有限制的。系统开发者可根据系统本身的性质对XML形式进行自由设计。

    然而, 不管使用PHP还是使用JSP都需要将其引擎和组入WEB服务器中。使用JSP时需要Java SDKJava Servelet容器(如TOMCAT等)。服务器端的数据可以是任意的数据库或文本文件,但要配有相应的JDBC驱动器。

List 7  JSP编写的服务器端程序

<%@ page

language="java"

contentType="text/html; charset=Shift_JIS"

import=" java.util.*,java.sql.*, java.lang.*, java.io.*"

%><%

  String dep= request.getParameter ("dep"); //参数

  String fis = request.getParameter ("mon"); //参数

  String drv = "com.mysql.jdbc.Driver";// JDBC驱动

  String dsn = "jdbc:MySQL://localhost:36.06/demo”+

?user=root&password="; //数据源

  String sql = "select * from plsum where yyyymm = '" + fis +

"' and dept = '" + dep+ "' " + "order by unit, mon"; //SQL

  try {

    Class.forName(drv);

    Connection con = DriverManager.getConnection(dsn);

    Statement stmt = con.createStatement();

    ResultSet rs = stmt.executeQuery(sql);

    ResultSetMetaData rsmd = rs.getMetaData();

    int numberOfColumns = rsmd.getColumnCount();

    int fristRow = rs.getRow();

    rs.last();

    int lastRow = rs.getRow();

    int rows = lastRow - fristRow; //Record

    rs.relative(-rows);

      out.println("<?xml version=/"1.0/"

encoding=/"Shift_JIS/"?>"); //XMLヘッダー

      out.println("<ResultSet>"); //根标签

      out.println("/t<meta>"); // meta标签

      out.println("/t/t<sql>" + sql + "</sql>");

      out.println("/t/t<rows>" + rows + "</rows>");

      out.println("/t</meta>");

      int rowNum = 1;

      while (rs.next()) { //Record(row)

        out.println("/t<row>");

        out.println("/t/t<rowid>" + rowNum++ + "</rowid>");

        for (int i=1; i<=numberOfColumns; i++) {

          String columnName = rsmd.getColumnName (i);

          out.println("/t/t<" + columnName + ">" +

 rs.getString(i) + "</" + columnName + ">");

        }

        out.println("/t</row>");

      }

      out.println("</ResultSet>"); //终止根目录

    rs.close();

  } catch (Exception e) { //出错处理

      out.println ("error");

      out.println ("/t<message>" +

"DB access error: " + e.toString() + "</message>");

      out.println ("/error");

  }

%>

 

List 8    List 7输出生成的XML文本

<?xml version="1.0" encoding=Shift_JIS?>

< ResultSet >

  <meta>

<sql> select * from plsum where … </sql>

<rows>2</rows>

</meta>

<row>

<rowid>1</rowid>

<dept>营业部</dept>

<profit>1200000</profit>

</row>

<row>

<rowid>1</rowid>

<dept>技术部</dept>

<profit>2400000</profit>

</row>

</ResultSet >

 

3.3.3 CurlWeb服务器的数据请求

Curl里有和HTML表单(Form)非常相似的类HttpForm。可以用这个类非常容易地设置Http Context, Http Method 指定调用Http服务的方法(get/post),进行数据验证以及自动发送数据请求。但在大部分情况下,使用HttpFormData这个类,加以手动和HttpRequest组合,可以更灵活地实现数据请求。List 9为一实例。这个实例中定义了2个函数。即,{qx-http-form-data}{qx-get-http-data}{qx-http-form-data}可以生成多个key=”val”{HttpFormData}。通过给{qx-get-http-data} 函数传入URL{HttpFormData},便可向服务器发送数据请求。 返回的数据被存放在{Array-of StringBuf}中。List 9中的{do}程序块是必须的,向服务器发送数据请求的正是这里。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值