翻译自 http://spring.io/guides/tutorials/web/1/。
首发于 http://my.oschina.net/u/179755/blog/232779。
第1步:核心和Web域建模
对于我们的Yummy面馆Web前端的第一版而言,重点部分是查看菜单和创建监控订单。
人们很容易将核心订单域暴露给外部世界,并从那里开始构建,但是这样将忽略核心和Web域之间的边界,从而导致内部应用结构驱动Web前端,因此而与内部结构耦合。
我们需要向用户暴露的那部分用户可见前端(Web域)需要以某种对这些用户友好的速率持续改进。核心域需要以适应Yummy面馆系统需求内部演进的速率来演进。这两个域之间由于它们演进的速率的不同,可能存在潜在的冲突。
为了管理这种冲突,我们需要在Web域创建它特有的概念和组件,这些组件能够以Web域的演进速率来演进。这可能会导致拥有跟核心域相似的组件类型,但是因为它们的目的是如此的不同,相似之处是表面的。
在核心域,概念作为应用程序域的内部通用语言部分捕捉出来。在Web域,概念仅仅只是作为暴露公共Web前端的目的而存在。
Yummy面馆的核心应用程序域组件
打开初始项目,在src/main/java/com/yummynoodlebar/core/domain下,我们将发现核心组件,以及Yummy面馆的应用程序内部域。
Customer。用户名,地址,订单发送的联系名。
Order。系统中的一个订单,关联了状态,以及状态历史以跟踪。
OrderStatus。订单的当前状态。
本教程重点介绍订单域类,com.yummynoodlebar.events.orders中的事件类可以作用在这些订单域类上。
在这种情况下,事件类起到了解耦的作用,将域概念从多变的集成域(这些集成域需要访问核心并在其上工作)和Yummy面馆应用程序核心分离出来。
我们将为Web使用的订单事件类包括
CreateOrderEvent和OrderCreatedEvent。用于请求新建订单及其完成确认。
RequestOrderDetailsEvent和OrderDetailsEvent。用于请求订单详情及其应答。
RequestOrderStatusEvent和OrderStatusEvent。用于请求订单当前状态及其应答。
用户交互建模
当我们构建Web应用程序的时候,我们是为人类构建。这看起来很明显,但是它对我们的Web域的设计和建模有很大的影响。
最重要的:
用户希望能再次访问任何他们之前看过的URL。这些URL很大可能将被拷贝和粘贴。
用户希望能随意访问网站。
用户希望能随意使用浏览器的前进和后退按钮。
来自HTML表单的HTTP GET和POST的用户体验是截然不同的。POST只能用于提交(submit)信息,而不是导航。
基于上点:
我们的URL应该是独立的,服务器能够从URL中重新构建整个网页。
我们应该提供相关页面的链接,而不是试图限制用户进入一个特定的流程。
对于Yummy面馆而言,用户需要:
查看菜单
从订单蓝中增加或者移除物品
发送订单给厨房
查看订单的进度
设计我们的URL
下面的URL将以用户能够容易使用和返回的方式给出功能:
ACTION | URL |
显示菜单列表 | GET “/” |
从蓝中增加菜单项并重定向到/ | POST “/addToBasket?menuId={menuId}” |
从蓝中移除菜单项并重定向到/showBasket | POST “removeFromBasket?menuId={menuId}” |
显示当前蓝 | GET “/showBasket” |
收集客户信息表单,提交到/doCheckout | GET “/checkout” |
从当前蓝中创建订单,重定向到”/order/{id}” | POST “/doCheckout” |
查看指定订单的状态 | GET “/order/{id}” |
请注意,每个POST 结束后都将立即重定向到另一个URL。这允许用户在POST完成后随时手工刷新网页,而不用双重提交。
URI模板
上面的URI被表达成模板,它们包含了{}。
例如,这里{}表明了订单号为1的情形:
http://www.yummynoodlebar.com/order/1 |
订单号为37的有如下的URI
http://www.yummynoodlebar.com/order/37 |
Model View Controller(MVC)
MVC是一个在用户接口开发中非常流行的架构设计,不管是桌面还是Web。它定义了UI中的三种主要责任体,指定了它们之间怎么交互。
这种分离允许以更加可伸缩和可测试的方式来构建应用。
Controller。Contoller主要负责接收用户输入,产生数据模型,然后选择一个视图以展现这个模型。在Spring MVC中,它是带有@Controller 标记的类,这个类中有@RequestMapping标记的方法用于处理一个特定的用户输入。
Model。Model用来提供给视图,它包含了所有的信息以展现给用户。在Spring MVC中,用Model类表示。很多时候这个类并不可见,而是从Controller方法返回的信息中生成出来。
View。View主要用来展示信息给用户。在Web中,View组件将产生HTML,也可能还包含JavaScript。Spring MVC中的View可以有很多形式,而在这个教程中,所有的View将用Thymeleaf来开发。
总结
祝贺。我们已经决定了URL和他们之间的链接。同时捕获了这些组件:
下一步:实现URL和返回数据