这个页面展示了一个现代的 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视图,设计上考虑了可扩展性。举例,当渲染一个对象的集合时,表现为多个视图中的一个,显示在下拉选框中:

(非ASF) Isis 动作 库里有一些这个的扩展。例如 gmap3 组件 渲染实现了Locatable 接口的任何领域实体 (像 ToDoItem):

类似的 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 插件提供了一组丰富的模块用于支持各类划分的概念。

活动菜单下有4组服务支撑 用户会话/审计 , 命令扼要(对象变更) 审计 (展示) 及(内部系统) 事件发布

安全菜单通过安全模块提供了一组丰富的安全功能 :

原型菜单里可以下载 GNU gettext 格式文件 .po来做翻译。可以将此文件翻译成多种语言,以支持不同的地区。注意这个是of Apache Isis 的核心功能(不是插件):

Isis 插件里还提供了管理应用程序和用户设置的模块。大部分应用不会直接开放这些服务 (包括todoapp这个示例) ,不过通常根据应用程序,把这些设置进行打包,而不是直接使用设置模块服务:

多权支持

安全模块 有着其它插件大部分的功能。有一个显著的功能是通过 "使用权" 将对象和用户关联起来。todoapp 示例中使用了这个功能,这样不同用户下todo 项就一直各自分开。管理员可以调整其它用户的 "使用权",用于获取访问对象的权限:

看多详情见 安全模块

安全模块 的服务都建在安全模块之上,通常只能由管理指定。保持与 "me" 动作分开:

如果授予了权限,用户就可以访问与之相关的实体:

非必要的属性也可以通过安全或通过“内部事件总线”来隐藏(后边会介绍)。反之,可以使用前边所说贡献属性/集合将额外的属性“嫁接到”用户。

主题

Apache Isis' Wicket 实力使用 Twitter Bootstrap,这就意味着可以设置主题。如果应用中配置了多个主题,最终用户就可以切换实力的风格了:

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的更多相关文章

  1. 利用Apache Isis快速原型化-宠物诊所的宠物管理

    前言 Apache Isis是DDD方法的一个实现框架. 需求分析 宠物诊所需要记录宠物的资料,包括类型.名字.及其主人. 多个宠物可能同属于一个主人. 宠物可能更换主人. 宠物主人记录姓名,我们可以 ...

  2. Apache 项目列表功能分类便于技术选型

    big-data (49):  Apache Accumulo  Apache Airavata  Apache Ambari  Apache Apex  Apache Avro  Apache Be ...

  3. apache基金会开源项目简介

    apache基金会开源项目简介   项目名称 描述 HTTP Server 互联网上首屈一指的HTTP服务器 Abdera Apache  Abdera项目的目标是建立一个功能完备,高效能的IETF ...

  4. 让isis支持高德地图

    概述 由于项目需要用到地图,虽然isis的插件库里有个现成的地图实现,不过用的google地图,虽然google地图可以不用注册Appkey,但完全打不开.所以打算改成国产地图. 效果 先看下运行效果 ...

  5. maven命令行创建web项目报错:java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils

    早上一上班就想新建一个web项目玩玩,没想到一敲命令创建就失败了,真是出师不利.各种折腾无果,当然我也可以用eclipse直接创建的,就是不甘心被这破问题给耍了.刚刚才发现问题原因,这个结果我也是醉了 ...

  6. ASF (0) - ASF Java 项目总览

    Apache .NET Ant Library This is a library of Ant tasks that help developing .NET software. It includ ...

  7. 使用Maven命令行快速创建项目骨架(archetype)

      > mvn archetype:generate 接下来就会输出一些列带索引变化的archetype项可供我们选择,然后提示我们选择一个编号,可以直接回车选择默认的编号(392),然后就跟着 ...

  8. 【Other】最近在研究的, Java/Springboot/RPC/JPA等

    我的Springboot框架,欢迎关注: https://github.com/junneyang/common-web-starter Dubbo-大波-服务化框架 dubbo_百度搜索 Dubbo ...

  9. Eclipse折叠代码 coffee bytes code folding

    提供一个插件下载地址,博客园的: http://files.cnblogs.com/wucg/com.cb.eclipse.folding_1.0.6.jar.zip  将下载的zip文件解压出来的j ...

随机推荐

  1. Java - 深拷贝技巧

    先让我描述一下问题:我在某Action(struts2.x)-A中写了一个功能P,以当前用户的某个标识F == 1时需要走这个功能,而且这个功能因某些原因已经侵入到了其他一些method中.顺便一提, ...

  2. 【转】XDocument简单入门

    1.什么是XML? 2.XDocument和XmlDocument的区别? 3.XDocument 4.XmlDocument 5.LINQ to XML 6.XML序列化与反序列化 因为这几天用到了 ...

  3. Spring Cloud实战之初级入门(五)— 配置中心服务化与配置实时刷新

    目录 1.环境介绍 2.配置中心服务化 2.1 改造mirco-service-spring-config 2.2 改造mirco-service-provider.mirco-service-con ...

  4. JavaScript之parseInt()数值转换常被忽略的问题

    使用parseInt()你可以从字符串中获取数值,该方法接受另一个基数参数,这经常省略,但不应该.当字符串以”0″开头的时候就有可能会出问题,例如,部分时间进入表单域,在ECMAScript 3中,开 ...

  5. python 中 \n 和转义r的作用和\r的实际应用

    我们先看看这张转义字符图: 1. 知识储备 \r 表示将光标的位置回退到本行的开头位置 \b 表示将光标的位置回退一位 在 python 语言中, 使用 print 打印输出时,默认是会进行换行的.如 ...

  6. HTML学习笔记《二》 ----HTML部分标签应用

    HTML 部分标签应用 一.HTML中的注释.标签语法以及颜色表示方式 1.HTML中注释: <!-- .... --> 注释的目的:1. 辅助说明 2.代码调试(不同编程语言,注释方式略 ...

  7. IOS如何下载旧版本应用APP

    前言 文章相对来说比较复杂,特别是查找版本ID对应的步骤,这里推荐使用另一种方案,操作起来更简单. 本文介绍如何使用Workflow及Fiddler下载IOS旧版本APP应用. 实现原理 通过Work ...

  8. 2-3 Sass的函数功能-列表函数

    列表函数主要包括一些对列表参数的函数使用,主要包括以下几种: length($list):返回一个列表的长度值: nth($list, $n):返回一个列表中指定的某个标签值 join($list1, ...

  9. chrome调试工具DevTools的使用 以及 localhost在移动端不能访问的问题

    1.手机和pc 都需要装 chrome浏览器 2.手机端打开开发者模式和usb调试 (华为nova的手机小坑,需要选择usb 配置为可传输文件的状态) 3.经过以上操作打开chrome://inspe ...

  10. EasyUI combobox 加载JSON数据

    Action返回 JSON 格式如下: jsonResult = { total=7,rows=[ {TEXT=技术支持, ID=402894ca4419acf1014419b148a10000}, ...