第三十七章 构建数据库应用程序 - 在页面上使用对象

31 阅读3分钟

第三十七章 构建数据库应用程序 - 在页面上使用对象

CSP最强大的方面之一是,它允许创建可以直接与内置对象数据库交互的动态网页。 这意味着可以快速构建以下数据库应用程序:

  • 避免将关系数据映射到对象的复杂性
  • 不需要复杂的中间件
  • 能否在运行时重新配置,从单服务器配置到多层、多服务器配置,以获得真正的可伸缩性

注意,通过使用Caché SQL Gateway,可以构建访问第三方关系数据库中的数据的基于对象的CSP应用程序。 Caché以应用程序透明的方式管理这一点; 无论选择将数据存储在内置的Caché数据库还是第三方数据库中,本章描述的所有技术都可以工作。

CSP是灵活; 可以使用各种技术构建数据库应用程序,从使用自动将数据绑定到HTML表单的高级标记到编写使用对象直接访问数据的服务器端脚本。 下面将概述这些技术。

在页面上使用对象

Caché使构建代表应用程序数据的持久对象数据库变得容易。 可以在web应用程序中以多种方式使用这些持久对象。

在页面上显示对象数据最直接的方法是使用服务器端脚本打开对象并写出其内容。

下面的示例使用Sample.PersonCaché Samples数据库中。这些示例使用CSP页面,但所描述的技术也适用于通过在类中将%CSP.Page子类化而构建的应用程序。

<html>
<body>
<script language="Cache" runat="SERVER">
 // open an instance of Sample.Person
 Set id = 1
 Set person = ##class(Sample.Person).%OpenId(1)
</script>
<table border="1">
<tr><td>Name:</td><td>#(person.Name)#</td></tr>
<tr><td>SSN:</td><td>#(person.SSN)#</td></tr>
<tr><td>City:</td><td>#(person.Home.City)#</td></tr>
<tr><td>State:</td><td>#(person.Home.State)#</td></tr>
<tr><td>Zip:</td><td>#(person.Home.Zip)#</td></tr>
</table>
<script language="Cache" runat="SERVER">
 // close the object
Set person = ""
</script>
</body>
</html>

如果想尝试这样做,请将上面的代码复制到一个文本文件中,将其保存为/cachesys/csp/Samples目录(cachesyscaché的安装目录)中的myable.csp,然后将浏览器指向:

http://localhost:57772/csp/samples/mytable.csp

应该看到数据显示在一个简单的HTML表中。

注意:注意不要在/csp/samples目录中进行任何实际工作。 如果升级Caché,它将重新安装示例并删除工作。

在表单中显示对象数据

使用与上面描述的代码类似的代码,可以在HTML表单中显示数据。此示例打开永久对象的一个实例,在HTML表单中显示其某些属性,然后关闭该对象。

<html>
<body>
<script language="Cache" runat="SERVER">
 // open an instance of Sample.Person
 Set id = 1
 Set person = ##class(Sample.Person).%OpenId(1)
 If ($Data(%request.Data("SAVE",1))) {
    // If "SUBMIT" is defined, then this is a submit
    // Write the posted data into the object and save it
    Set person.Name = $Get(%request.Data("Name",1))
    Set person.SSN = $Get(%request.Data("SSN",1))
    Set person.Home.City = $Get(%request.Data("City",1))
    Do person.%Save()
 }
</script>
<form method="POST">
<br>Name:
<input type="TEXT" name="Name" value="#(..EscapeHTML(person.Name))#">
<br>SSN:
<input type="TEXT" name="SSN" value="#(..EscapeHTML(person.SSN))#">
<br>City:
<input type="TEXT" name="City" value="#(..EscapeHTML(person.Home.City))#">
<br>
<input type="SUBMIT" name="SAVE" value="SAVE">
</form>
<script language="Cache" runat="SERVER">
 // close the object
Set person = ""
</script>
</body>
</html>

%request.Data("txt",1) 是一个字符串值,如果数据小于的本地变量限制。 如果数据大于此值,CSP将创建一个包含数据值的流。 如果长字符串被禁用, 变量限制为32k。 如果启用长字符串,则边界会大得多。

如果你正在创建一个表单,其中包含一个可以容纳超过32K数据的字段,请按照下面的代码编写它:

Set value=%request.Data("fieldname",1)
If $isobject(value) {
    ; Treat this as a stream
} Else {
    ; Treat this as a regular string
}