扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
示例应用程序:Innova Solutions 开发
我们将详细说明一家名为 Innova solutions 的虚构软件公司所进行的活动,该公司向其员工提供不同的服务,以便查看自己的工资单信息、休假详细信息、能力详细信息、个人信息和绩效评级。
以下示例说明了构建用于查看员工的工资单信息的服务的过程,可以通过 Web 应用程序和 Web 服务客户机访问此服务。Innova solutions 将其应用程序实现为两个模块,从而提供了可重用性和灵活性。这两个模块分别为 Payroll 模块和 Web 前端模块:
图 1. Payroll 模块关系图
innovasolutions.payrollmodule 模块表示 payroll 服务,此服务用于使用 Web 服务协议访问遗留系统中的员工工资单信息。它包含以下内容:
下图显示了 Web front-end 模块的不同组件:
图 2. Payroll front-end 模块
innovasolutions.webclientmodule 模块可对用于将信息记录到系统中和访问员工工资单信息的基于浏览器的功能起到促进作用。它包含以下内容:
应用程序开发
示例应用程序开发涉及到两个 SCA 模块的开发,下面我们将对此进行介绍。
创建 innovasolutions.payrollmodule
SCA 模块 innovasolutions.payrollmodule 是通过这样构建的:在文件系统中构建一个名为 innovasolutions.payrollmodule 的文件夹,并在该文件夹的根目录下放置一个 sca.module 文件。
清单 1 显示了 sca.module 的内容,该文件是一个 xml 文件。
清单 1. sca.module<?xml version="1.0" encoding="ASCII"?> <module xmlns="http://www.osoa.org/xmlns/sca/0.9" name="innovasolutions.payrollmodule"> </module> |
Payroll Data Service Implementation:我们首先创建由 PayrollDataService 服务提供的 PayrollDataService 接口;此服务向其员工提供工资单信息。然后,我们将创建 PayrollDataServiceImpl,以向 Innova solutions 的员工提供 PayrollDataService 服务。
我们创建名为 services/payrolldata 的子目录,并将所有组成 PayrollDataServiceImpl 实现的文件放置到其中。
清单 2 显示了 PayrollDataService Java 接口。
清单 2. PayrollDataService Java 接口package services.payrolldata; public interface PayrollDataService { float getBasic(String employeeID); float getvariablePay(String employeeID); float getHRA(String employeeID); float getProvidentFund(String employeeID); float getConveyance(String employeeID); float getIncomeTax(String employeeID); float getProfessionalTax(String employeeID); float getNetPay(String employeeID); } |
清单 3 说明了 PayrollDataServiceImpl Java 实现。
清单 3. PayrollDataServiceImpl Java 实现package services.payrolldata; @Service(PayrollDataService.class) public class payrollDataServiceImpl implements payrollDataService { public float getBasic(String employeeID){ . . . } public float getVariablePay(String employeeID){ . . . } public float getHRA(String employeeID){ . . . } public float getProvidentFund(String employeeID){ . . . } float getConveyance(String employeeID){ . . .} float getProfessionalTax(String employeeID){ . . . } public float getNetPay(String employeeID){ . . . } } |
上面的代码片段实现了之前的 PayrollDataService 接口。在实现中使用了一个 @Service Annotation 来声明服务及其接口。
清单 4 显示了上述实现的组件类型、side 文件。
清单 4. 组件类型、side 文件<xml version="1.0" encoding="ASCII"?> <componentType xmlns="http://www.osoa.org/xmlns/sca/0.9"> <service name="payrollDataService"> <interface.java interface="services.payrolldata.PayrollDataService"/> </service> </componentType> |
Payroll Data Service Component:SCA 组件是通过配置实现的引用和属性创建的。配置引用需要将其连接到其他组件提供的服务或外部服务。此处,我们将通过配置 PayrollDataServiceImpl 创建 PayrollDataServiceComponent。
将使用 component 元素将所创建的 SCA 组件添加到 sca.module 文件,该元素具有一个 name 属性,指定组件的名称。
清单 5 显示了创建 payrollDataServiceComponent 后的 sca.module 文件。
清单 5. 创建了 payrollDataServiceComponent 后的 sca.module 文件
<?xml version="1.0" encoding="ASCII"?> <module xmlns="http://www.osoa.org/xmlns/sca/0.9" name="innovasolutions.payrollmodule"> <component name="payrollDataServiceComponent"> <implementation.java class="services.payrolldata.PayrollDataServiceImpl"> </component> </module> |
创建 TaxRateRules Web 服务外部服务:此处我们将创建一个外部服务 TaxRateRulesService,以提供向 innovasolutions.payrollmodule 的员工提供 TaxRateRulesService 接口的服务。
我们首先创建一个名为 services/taxraterules 的子目录,以将 TaxRateRulesService 外部服务所需的所有文件放入其中。业务合作伙伴实际实现此外部服务,将提供一个 TaxRateRulesService.wsdl。为了处理静态数据类型,我们为 wsdl portType 创建了对应的 Java 接口。
清单 6 显示了 wsdl portType 的 Java 接口的大致情况。
清单 6. wsdl portType 的 Java 接口
package services.taxrate; public interface TaxRateRulesService { public float getTaxRate (Float taxableIncome); } |
接下来,我们将以下代码添加到前面指定的 sca.module 文件,以创建名为 TaxrateRulesService 的外部服务。
清单 7 显示了添加 TaxrateRulesService 后的 sca.module 文件。
清单 7. 添加 TaxrateRulesService 后的 sca.module 文件
<externalService name="TaxRateRulesService"> <interface.java interface="services.taxraterules.TaxRateRulesService"/> <binding.ws port="http://www.taxrules.com/ TaxRateRulesService # wsdl.endpoint(TaxRateRulesService / TaxRateRulesService SOAP)"/> </externalService> |
Payroll Service Implementation:此处我们将讨论 PayrollServiceImpl 的实现,该实现提供一个服务,此服务在 innovasolutions.payrollmodule 中向其员工提供 PayrollService 接口。此实现使用两个其他服务提供的接口引用这两个服务,即 PayrollDataService 接口(本地服务)和 TaxRateRulesService 接口(外部服务)。
我们将首先创建名为 services/payroll 的子目录,并将所有组成 PayrollServiceImpl 实现的文件放入其中。
清单 8 显示了 PayrollService Java 接口。
清单 8. PayrollService Java 接口
package services.payroll; import org.osoa.sca.annotations.Remotable; @Remotable public interface PayrollService{ public PayrollStatement getPayrollStatement(String employeeID); |
上面的 PayrollService Java 接口包含一个 getPayrollStatement() 方法,其参数是 employeeID,将返回 PayrollStatement 对象。由于这需要为外部服务,因此使用 @Remotable Annotation 将接口声明为远程接口。在此实现中,通过远程服务交换的所有参数都是服务数据对象(Service Data Objects,SDO)类型的数据。
清单 9 显示了 PayrollStatement Java 接口。
清单 9. PayrollStatement Java 接口
package services.payroll; import java.util.List; public interface PayrollStatement { List getPayrollDetails(); float getNetPay(); } |
清单 10 显示了 PaySplitUP Java 接口。
清单 10. PaySplitUP Java 接口
package services.payroll; public interface PaySplitUP { String getPaycategory(); void setPaycategory(String payCategory); void setEarnings(); void setDeductions(); float getEarnings(); float getDeductions(); } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者