1700485070
1700485071
1700485072
设计模式之禅 38.1.3 值栈
1700485073
1700485074
值栈按道理说应该很简单,就是把HTTP传递过来的String字符串压到堆栈中。听起来很简单,实现起来就比较有难度了,它要完成两个职责:
1700485075
1700485076
❑管理堆栈
1700485077
1700485078
不仅仅是出栈、入栈这么简单,它要管理栈中数据,同时还要允许前置拦截器对栈中数据进行修改,限制后置拦截器对栈的修改,还要把栈中数据与HTTPServletRequest中的数据建立关联。
1700485079
1700485080
❑值映射
1700485081
1700485082
从HTTP传递过来的数据都是字符串结构,那怎么才能转化成一个业务对象呢?比如在页面上有一个登录框,输入用户名(userName)和密码(password)。提交到MVC框架中怎么才能转为一个User对象呢?这也是值栈要完成的职责。
1700485083
1700485084
这里说一下值映射,怎么实现一个值的映射,这也是一个反射操作的结果。首先是HTTP传递过来的参数名称中要明确映射到哪一个对象,例如使用.(点号)区分,点号前是对象名称,点号后是属性名,如此规定后就可以轻松地处理了。由于使用的模式较少,这里就不再赘述。读者若有兴趣可以考虑使用一些开源工具,比如dozer等。
1700485085
1700485086
1700485087
1700485088
1700485089
设计模式之禅 38.1.4 视图管理器
1700485090
1700485091
视图管理器的功能很单一,按照模型指定的要求返回视图,在这里用到的主要模式就是桥梁模式,如果大家做过多语言的开发就非常清楚了,比如一个外部网站,提供中日英三种语言版本,我们不可能每个语言都写一套页面吧。一般是定义一个语言资源文件,然后视图根据不同的语言环境加载不同的语言。我们先来说视图,它包含三部分:
1700485092
1700485093
❑静态页面
1700485094
1700485095
比如图片放在什么地方,字体大小是什么样子,菜单应该放置在什么地方,这部分工作是由前台人员开发的,不涉及业务逻辑和业务数据。
1700485096
1700485097
❑动态页面元素
1700485098
1700485099
它指的是在一个固定场景下不发生变化但在异构场景中发生变化的元素,其中语言就属于动态页面元素,还有为使用不同浏览器而开发的代码。比如现在浏览器版本太多了,像IE、Firefox、Chrome等等,虽然基本上都是符合HTML,但是还有一些细节差异,特别是在JavaScript的处理方面,稍不注意就可能产生灾难。
1700485100
1700485101
❑动态数据
1700485102
1700485103
由模型产生的数据,它对视图来说是结构固定,并可反复加载。
1700485104
1700485105
在这三部分中,静态页面是完全静态的,动态页面元素是稍微有点动感,动态数据完全是多变的(数据结构不发生变化,否则页面无法展现)。把动态数据融入到静态页面中比较容易,已经在配置文件中指定要把模型中的数据放到哪个页面中,现在的问题是怎么把动态页面元素融入到静态页面中。静态页面有很多,语言类型也有很多,怎么融合在一起提供给浏览器访问呢?
1700485106
1700485107
桥梁模式可以解决用什么笔(圆珠笔、铅笔)和画什么图形(圆形、方形)的问题,我们遇到的问题与此场景类似。先看类图,如图38-7所示。
1700485108
1700485109
1700485110
1700485111
1700485112
图38-7 视图与语言类图
1700485113
1700485114
大家还记得Struts是怎么配置多语言的文件吗?我们采用类似的结构,如代码清单38-18所示。
1700485115
1700485116
代码清单38-18 资源配置文件
1700485117
1700485118
title=标题
1700485119
[
上一页 ]
[ :1.70048507e+09 ]
[
下一页 ]