什么是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 ...
随机推荐
- MyBatis 知识点梳理
简单地梳理下MyBatis相关的知识点,主要想让自己重新捡起以前学的框架,如果能给广大程序猿朋友有所帮助那就更好了.有疏漏的地方也欢迎大家评论指出.闲言少叙,进入正题....... MyBatis知识 ...
- Hibernate 学习(三)
一.关系映射 实体类之间的关联映射以及表之间的关系是 ORM 的灵魂之处.对象间的关系的子集可以用下列四种方式解释.关联映射可以是单向的也可以是双向的. 映射类型 描述 Many-to-One 使用 ...
- 第6章 征服CSS3选择器(上)
属性选择器 在HTML中,通过各种各样的属性可以给元素增加很多附加的信息.例如,通过id属性可以将不同div元素进行区分. 在CSS2中引入了一些属性选择器,而CSS3在CSS2的基础上对属性选择器进 ...
- js如何判断字符串里面是否含有某个字符串
方法一: indexOf() (推荐) var str = "123"; console.log(str.indexOf("3") != -1 ); // tr ...
- 洛谷P2196 挖地雷(dp)
题意 题目链接 Sol 早年NOIP的题锅好多啊.. 这题连有向边还是无向边都没说(害的我wa了一遍) 直接\(f[i]\)表示到第\(i\)个点的贡献 转移的时候枚举从哪个点转移而来 然后我就用一个 ...
- Angular的生命周期钩子
没有什么不能用一张图来解决.
- 《火星救援》NASA惊现lisp
duang-跳出个界面上面一个lisp程序.
- eclipse 出现 jar包找不到 问题记录
同事在下载maven私服项目的时候,自动更新失败.maven 一直提示 parent 更新失败但是其他的项目都是正常的,这就奇怪了. 最后 仔细查询后,发现是 同事在下载项目时候,项目是分clien ...
- bootstrap colorscheme以及theme自动生成
http://paintstrap.com/ 是一个根据adobe kuler color scheme自动生成theme 的工具,比较直观好用,对于调整前端theme有一定参考意义
- IT装B小技巧
1.编写简单的关机脚本 新建一个文本文档,将代码复制上去,将后缀改成bat,双击运行 @echo off shutdown -s -t 2.语音播报 新建一个文本文档,将代码复制上去,将后缀改成vbs ...
