上下文路径是什么绑定是什么意思

努力工作,关爱家人
分类:
2006-10-16 17:16
1039人阅读
从一个
Windows
窗体的角度来看,数据绑定是一种把数据绑定到一种用户界面元素(控件)的通用机制。在
Windows
窗体中有两种数据绑定类型:简单绑定和复杂绑定。
简单绑定
简单绑定是将一个用户界面元素(控件)的属性绑定到一个类型(对象)实例上的某个属性的方法。例如,如果一个开发者有一个
Customer
类型的实例,那么他就可以把
Customer
属性绑定到一个
TextBox
属性上。绑定了这
个属性之后,对
TextBox
属性的更改将传播到
Customer
属性,而对
Customer
属性的更改同样会传播到
TextBox
属性。
Windows
窗体的简单数据绑定支持绑定到任何
internal
级别的
.NET Framework
属性。
例子:对一个业务对象的简单数据绑定
/*******************************************************************
* 设置(使用VS的窗体设计器):
* 添加3个 TextBox到窗体Form(textBox1, textBox2 和textBox3)
* 添加下面的代码到Form.Load事件处理方法
******************************************************************/ /*******************************************************************
* 创建一个 customer 实例(使用下面的 Customer 类型)
******************************************************************/ Customer
Customer
Mr. Zero
, 10.0M); /*******************************************************************
textBox1, textBox2
textBox3
******************************************************************/ this
.textBox1.DataBindings.Add(
, cust,
.textBox2.DataBindings.Add(
, cust,
.textBox2.DataBindings.Add(
, cust,
); Customer
业务对象的定义
/*******************************************************************
* 设置(使用 Visual Studio 窗体设计器):
* 添加一个新的 C# 类文件到你的项目 并且把它命名为 Customer.c rdquo;
* 用下面的那个Customer类取代自动生成的Customer类代码
******************************************************************/ public
cla Customer
{ /* 私有变量 */ private
int _id; private
string _name; private
Decimal _rate; /*
构造函数 */ public
Customer() { this
.ID = -1; this
.Name =
.Empty; this
.Rate = 0.0M; } public
Customer(
Decimal
rate) { this
.ID = id; this
.Name = name; this
.Rate = rate; } /* 公共属性 */ public
ID { get
_id; } set
{ _id =
; } } public
Name { get
_name; } set
{ _name =
; } } public
Decimal
Rate { get
_rate; } set
{ _rate =
} 复杂数据绑定
复杂数据绑定是把一个基于列表的用户界面元素(比如
ComboBox
)绑定到一个数据实例列表(比如
DataTable
)的方法。和简单数据绑定一样,复杂数据绑定通常也是用户界面元素发生改变时传播到数据列表,数据列表发生改变时传播到用户界面元素。
Windows
窗体复杂数据绑定支持绑定到那些支持
接口(或者是
IEnumerable
接口,如果使用的是
BindingSource
组件的话)的数据列表。
例子:复杂数据绑定
(VS 2005)
/*******************************************************************
* 设置 (使用 Visual Studio 窗体设计器):
* 添加一个DataGridVie到窗体Form (dataGridView1)
* 添加下面的代码到Form.Load事件响应方法
******************************************************************/ /*******************************************************************
* 创建一个Customer列表. 这个列表实例被命名为 blc.
* 注意: Customer 有这些属性: ID, Name and Rate
******************************************************************/ BindingList
Customer
BindingList
Customer
(); blc.Add(
Customer
Mr. Zero
, 10.0M));
blc.Add(
Customer
Mrs. One
, 15.0M));
blc.Add(
Customer
Dr. Two
, 20.0M)); /*******************************************************************
* 利用复杂数据绑定将DataGridView绑定到Customer列表
* 绑定(customer业务类型在上面有显示).
******************************************************************/ this
.dataGridView1.DataSource = blc; 针对列表的简单数据绑定
简单数据绑定有
种形式:属性对属性的绑定(前面描述过的那种绑定);属性对一个列表中的某一项的属性的绑定。属性对一个列表中的某一项的属性的绑定形式上和属性对属性的绑定是一样的,除了数据源是一个条目
列表而非单个条目
(比如,是
BindingListCustomer
而不是
Customer
)。当使用简单数据绑定绑定到一个列表时,
Windows
窗体数据绑定运行时
(runtime)j
将用户界面元素属性绑定到列表中的某一项上的一个属性。默认情况下,运行时
(runtime)
将绑定到列表中的第一项(例如,绑定
TextBox
属性到
Customers[0].Name
),如果同一个列表被绑定到另外一个使用复杂数据绑定的控件上(正如下面的例子),
Windows
窗体运行时
(runtime)
将自动根据复杂数据绑定控件中的当前选中项同步简单数据绑定控件中的属性
,例如,一个开发者可以用简单数据绑定把一个
TextBox
属性绑定到一个
Customer
列表,然后他们可以用复杂数据绑定把同一个列表绑定到一个
控件。当他们这么做了之后,随着他们在
中选择不同的条目,
TextBox
属性就会自动的重新绑定到
的当前选中条目(比如,
TextBox
将会显示当前选中的
Customer
)。在
Windows
窗体中,保持不同的绑定项目的同步性被称作
Currency Management
(字面翻译就是流通管理),核心的
Windows
Currentcy Management
引擎被一个叫做
CurrencyManager
的类型所实现。
例子:简单数据绑定到一个列表
/*******************************************************************
*设置 (使用 Visual Studio 窗体设计器)
* 添加一个DataGridVie到窗体Form (dataGridView1)
* 添加3个 TextBox到窗体Form(textBox1, textBox2 和textBox3)
* 添加下面的代码到Form.Load事件响应方法
******************************************************************/ /*******************************************************************
*创建一个Customer列表. 这个列表实例被命名为 blc
*注意: Customer 有这些属性: ID, Name and Rate
******************************************************************/ BindingList
Customer
BindingList
Customer
(); blc.Add(
Customer
Mr. Zero
, 10.0M));
blc.Add(
Customer
Mrs. One
, 15.0M));
blc.Add(
Customer
Dr. Two
, 20.0M)); /*******************************************************************
利用复杂数据绑定将DataGridView绑定到Customer列表
* 绑定(customer业务类型在上面有显示).
******************************************************************/ this
.dataGridView1.DataSource = blc; /*******************************************************************
* 绑定业务对象列表到TextBoxe. 这里使用简单数据绑定
* 绑定到一个列表中的某一项的属性上
******************************************************************/ this
.textBox1.DataBindings.Add(
.textBox2.DataBindings.Add(
.textBox3.DataBindings.Add(
Windows
窗体数据绑定引擎不仅可以保证属性和列表的同步,它还提供一些常用的服务来帮助简化这个处理过程。数据绑定引擎提供以下服务:
类型转换
(Type Conversion)
如果需要的话,
Windows
窗体将执行类型转换作为绑定处理的一部分。例如,如果一个业务对象的整型
类型的属性(比如
Customer.ID
)被绑定到一个控件的字符串
(string)
类型的属性(比如
TextBox.Text
)上时,数据绑定运行时将把整型值和字符串值互相转换。
Windows
窗体利用
TypeConverter
IFormattable
IConvertible
来执行类型转换。
格式化
Windows
窗体绑定支持利用
.NET Framework
格式化字符串来格式化目标数据。比如,当绑定一个业务对象的
Decimal
类型的属性(比如
Order.Total
)到一个控件的字符串类型的属性(比如
TextBox.Text
),一个格式化字符串(比如
)可以被指定,因此这个值可以被显示为本地化的货币显示形式(比如¥
Windows
窗体利用
IFormattable
来进行字符串格式化。
例子:格式化
/*******************************************************************
*设置 (使用 Visual Studio 窗体设计器):
* 添加 2个TextBoxe 到 Form (textBox1 和textBox2)
* 添加下面的代码到Form.Load事件响应方法
******************************************************************/ /*******************************************************************
* 数据源设置
* 创建一个叫做Numbers的表,并添加3列
* ID: int
* Name: string
* Cost: Decimal
******************************************************************/ DataTable
_dt; _dt =
DataTable
Number quot;
); _dt.Colum .Add(
_dt.Colum .Add(
_dt.Colum .Add(
decimal
)); _dt.Rows.Add(0,
, 10.0M);
_dt.Rows.Add(1,
, 11.1M);
_dt.Rows.Add(2,
, 12.2M); /*******************************************************************
* 绑定 TextBox.Text (string) 到Numbers.ID (integer)
* 绑定运行时将处理int和string之间的类型转换
******************************************************************/ this
.textBox1.DataBindings.Add(
); /*******************************************************************
* 绑定 TextBox.Text (string) 到Numbers.Cost
* 绑定运行时将把值显示成货币形式(¥value.00)
* 注意:这里手工创建了 Binding 并将它添加到控件的DataBinding集合
* 而不是使用DataBindings.Add 的重载方法.
******************************************************************/ Binding
Binding
); /* .NET Framework
货币格式化字符串
cb.FormatString =
添加绑定到
TextBox
.textBox2.DataBindings.Add(cb); 错误处理
Windows
窗体数据绑定整合了
Windows
ErrorProvider
控件。当使用
ErrorProvider
并且如果一个简单数据绑定操作失败的话,
ErrorProvider
控件将在用户界面元素上提供一个代表发生错误的可视反馈(一个错误图标)。
ErrorProvider
控件将查找在绑定期间发生的异常,另外,会在支持
IDataErrorInfo
接口的数据源上报告
IDataErrorInfo
例子:错误处理
/*******************************************************************
*设置 (使用 Visual Studio 窗体设计器):
* 添加2个 TextBoxe到Form (textBox1 和 textBox2)
* 添加一个ErrorProvider到 Form (errorProvider1)
* 添加下面的代码到Form.Load事件响应方法
******************************************************************/ /*******************************************************************
* 数据源设置:
*创建一个叫做Numbers的表,并添加3列
* ID: int
* Name: string
* Cost: Decimal
******************************************************************/ DataTable
_dt; _dt =
DataTable
Number quot;
); _dt.Colum .Add(
_dt.Colum .Add(
_dt.Colum .Add(
decimal
)); _dt.Rows.Add(0,
, 10.0M);
_dt.Rows.Add(1,
, 11.1M);
_dt.Rows.Add(2,
, 12.2M); /*******************************************************************
* 设置 ErrorProvider:
* 把它绑定到TextBox使用的同一个数据源上.
******************************************************************/ this
.errorProvider1.DataSource = _dt; /*******************************************************************
*绑定 TextBox.Text (string) 到Numbers.ID (integer)
* 绑定运行时将处理int和string之间的类型转换
******************************************************************/ this
.textBox1.DataBindings.Add(
); /*******************************************************************
*绑定 TextBox.Text (string) 到Numbers.Cost
* 绑定运行时将把值显示成货币形式(¥value.00)
* 注意:这里手工创建了 Binding 并将它添加到控件的DataBinding集合
* 而不是使用DataBindings.Add 的重载方法
******************************************************************/ Binding
Binding
); /* .NET Framework
货币格式化字符串
cb.FormatString =
添加绑定到
TextBox
.textBox2.DataBindings.Add(cb); Currency Management
BindingContext
Currency Management
Windows
窗体数据绑定提供的最重要的服务之一是
Currency Management
Windows
窗体数据绑定的上下文中,
Currency
只是为一个列表维护和同步当前项。在
Windows
窗体中,
Currency Management
通过一个叫做
CurrencyManager
的类型提供,这个
CurrencyManager
是一个抽象类
BindingManagerBase
的子类。
CurrencyManager
提供一组事件,包括
CurrentChanged
PositionChanged
,控件和开发者通过这组事件都能够监视到
Currency
中的改变。此外,
CurrencyManager
还提供一些属性像
Position
Current
,来允许控件和开发者设置和取回当前项(位置)。
Windows
窗体数据绑定的一个关键方面是,
Currency
不是被像
DataGrid
这样的控件所维护,而是由被多个控件共享的一个
CurrencyManager
的一个实例来维护。
Binding Context
当使用简单列表绑定(就是上面说过的针对列表的简单数据绑定)的时候,简单数据绑定的控件需要同步它的数据源中的当前项。为了做到这点,绑定需要得到它关联的
CurrencyManager
的当前项。绑定通过它的控件的
BindingContext
属性得到它的数据源的
CurrencyManager
,一个控件典型的是从它的父窗体中得到它的
BindingContext
BindingContext
是一个单窗体的
CurrencyManager
缓存,更确切地说,
BindingContext
是一个
BindingManagerBase
实例的缓存,而
BindingManagerBase
CurrencyManager
的基类。
举个例子,假设一个开发者有一个
Customer
列表,绑定到一个
DataGrid
控件(
DataGrid.DataSource
设置到一个
Customer
列表)。此外,开发者还有一个简单控件,比如一个
TextBox
,绑定到同一个列表(
TextBox
利用简单列表绑定把它的
绑定到
Customer
列表中的
属性),当在
DataGrid
中点击一项时,
DataGrid
将使被点击的那想成为当前选中项。
DataGrid
怎么做到的呢?
DataGrid
首先访问它的
BindingContext
属性获取它的数据源(列表)的
BindingManagerBase(CurrencyManager)
BindingContext
返回缓存的
BindingManagerBase
(如果不存在的话,会创建一个),然后
DataGrid
会使用
BindingManagerBase
来改变当前项(它通过设置
CurrencyManager
Position
属性来达到目的)。当一个简单数据绑定被构造出来之后,控件将得到与它的数据源关联的
BindingManagerBase(CurrencyManager)
,它将***
BindingManagerBase
事件,并且在
BindingManagerBase
的当前项改变时同步更新它的绑定属性(比如
属性)。正确的同步的关键是
DataGrid
TextBox
两者必须要使用相同的
CurrencyManager(BindingManagerBase)
。如果他们使用的是不同的
CurrencyManager
,那么当
DataGrid
中的条目发生改变时简单绑定的属性将无法正确更新。
正如前面提到的,控件(和开发者)能够利用一个控件的
BindingContext
属性得到一个与数据源关联的
BindingManagerBase
。当从
BindingContext
请求一个
BindingManagerBase
的时候,
BindingContext
将首先查到它的缓存看是否有被请求的
BindingManagerBase
。如果缓存中不存在这个
BindingManagerBase
BindingContext
将创建并返回一个新的(并且把它加入缓存)。
BindingContext
典型情况下对于每个窗体是全局的(子控件的代理他们父窗体的
BindingContext
),因此典型情况下
BindingManagerBase(CurrencyManagers)
被一个窗体上所有的控件所共享。
BindingContext
种形式:
获取一个给定数据源的
BindingManagerBase */
.BindingContext[dataTable]; /*
获取给定数据源和数据成员的
BindingManagerBase */
.BindingContext[dataSet,
Number quot;
第一种形式通常用来获取一个像
ADO.NET
DataTable
这样的列表的相关的
BindingManagerBase
。第二种形式用来获取含有子列表的父级数据源(比如含有子
DataTable
DataSet
BindingManagerBase
BindingContext
最令人不解的方面之一是使用不同的形式来指定同一个数据源,将导致两个不同的
BindingManagerBase
实例。迄今为止,这是控件绑定到相同的数据源但却没有同步的最常见原因(控件通过
BindingContext
来获取一个
BindingManagerBase
例子:控件同步
创建含有一个
DataTable
DataSet */
DataSet dataSet =
DataSet
DataTable dataTable = dataSet.Tables.Add(
Number quot;
); dataTable.Colum .Add(
dataTable.Colum .Add(
)); dataTable.Rows.Add(0,
dataTable.Rows.Add(1,
); /*******************************************************************
绑定第一个
DataGridView
TextBox
dataSet
Number rdquo;
DataGridView
将使用
BindingContext
得到一个数据源的
CurrencyManager
* DataGridView1
将使用以下形式的
BindingContext
* bmb = BindingContext[dataSet, Number rdquo;];
* textBox1
的文本绑定也将得到一个
BindingManagerBase,
并且使用如下的
BindingContext
* bmb = BindingContext[dataSet, Number];
dataGridView1
textBox1
将共享同一个
BindingManagerBase (CurrencyManager)
*******************************************************************/ this
.dataGridView1.DataSource = dataSet;
.dataGridView1.DataMember =
Number quot;
.textBox1.DataBindings.Add(
, dataSet,
Numbers.Name
); /*******************************************************************
dataTable
也指向这个
Number rdquo;
. 虽然
上面的
DataGridView
TextBox
DataSource
DataMember
绑定到表
现在也可以绑定到相同的表(和数据),通过直接绑定到
dataTable
,正如下面所示
当这么做的时候
, DataGridView2
将使用以下形式的
BindingContext
* bmb = BindingContext[dataTable];
* textBox12
的文本绑定也将使用如下的
BindingContext
* bmb = BindingContext[dataTable];
dataGridView2
textBox2
将共享相同的
BindingManagerBase (CurrencyManager)
然而他们将不会和
dataGridView1
textBox1
共享相同的
CurrencyManager,
因为他们使用不同的形式
来获取他们的绑定
*******************************************************************/ this
.dataGridView2.DataSource = dataTable;
.textBox2.DataBindings.Add(
, dataTable,
); 控制绑定操作
Windows
窗体简单绑定类型(
System.Windows.Forms.Binding
)允许开发者控制在用户界面元素内容发生改变时怎样和何时更新绑定的数据源属性,以及在数据源属性发生变化时怎样和何时更新用户界面元素。例如,如果一个开发者把
Customer
实例的
属性绑定到一个
TextBox
控件的
属性上,开发者可以指定何时把用户界面元素发生的更改传播到数据源。当前支持的选项是:在
TextBox
的验证
(validation)
期间(当用户将焦点移出
TextBox
时这是默认值);当文本值发生任何改变时;以及永不更新数据源。开发者也能够控制何时把数据源的更改更新到绑定到的用户界面元素。当前支持的选项的是:当数据源属性改变时(默认值)
永不更新。注意,开发者可以组合使用永不更新和调用绑定
ReadValue/WriteValue
)来提供他们自己的显示的数据源与用户界面元素间的数据同步规则。
例子:显示的绑定
/*******************************************************************
* 设置 (使用 Visual Studio 窗体设计器):
* 添加3个TextBoxe到窗体Form (textBox1, textBox2 and textBox2)
* 添加1个 ErrorProvider 到窗体Form (errorProvider1)
* 添加一个按钮Button到窗体Form (button1)
* 添加下面的代码到Form.Load 事件处理方法
******************************************************************/ /*******************************************************************
* 数据源设置:
* 创建一个叫做 Numbers的表并添加3列
* ID: int
* Name: string
* Cost: Decimal
******************************************************************/ DataTable
_dt; _dt =
DataTable
Number quot;
); _dt.Colum .Add(
_dt.Colum .Add(
_dt.Colum .Add(
decimal
)); _dt.Rows.Add(0,
, 10.0M);
_dt.Rows.Add(1,
, 11.1M);
_dt.Rows.Add(2,
, 12.2M); /*******************************************************************
* 设置 ErrorProvider:
* 把它绑定到TextBox使用的同一个数据源.
******************************************************************/ this
.errorProvider1.DataSource = _dt; /*******************************************************************
* 绑定 TextBox.Text (string) 到Numbers.ID (integer)
* 设置DataSourceUpdateMode 为 OnPropertyChanged. 这将
导致一旦
TextBox.Text
发生改变,就会立即更新数据源属性
在这种模式下
ErrorProvider
将立刻显示一个错误,而不是在用户把焦点
TextBox
之后才只显示一个错误
******************************************************************/ this
.textBox1.DataBindings.Add(
, DataSourceUpdateMode
.OnPropertyChanged); /*******************************************************************
* 绑定 TextBox.Text 到 Form.Size (在这个场景下, 窗体Form 是数据源)
* 不要让控件的改变更新到数据源(窗体Form)
******************************************************************/ Binding
sizeBinding =
Binding
, DataSourceUpdateMode
.Never);
.textBox2.DataBindings.Add(sizeBinding); /*******************************************************************
Button.Click
显示的更新数据源
(Form.Size).
使用匿名代理让代码更简洁
******************************************************************/ this
.button1.Click +=
delegate
button,
EventArgs
sizeBinding.WriteValue();
}; 上一篇:
下一篇:
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
个人资料
访问:
312639次
积分:
4364分
排名:
第645名
原创:
转载:
译文:
评论:
文章搜索
文章分类
文章存档
阅读排行
评论排行
最新评论如果您还没有注册到 IBM 注册系统,我们为给您带来的不便表示道歉,并请您马上注册。
IBM ID:
密码:
登录之后:
留在当前页面
My developerWorks 概要信息
My developerWorks 首页
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,概要信息中包括您的姓名和您在注册 developerWorks 时选择的昵称。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容显示在一起。
所有提交的信息确保安全。
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。
昵称长度在 3 至 31 个字符之间
。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
昵称:
则表示您同意developerWorks 的条款和条件。
所有提交的信息确保安全。
My developerWorks:
我的通知:
选择语言:
IBM 产品:
技术:
解决方案:
查找软件:
WPS/WESB 6.1 之 SCA 新特性,第 3 部分: HTTP 绑定的高级特性
绑定上下文,如何开发 HTTP 数据绑定和函数选择器,如何配置验证和 SSL
), 高级软件工程师, IBM
IBM CDL 高级软件工程师(Staff Software Engineer)。自2004年计算机专业硕士毕业后加入IBM,并一直负责WPS/WESB SCA 绑定的开发,包括 SCA JMS/MQJMS 绑定,SCA JCA 绑定 和 SCA HTTP 绑定。
, 软件开发工程师, IBM
吴卫 IBM CDL 软件工程师。2006 年加入 IBM,具有 3 年多的 WebSphere 相关产品的开发经验,包括 WebSphere adapter 开发 / 测试 / 支持,WebSphere Modeler 测试经验,对不同系统的集成应用开发具有深刻的理解和丰富的实践经验,并在 Developerworks 及其他计算机相关主流媒体发表过多篇文章。
简介: 在
,我们介绍了HTTP绑定的工作原理,以及 HTTP 绑定的 import 和 export 的一些基本属性和功能。在
,我们向您介绍了如何使用 WID 开发一个 HTTP 绑定的应用程序。本文是 HTTP 绑定系列文章的最后一篇,将重点介绍 HTTP 绑定的一些高级特性,如绑定上下文,如何开发 HTTP 数据绑定和函数选择器以及如何配置验证和 SSL。
发布日期: 2008 年 12 月 17 日
级别: 初级
访问情况 760 次浏览
建议: 要了解关于 SCA 的更多信息,请访问
,其中包括了最新的关于 SCA 方面的文章、教程等资源。
HTTP 绑定除了支持常用的 HTTP 协议功能之外,还支持用户验证和 SSL。本文将介绍如何在 HTTP 绑定中配置它们。另外,本文将先介绍绑定上下文以及如何开发一个HTTP绑定的函数选择器和数据绑定。
绑定上下文(binding context)是 WebSphere Proce Server (WPS) /WebSphere Enterprise Service Bus (WESB) 6.1 中引入的一个新特性。通过绑定上下文,用户可以在一次调用(会话)中实现数据绑定(data binding)和函数选择器(function selector)之间共享数据,只要这些数据绑定和函数选择器实现了接口
commonj.co ector.runtime.BindingContext
。这个接口只有一个方法:
public void setBindingContext(java.util.Map bindingContext)
比如,用户可以在输入数据绑定中,存储某些数据在共享 java.util.Map 中,然后在输出数据绑定中再使用这些数据。
另外,通过绑定上下文,HTTP 绑定也能够将某些运行时的数据传输给实现了绑定上下文接口
commonj.co ector.runtime.BindingContext
的数据绑定和函数选择器。这些数据包括:
键名(Key)
BindingContext.BINDING_NAME
Import或者Export的名字
BindingContext.BINDING_TYPE
只能为
BindingContext.BINDING_TYPE_HTTP
BindingContext.BINDING_COMMUNICATION
对Export,值为
BindingContext.BINDING_COMMUNICATION_INBOUND
对Import,值为
BindingContext.BINDING_COMMUNICATION_OUTBOUND
BindingContext.BINDING_INVOCATION
对消息请求,值为
BindingContext.BINDING_INVOCATION_REQUEST
对消息应答,值为
BindingContext.BINDING_INVOCATION_RESPONSE
BindingContext.EXPECTED_TYPE
输入或者输出数据类型
(javax.xml.name ace.QName)
通过绑定上下文,用户就可以在自己的数据绑定或者函数选择器中使用这些数据。
虽然 HTTP 绑定提供了一些数据绑定,但这些数据绑定并不能满足用户的所有需求,用户也可以根据自己的需求开发相应的数据绑定。本节将介绍如何开发一个自定义的 HTTP 数据绑定和函数选择器,并通过绑定上下文实现数据的共享。
在基础篇中我们已经简单的介绍了 HTTP 绑定的控制数据。为了开发一个数据绑定,我们必须理解每个控制数据的含义,以及它们的适用场景。下面是这些控制数据的基本信息:
缺省值
可能值
输入数据绑定
输出数据绑定
输入数据绑定
输出数据绑定
Version
1.0,1.1
DynamicOverrideURL
DynamicOverrideVersion
1.0,1.1
DynamicOverrideMethod
MediaType
Charset
Tra ferEncoding
identity
chunked
identity
ContentEncoding
identity
deflate
identity
ContentLength
StatusCode
ReasonPhrase
Authentication
:“忽略”表示用户无论在数据绑定里面如何设置数据的值,HTTP 绑定在发送消息请求或应答时都不会使用这些值。相反,“使用”表示 HTTP 绑定在发送消息请求或应答时将会使用这些值。
根据上表,用户可以根据自己的使用场景来设置这些值。例如,在 Import 中,如果用户希望通过在数据绑定中指定消息请求的 URL,则用户应该在输入数据绑定中修改 DynamicOverrideURL,而不是 URL。
接下来,我们将开发一个新的 HTTP 数据绑定 HTTPStreamDataBindingMap,这个数据绑定能够实现 SDO(Service Data Object)和名值对集合(key/value pair set)之间的转换。我们可以通过绑定上下文的 BindingContext.EXPECTED_TYPE 键值来获取 SDO 的数据类型并创建相应的 SDO 实例。
实现接口
在基础篇中讲过,所有的 HTTP 数据绑定都必须实现接口:
com.ibm.we here.http.data.bindings.HTTPStreamDataBinding
当然,数据绑定 HTTPStreamDataBindingMap 也要实现这个接口。
另外,为了获取 SDO 的数据类型,这个数据绑定也还必须实现绑定上下文接口:
commonj.co ector.runtime.BindingContext
下面清单 1 中是对此数据绑定的定义:
清单 1. 数据绑定定义
public cla HTTPStreamDataBindingMap implements HTTPStreamDataBinding, BindingContext {
private DataObject fieldDataObject;
private HTTPControl fieldControl;
private HTTPHeaders fieldHeader //store the native bytes data
tra ient private ByteArrayOutputStream nativeData = new ByteArrayOutputStream();
//store the bindingContext
private Map bindingContext;
public void setBindingContext(Map bindingContext) {
this.bindingContext = bindingContext;
数据转换
数据转换包括从原生数据(native data)到 SDO 和从 SDO 到原生数据的转换。
从原生数据到 SDO 的转换中,我们需要知道 SDO 的类型。另外,如何出现业务逻辑异常(Service Busine Exception),所创建的 SDO 应该是用来表示异常数据的,否则,所创建的 SDO 应该是用来表示业务数据的。本例中,我们在代码中直接指定了异常 SDO 的数据类型,对应业务数据的类型,我们通过绑定上下文来获取。在绑定上下文中,我们已经介绍过,这些数据是 HTTP 绑定在运行时设置的,因此我们可以在数据绑定的实现中直接使用。下面是从原生数据到 SDO 数据转换的参考代码。
清单 2. 从原生数据到 SDO 的数据转换
public void convertFromNativeData(HTTPI utStream i utStream)
throws DataBindingException, IOException {
//read bytes from i utStream into nativeData
if (nativeData.size() == 0) {
retur }
// create SDO from native data
Properties prop = new Properties();
prop.load(new ByteArrayI utStream(nativeData.toByteArray()));
if (isBusine Exception()) {
fieldDataObject =
DataFactory.INSTANCE.create(“http://OrderLib”, “FaultBO”);
QName expectedType = (QName) bindingContext.get(BindingContext.EXPECTED_TYPE);
fieldDataObject =
DataFactory.INSTANCE.create(
expectedType.getName aceURI(), expectedType.getLocalPart());
List sdopro = fieldDataObject.getType().getProperties();
for (int i = 0, size = sdopro .size(); i size; ++i) {
Property each = (Property)sdopro .get(i);
String value = prop.getProperty(each.getName());
if (value != null) {
fieldDataObject.set(each.getName(), value);
相对从原生数据到 SDO 的转换,从 SDO 到原生数据的转换要简单很多,这是因为我们已经知道 SDO 的数据类型,并能够获取 SDO 的相关信息,下面是从 SDO 到原生数据转换的参考代码。值得注意的是,我们必须在控制参数中设置原生数据的内容长度(content length),如果没有设置内容长度,HTTP 接收方将无法接收正确的原生数据。
清单 3. 从 SDO 到原生数据的数据转换
public void convertToNativeData() throws DataBindingException {
nativeData.reset();
if (fieldDataObject == null) {
fieldControl.setContentLength(nativeData.size());
retur }
List sdopro = fieldDataObject.getType().getProperties();
for (int i = 0, size = sdopro .size(); i size; ++i) {
Property each = (Property)sdopro .get(i);
Object value = fieldDataObject.get(each);
if (value != null) {
String line = each.getName() + " = " + value + "\n";
nativeData.write(line.getBytes());
} catch (IOException e) {
e.printStackTrace();
fieldControl.setContentLength(nativeData.size());
业务异常(Busine Exception)处理
我们遵循 HTTP 绑定提供的数据绑定设计原则,用 HTTP 消息头 IsBusine Exception 来表示此消息是否为业务逻辑异常消息,对应的值为 True 和 False,另外,如果是业务逻辑异常,还必须将消息的状态编码(Status Code)设置为 500 – 内部服务器错误(Internal Server Error)。
下面,我们来开发一个自己的函数选择器 URLQueryHTTPFunctionSelector,此函数选择器将URL 的参数(TargetFunctionName)的值作为本地方法返回。例如 URL:
http://localhost:9080/OrderSystemWeb/OrderExport?TargetFucntionName=orderProce ing
对应的本地方法为 orderProce ing。下面是对应的代码
清单 4. QueryString函数选择器
public cla URLQueryHTTPFunctionSelector extends HTTPFunctionSelector {
public String generateEISFunctionName(HTTPControl control, HTTPHeaders headers,
HTTPI utStream i ut) throws SelectorException {
String urlStr = control.getURL();
//Uniform Resource Identifiers : Generic * Syntax
//< cheme://authority> lt ath?query#fragment
int startIdx = urlStr.indexOf('?');
int endIdx = urlStr.indexOf('#');
String queryString = (endIdx ==-1)
? urlStr.su tring(startIdx + 1)
: urlStr.su tring(startIdx + 1, endIdx);
String[] params = queryString. lit("&am +");
String prefix = "TargetFunctionName=";
for (int i = 0; i params.length; ++i) {
if (params[i].startsWith(prefix)) {
return params[i].su tring(prefix.length());
return null;
前面,我们已经介绍了如何开发一个自定义的 HTTP 数据绑定和函数选择器。接下来,我们将介绍一些 HTTP 绑定的高级配置选项,包括配置验证(authentication)数据和 SSL(Security Socket Layer)数据。
本节包括如何配置 HTTP Export,让只有通过验证的客户访问此 HTTP Export 服务,以及如何配置 HTTP Import 去访问需要验证的 URL,包括 HTTP Export 的 URL。另外,需要注意的是,验证数据只有 WPS/WESB 的安全管理启动后才起作用,因此,用户必须在打开安全之后才能看到这些配置数据的效果。
开发流程
由于 HTTP Export 是以 servlet 的方式呈现给用户的,因此,配置 HTTP Export 的验证数据跟配置普通的 URL 的验证数据一样,并没有特殊的要求。下面我们简单的介绍一下在 WID 中如何配置这些验证数据。
1. 切换到 J2EE 视图。
2. 打开模块 OrderSystem 对应的 Web 工程 OrderSystemWeb 中的 web.xml 文件。
3. 切换到 security 标签页。
4. 在 Security Roles 中添加一个 role--customer。
5. 在 Security Co traints 中添加一个 co traint –PurchaseOrderExportAcce ,并在弹出的窗口中配置相应的数据,用于对 HTTP Export servlet 访问的控制,见图 1。
在Security 标签页中,选择 Security Co traints 表单里的 PurchaseOrderExportAcce ,在 Authorized Roles 中添加在步骤 4 中创建的 Role customer。下图 2 是配置完后的 security 标签页。
下面是此配置对应的 web.xml 清单
清单5. 验证数据配置清单
< ecurity-co traint
di lay-name
PurchaseOrderExportAcce lt;/di lay-name
web-resource-collectio gt;
web-resource-namePurchaseOrderExport/web-resource-name
url-patter gt;/PurchaseOrderExport/url-patter gt;
url-patter gt;/PurchaseOrderExport/*/url-patter gt;
http-methodGET/http-method
http-methodHEAD/http-method
http-methodPOST/http-method
/web-resource-collectio gt;
auth-co traint
descriptio gt;acce Role lt;/descriptio gt;
role-namecustomer/role-name
/auth-co traint
/security-co traint
< ecurity-role
role-namecustomer/role-name
/security-role
绑定用户
我们已经开发了一个验证的程序,但是,我们并没有指定角色 customer 对应的用户,这是在应用程序***后指定的。下面是角色到用户映射的步骤:
通过浏览器进入 WPS/WESB 管理控制台
进入 A licatio - Enterprise A licatio 点击***的 HTTP Export 应用程序 OrderSystemA 进入此程序的页面
点击Security role to user/group ma ing
选择角色 customer,点击 Look up users
点击 search 并添加一个或者多个用户
保存设置
这样,当 WPS/WESB 的安全管理启动后,只有 customer 角色对应的用户才能够访问此 HTTP Export。
当用 HTTP Import 去访问一个需要认证的 URL 时,包括上节配置的 HTTP Export 对应的servlet,我们必须在 Import 中配置相应的验证数据,下面是验证数据的模式(schema)定义:
清单 6. HTTP Import 验证模式定义
xml :http="http://www.ibm.com/xml /prod/we here/scdl/http/6.1.0"
xml :scdl="http://www.ibm.com/xml /prod/we here/scdl/6.0.0"
targetName ace="http://www.ibm.com/xml /prod/we here/scdl/http/6.1.0"
!--HTTP Authentication --
complexType name="HTTPAuthentication"
complexContent
exte ion base="scdl:Describable"
< equence
element name="credentials" type="http:HTTPCredentials"/
element name="authenticationType" type="http:HTTPAuthenticationType"/
/sequence
/exte io gt;
/complexContent
/complexType
!--HTTP Credentials --
complexType name="HTTPCredentials"
complexContent
exte ion base="scdl:Describable"
< equence
element name="credentialAlias" type="string"/
/sequence
/exte io gt;
/complexContent
/complexType
!-- Authentication Type, for now only Basic Auth is su orted --
< impleType name="HTTPAuthenticationType"
restriction base="string"
enumeration value="Basic"/
/restrictio gt;
/simpleType
从模式定义中可以看出,在 WPS/WESB 6.1 中,HTTP Import 绑定只支持基本验证(Basic Authentication)方式。
下面我们开发一个 HTTP Import 实例 OrderClient 来访问之前配置的 HTTP Export。下面是HTTP Import 的清单。
清单 7. HTTP Import 验证配置实例
?xml version="1.0" encoding="UTF-8"?
< cdl:import xml :xsi="http://www.w3.org/2001/XMLSchema-i tance"
xml :http="http://www.ibm.com/xml /prod/we here/scdl/http/6.1.0"
xml : 1="http://OrderLib/purchaseOrder"
xml :scdl="http://www.ibm.com/xml /prod/we here/scdl/6.0.0" xml :wsdl=
"http://www.ibm.com/xml /prod/we here/scdl/wsdl/6.0.0"
di layName="PurchaseOrderImport" name="PurchaseOrderImport"
interface gt;
interface xsi:type="wsdl:WSDLPortType" portType=" 1:purchaseOrder"/
/interface gt;
e Binding xsi:type="http:HTTPImportBinding"
defaultDataBinding="ordlib.data.HTTPStreamDataBindingMap"
importInteraction endpointURL=
"http://localhost:9080/OrderSystemWeb/PurchaseOrderExport"
httpMethod="GET"/
methodBinding method="orderProce ing"
importInteraction endpointURL=
"http://localhost:9080/OrderSystemWeb/PurchaseOrderExport?
TargetFunctionName= orderProce ing" httpMethod="GET"
requestAuthenticatio gt;
credential gt;
credentialAlia gt lNode01/OrderAuthenticationAlia lt;/credentialAlia gt;
/credential gt;
authenticationTypeBasic/authenticationType
/requestAuthenticatio gt;
/importInteractio gt;
/methodBinding
/e Binding
/scdl:import
对应的 WID 属性界面见图 3
另外,我们也需要在 WPS/WESB 控制台中配置相应的别名:nlNode01/OrderAuthenticationAlias,其中,n1Node1 是 WPS/WESB 的 node 名称。下面是配置步骤:
进入Security - Secure administration, a licatio , and infrastructure
展开右边选项 Java Authentication and Authorization Service - J2C authentication data
在新页面中新建一个别名 OrderAuthenticationAlias,配置相应的用户名和密码,并保存设置
:此用户名和密码是 HTTP Import 要访问的 URL 的验证用户名和密码,因此,必须保证与 URL 要求的用户名和密码一致。
:虽然我们创建的别名是 OrderAuthenticationAlias,但是保存后显示的别名为节点名/OrderAuthenticationAlias。在本例的环境中,显示为 n1Node01/OrderAuthenticationAlias。因此,在 Import 的配置文件中,也应该配置为 n1Node01/OrderAuthenticationAlias。
这样,HTTP Import 就能够访问 HTTP Export 对应的URL(
http://localhost:9080/OrderSystemWeb/PurchaseOrderExport/orderProce ing
)了。
当 HTTP Import 要去访问一个 htt 的 URL 时,必须在 Import 中配置 SSL。下面是配置了SSL 的 HTTP Import 实例:
清单 8. HTTP Import 的 SSL 配置实例
?xml version="1.0" encoding="UTF-8"?
< cdl:import xml :xsi="http://www.w3.org/2001/XMLSchema-i tance"
xml :http="http://www.ibm.com/xml /prod/we here/scdl/http/6.1.0"
xml : 1="http://OrderLib/PageHandler"
xml :scdl="http://www.ibm.com/xml /prod/we here/scdl/6.0.0"
xml :wsdl="http://www.ibm.com/xml /prod/we here/scdl/wsdl/6.0.0"
di layName="SSLDemoImport"
name="SSLDemoImport"
interface gt;
interface xsi:type="wsdl:WSDLPortType" portType=" 1:PageHandler"/
/interface gt;
e Binding xsi:type="http:HTTPImportBinding"
defaultDataBinding=
"com.ibm.we here.http.data.bindings.HTTPStreamDataBindingBytes"
importInteraction endpointURL="htt ://www.paypal.com/" httpMethod="GET"/
methodBinding method="getContent"
importInteraction endpointURL="htt ://www.paypal.com/" httpMethod="GET"
< lSetting gt;
< lConfigAlia gt;SSLDemoSetting lt;/ lConfigAlia gt;
/ lSetting gt;
/importInteractio gt;
/methodBinding
/e Binding
/scdl:import
另外,在 WPS/WESB 控制台中也要配置相应的 alias。下面,我们介绍一下如何在WPS/WESB 控制台中配置 SSL 的 alias。
1. 进入 Security) - SSL certificate and key management - 选择右边的Key stores and certificates:
a) 新建一个密钥库 SSLDemoKeyStore:
路径可以参考 WPS/WESB 已提供的密钥库(NodeDefaultKeyStore)。
设置密码 sdks。
其他保持默认值。
保存设置。
b) 新建一个信任库 SSLDemoTrustStore:
路径可以参考 WPS/WESB 已提供的信任库(NodeDefaultTrustStore)。
设置密码 sdts。
其他保持默认值。
保持设置。
2. 进入 Security - SSL certificate and key management - 选择右边的Key stores and certificates,新建一个签署者***:
点击 SSLDemoTrustStore
在右边的 Additional Properties 栏中点击 Signer certificates,进入配置页面
点击“添加”添加一个签署者***
用户可以通过 Internet Explorer 浏览器导出网站提供的***。
3. 进入 Security - SSL certificate and key management - 选择右边的 SSL configuratio ,新建一个 SSL 配置 SSLDemoSSLSettings。
信任库名选择 SSLDemoTrustStore
密钥库名选择 SSLDemoKeyStore
点击 Get certificate aliases 并保存
配置完后,HTTP Import 就能够访问相应的 URL(例如 http://www.paypal.com)了。
HTTP 绑定是 WPS/WESB 6.1 中的一个新特性,本文介绍了 HTTP 绑定中的一些高级特性的使用,开发和配置过程。通过本文,读者将能够更好的理解 HTTP 绑定,掌握相关的高级特性,并将这些高级特性运用在自己应用程序的开发中。
下载方法
HTTP 绑定代码示例
CodeSample.zip
:本文将主要介绍 HTTP 绑定的工作原理,以及 HTTP 绑定的 import 和 export 的一些基本属性和功能。
:介绍了如何使用 WID 开发一个 HTTP 绑定的应用程序。
:本文介绍了如何利用
的 HTTP 绑定提供易于被
客户端调用的 XML/HTTP 以及 JSON/HTTP 服务。
:全面地向您提供了 SCA 的各方面内容的相关资源。
:本文将介绍WPS中服务组件架构的概念,构成元素和基本的编程方法。
:本文介绍了如何在运行于 IBM WebSphere Proce Server Version 6 的 IBM WebSphere Adapters Version 6 中实现自定义数据绑定和自定义函数选择器。
:本文阐述如何在 WebSphere Proce Server 和 WebSphere Enterprise Service Bus 中捕获并处理错误条件,并介绍问题检测、重试行为、异常传播和报告。
:本文将通过一个简单的 SCA 服务组件调用的例子来说明它的实现方式,希望对读者能够有所启发。
:向您提供了关于 HTTP v1.1 协议的相关信息。
IBM CDL 高级软件工程师(Staff Software Engineer)。自2004年计算机专业硕士毕业后加入IBM,并一直负责WPS/WESB SCA 绑定的开发,包括 SCA JMS/MQJMS 绑定,SCA JCA 绑定 和 SCA HTTP 绑定。
吴卫 IBM CDL 软件工程师。2006 年加入 IBM,具有 3 年多的 WebSphere 相关产品的开发经验,包括 WebSphere adapter 开发 / 测试 / 支持,WebSphere Modeler 测试经验,对不同系统的集成应用开发具有深刻的理解和丰富的实践经验,并在 Developerworks 及其他计算机相关主流媒体发表过多篇文章。
static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, SOA and web services
ArticleID=359195
ArticleTitle=WPS/WESB 6.1 之 SCA 新特性,第 3 部分: HTTP 绑定的高级特性
publish-date=12172008
author1-email=binwang@cn.ibm.com
author1-email-cc=
author2-email=wwwu@cn.ibm.com
author2-email-cc=
文本框在 My developerWorks 中查找包含该标签的所有内容。
滑动条
调节标签的数量。
热门标签
显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。
我的标签
显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。
使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。
热门标签
显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。
我的标签
显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。
搜索所有标签 热门文章标签 | | 我的文章标签
分享此页面:
关注 developerWorks:
查找软件
关于 developerWorks
相关资源

参考资料

 

随机推荐