什么是Apache Isis
这个页面展示了一个现代的 Apache Isis 应用程序的外观。
下边是Isis 插件里的 todoapp 示例 (非 ASF)截图,你可以随意使用。 界面里对应的领域类可以在这里找到。
这个 todoapp 同时集成了许多 Isis 插件 模块。因为我们觉得大部分应用终将会用到其中的一个或多个,我们选择包括这些插件的截图。
基础
我们从基础开始…
登录
Apache Isis 集成 Apache Shiro。核心框架支持基于文件的领域,同时 Isis 插件 安全模块 (非ASF) 提供了一个优良的用户子领域,角色和许可对应的功能继承于 Apache Isis metamodel。这个 todoapp 示例集成这个安全模块。
安装Fixtures
Apache Isis 有大量功能用于创建应用原型和全面的测试。比如其中的 fixture 脚本,可以向正在运行的程序安装预存的数据。这如果编故事有了一个好的开头;随后在功能开始实现的时候,相同的 fixture 脚本可重用于实现的功能的集成测试。 (后续测试用的更多)。
仪表盘和视图模型
多数时候最终用户界面都在展示持久化的领域实体,但 Apache Isis 还支持聚合多个数据源的视图模型。 todoapp 示例用了一个 "仪表盘"视图模型列出 todo 里的未处理完项与已完成项。
通常我们建议初始关注点只放在领域实体上;这样有助于驱动出好的领域模型。之后在视图模型上引入以支持特定的用户案例。
领域实体
下边的截图是todoapp的ToDoItem领域实体。如同其它的网页,这个界面在运行时直接从领域对象自身生成。没有控制器和
HTML 。
除领域实体外, Apache Isis 允许给予布局元数据提示, 比如指定属性分组,指定这些分组在列中的位置,动作(按钮)与属性或集合间的关联,按钮上的图标等。 元数据可以通过注解或XML的形式指定。带来的好处就是不用重启应用进行更新(重画界面)。
任何生产就绪的应用都需要这个元数据,不过 (像前边讨论的视图模型) 元数据可以逐步回到顶层的核心领域模型中。
编辑属性
领域实体的属性默认都是可以编辑的,意思就是可以直接更改。在 todoapp 例子里, ToDoItem的description就是一个可编辑的属性:
注意有些属性包括编辑模式都是只读的;每个属性都可以设为不可编辑。也可能禁用所有的属性以强制通过动作来更改 (往下)。
动作
修改实体的另一种方式是调用一个动作。下边的截图是 ToDoItem的目录和子目录可以用动作一起更新
:
不限制动作做哪些事情; 可能只更新单个对象,可以更新多个对象。或者根本不更新任何对象,但可以执行其它的一些活动,如发送或打印文档。
通常尽管所有动作都关联到一些对象,且由对象实现(仅初始化): 好的旧式封闭。我们有时用这个术语 "行为上完成" 表述这类的领域模型。
混元
用作领域对象上替换动(业务逻辑)作的备用品,可以代替换到一个 混元对象里边。对象被 Apache Isis渲染时,混元"贡献" 自己的行为给领域对象 (类似面向对象的样子).
下载截图中高亮了 "导出 xml" 动作, "相对优先级" 属性 (和 "上一步" 及 "下一步"动作) "类似" 集合和两个 "作为DTO" 动作都贡献了自己的混元:
可扩展视图
本页剩下的截图是 v1.10.0 的, 在 v1.12.0之前用在标签里的。 |
Apache Isis 用的是 Apache Wicket视图,设计上考虑了可扩展性。举例,当渲染一个对象的集合时,表现为多个视图中的一个,显示在下拉选框中:
类似的 Isis 插件 fullcalendar2 component (非ASF) 渲染任何实现Calendarable
接口的实体 (比如ToDoItem
) :
还有另一个 "视图" (相当简单)也是 Isis 插件叫excel component (非ASF)。上边有一个下载按钮将数据表变成电子表格:
上边的截图还展示了 "export to Word" 动作。 这个不算视图而是一个动作 (贡献) , Isis docx module (非ASF) 用于邮件合并:
注意 Isis 插件并不 ASF的组成部分,但他们都使用 Apache License 2.0 许可并且由Apache Isis 提交者维护. |
安全,审计等…
如同给 UI作扩展, (非 ASF) Isis 插件提供了一组丰富的模块用于支持各类划分的概念。
安全菜单通过安全模块提供了一组丰富的安全功能 :
原型菜单里可以下载 GNU gettext 格式文件 .po来做翻译。可以将此文件翻译成多种语言,以支持不同的地区。注意这个是
of Apache Isis 的核心功能(不是插件):
Isis 插件里还提供了管理应用程序和用户设置的模块。大部分应用不会直接开放这些服务 (包括todoapp这个示例) ,不过通常根据应用程序,把这些设置进行打包,而不是直接使用设置模块服务:
多权支持
安全模块 有着其它插件大部分的功能。有一个显著的功能是通过 "使用权" 将对象和用户关联起来。todoapp 示例中使用了这个功能,这样不同用户下todo 项就一直各自分开。管理员可以调整其它用户的 "使用权",用于获取访问对象的权限:
看多详情见 安全模块。
我
安全模块 的服务都建在安全模块之上,通常只能由管理指定。保持与 "me" 动作分开:
如果授予了权限,用户就可以访问与之相关的实体:
非必要的属性也可以通过安全或通过“内部事件总线”来隐藏(后边会介绍)。反之,可以使用前边所说贡献属性/集合将额外的属性“嫁接到”用户。
REST API
除了Apache Isis' Wicket 视图,还提供了丰富的REST API以及全部的超媒体控件,领域对象中自动生成(实体及视图模型)生成这些控件。框架提供了两种默认的展现形式,一个实现了 Restful Objects 规范,另一个适合自定义 Javascript 应用简单的表述。其它展现方式以插件的方式引入。
下边是用的Chrome插件来展示访问 Restful Objects 描述API 来访问的截图:
框架自动集成了Swagger,,生成领域对象模型的Swagger规范。这个规范下会生成 REST 客户端代码;然后用 通过Swagger UI 来访问REST API:
集成测试支持
前边我们注意到Apache Isis 可以通过界面来设置硬装。 相同的硬装脚本也可以在集成测试里重用。比如下边的代码片段展示了FixtureScripts
服务如何注入到集成测试中后来初始化数据的:
测试本身运行于 junit。而这些集成测试 (所谓的写到数据库),并不比常规的单元测试复杂:
Apache Isis里必须模拟业务规则,领域对象封装成代理。例如,如果使用Wicket视图,然后Apache Isis就会强制使用“结束项不能包含’结束‘行为”这个规则 ( ToDoItem类里的实现
)来调用。包装器在模拟的时候会抛出类似的异常:
内联事件总线
前边讨论的贡品,用于确保 Apache Isis 中包的唯一性;通过释放行为让各个包之间的依赖顺序得到有效的保留。
Apache Isis的内联事件总线是另一个确保可维护性的重要工具。用示例比较容易说明问题,下边边码演示了 "complete" 行为需要引发ToDoItem.Completed
事件:
领域服务 (应用程序范围,无状态)可以订阅事件:
这个测试验证结束一个行为引起订阅者的调用:
实际上,领域事件的触发不止一次,而是 (最高) 5 次。3次在执行期间,为了检查行为是否可用,启用行为并且参数有效。 执行为会更加优先调用,不过也可以执行后调用。这就是说如果行为可以使用,订阅者是否访问一些发布的对象,且或表现为级联的更新.
另外,所有的属性集合都可以触发领域事件,不仅是行为。因为,订阅都可以打开或关闭程序中某一部分。其实,示例 todoapp 已经演示了这个。
什么是Apache Isis的更多相关文章
- 利用Apache Isis快速原型化-宠物诊所的宠物管理
前言 Apache Isis是DDD方法的一个实现框架. 需求分析 宠物诊所需要记录宠物的资料,包括类型.名字.及其主人. 多个宠物可能同属于一个主人. 宠物可能更换主人. 宠物主人记录姓名,我们可以 ...
- Apache 项目列表功能分类便于技术选型
big-data (49): Apache Accumulo Apache Airavata Apache Ambari Apache Apex Apache Avro Apache Be ...
- apache基金会开源项目简介
apache基金会开源项目简介 项目名称 描述 HTTP Server 互联网上首屈一指的HTTP服务器 Abdera Apache Abdera项目的目标是建立一个功能完备,高效能的IETF ...
- 让isis支持高德地图
概述 由于项目需要用到地图,虽然isis的插件库里有个现成的地图实现,不过用的google地图,虽然google地图可以不用注册Appkey,但完全打不开.所以打算改成国产地图. 效果 先看下运行效果 ...
- maven命令行创建web项目报错:java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
早上一上班就想新建一个web项目玩玩,没想到一敲命令创建就失败了,真是出师不利.各种折腾无果,当然我也可以用eclipse直接创建的,就是不甘心被这破问题给耍了.刚刚才发现问题原因,这个结果我也是醉了 ...
- ASF (0) - ASF Java 项目总览
Apache .NET Ant Library This is a library of Ant tasks that help developing .NET software. It includ ...
- 使用Maven命令行快速创建项目骨架(archetype)
> mvn archetype:generate 接下来就会输出一些列带索引变化的archetype项可供我们选择,然后提示我们选择一个编号,可以直接回车选择默认的编号(392),然后就跟着 ...
- 【Other】最近在研究的, Java/Springboot/RPC/JPA等
我的Springboot框架,欢迎关注: https://github.com/junneyang/common-web-starter Dubbo-大波-服务化框架 dubbo_百度搜索 Dubbo ...
- Eclipse折叠代码 coffee bytes code folding
提供一个插件下载地址,博客园的: http://files.cnblogs.com/wucg/com.cb.eclipse.folding_1.0.6.jar.zip 将下载的zip文件解压出来的j ...
随机推荐
- Java - 深拷贝技巧
先让我描述一下问题:我在某Action(struts2.x)-A中写了一个功能P,以当前用户的某个标识F == 1时需要走这个功能,而且这个功能因某些原因已经侵入到了其他一些method中.顺便一提, ...
- 【转】XDocument简单入门
1.什么是XML? 2.XDocument和XmlDocument的区别? 3.XDocument 4.XmlDocument 5.LINQ to XML 6.XML序列化与反序列化 因为这几天用到了 ...
- Spring Cloud实战之初级入门(五)— 配置中心服务化与配置实时刷新
目录 1.环境介绍 2.配置中心服务化 2.1 改造mirco-service-spring-config 2.2 改造mirco-service-provider.mirco-service-con ...
- JavaScript之parseInt()数值转换常被忽略的问题
使用parseInt()你可以从字符串中获取数值,该方法接受另一个基数参数,这经常省略,但不应该.当字符串以”0″开头的时候就有可能会出问题,例如,部分时间进入表单域,在ECMAScript 3中,开 ...
- python 中 \n 和转义r的作用和\r的实际应用
我们先看看这张转义字符图: 1. 知识储备 \r 表示将光标的位置回退到本行的开头位置 \b 表示将光标的位置回退一位 在 python 语言中, 使用 print 打印输出时,默认是会进行换行的.如 ...
- HTML学习笔记《二》 ----HTML部分标签应用
HTML 部分标签应用 一.HTML中的注释.标签语法以及颜色表示方式 1.HTML中注释: <!-- .... --> 注释的目的:1. 辅助说明 2.代码调试(不同编程语言,注释方式略 ...
- IOS如何下载旧版本应用APP
前言 文章相对来说比较复杂,特别是查找版本ID对应的步骤,这里推荐使用另一种方案,操作起来更简单. 本文介绍如何使用Workflow及Fiddler下载IOS旧版本APP应用. 实现原理 通过Work ...
- 2-3 Sass的函数功能-列表函数
列表函数主要包括一些对列表参数的函数使用,主要包括以下几种: length($list):返回一个列表的长度值: nth($list, $n):返回一个列表中指定的某个标签值 join($list1, ...
- chrome调试工具DevTools的使用 以及 localhost在移动端不能访问的问题
1.手机和pc 都需要装 chrome浏览器 2.手机端打开开发者模式和usb调试 (华为nova的手机小坑,需要选择usb 配置为可传输文件的状态) 3.经过以上操作打开chrome://inspe ...
- EasyUI combobox 加载JSON数据
Action返回 JSON 格式如下: jsonResult = { total=7,rows=[ {TEXT=技术支持, ID=402894ca4419acf1014419b148a10000}, ...