﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-『一只小蚂蚁』的专栏-随笔分类-J2EE核心模式</title><link>http://www.blogjava.net/qixiangnj/category/24865.html</link><description>&lt;strong&gt;生命不息，拼搏不止。&lt;/strong&gt;</description><language>zh-cn</language><lastBuildDate>Sun, 26 Aug 2007 17:28:00 GMT</lastBuildDate><pubDate>Sun, 26 Aug 2007 17:28:00 GMT</pubDate><ttl>60</ttl><item><title>【J2EE核心模式】——表现层设计考虑和不佳实践</title><link>http://www.blogjava.net/qixiangnj/archive/2007/08/25/139290.html</link><dc:creator>Thomas</dc:creator><author>Thomas</author><pubDate>Sat, 25 Aug 2007 10:49:00 GMT</pubDate><guid>http://www.blogjava.net/qixiangnj/archive/2007/08/25/139290.html</guid><wfw:comment>http://www.blogjava.net/qixiangnj/comments/139290.html</wfw:comment><comments>http://www.blogjava.net/qixiangnj/archive/2007/08/25/139290.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qixiangnj/comments/commentRss/139290.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qixiangnj/services/trackbacks/139290.html</trackback:ping><description><![CDATA[<span style="font-weight: bold;">表现层设计考虑<br>会话管理</span><br>&nbsp; <span style="font-weight: bold;">在客户端保存会话状态</span><br>&nbsp; 优点：<br>&nbsp; ①实现容易<br>&nbsp; ②保存状态比较少时，效果好<br>&nbsp; ③需要多台Server实现负载均衡时，无需在Server间复制会话状态。<br><br>&nbsp; 实现策略：<br>&nbsp; ①HTML隐藏字段<br>&nbsp; ②HTTP Cookie<br>&nbsp; ③直接放进URL里<br><br>&nbsp; 1. HTML隐藏字段的缺点：<br>&nbsp;&nbsp;&nbsp; ①需保存状态较多时，缺点尤其明显：系统性能下降；状态在请求和响应中都要通过网络往复传输。<br>&nbsp;&nbsp;&nbsp; ②保存的状态只能是字符串形式的值，任何对象引用必须&#8220;字符串化&#8221;；加密处理。<br>&nbsp; 2. HTTP Cookie的缺点：<br>&nbsp;&nbsp;&nbsp; ①同上<br>&nbsp;&nbsp;&nbsp; ②同上；对于Cookie header的大小有限制，也就限制了能够保存的数据量。<br><br>&nbsp; 安全问题<br><br>&nbsp; <span style="font-weight: bold;">在表现层保存会话状态</span><br>&nbsp; session ID<br>&nbsp; 优点：<br>&nbsp; ①状态保存在Server，不会受到数据量大小或是数据类型方面的限制。<br>&nbsp; ②会话状态不会在每个请求中都通过网络传输一次，系统性能不会受到影响。<br>&nbsp; ③在Server保存会话状态，可以按照需要和代价，在繁、简间灵活选择，兼顾可扩展性和性能。<br><br>&nbsp; 缺点：<br>&nbsp; 需要在集群的多个Server间复制会话状态。<br><br>&nbsp; <span style="font-weight: bold;">在业务层或资源层保存会话状态</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ||&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ||<br>&nbsp;&nbsp;&nbsp; EJB组件&nbsp; 关系型数据库<br><br><span style="font-weight: bold;">控制客户端访问</span><br><span style="font-weight: bold;">&nbsp; 保护视图</span><br>&nbsp; 策略：<br>&nbsp; ①加入一种应用逻辑<br>&nbsp; ②配置运行时系统<br><br>&nbsp; 常见方法：<br>&nbsp; ①采用一个控制器<br>&nbsp; ②在视图中直接加入保护<br><br>&nbsp; 1. <span style="font-weight: bold;">在视图内部中实现保护</span><br>&nbsp;&nbsp;&nbsp; a. <span style="font-style: italic;">阻塞对整个资源的访问</span><br>&nbsp;&nbsp;&nbsp; b. <span style="font-style: italic;">只阻塞对局部资源的访问</span><br>&nbsp; 2. <span style="font-weight: bold;">每页加入&#8220;要么全部 - 要么没有&#8221;的保护</span><br>&nbsp; 3. <span style="font-weight: bold;">加入对页面局部的保护</span><br>&nbsp;&nbsp;&nbsp; a. <span style="font-style: italic;">根据用户角色不显示视图的局部内容</span><br>&nbsp;&nbsp;&nbsp; b. <span style="font-style: italic;">根据系统状态或错误条件不显示视图的局部内容</span><br><br><span style="font-weight: bold;">&nbsp; 通过配置实现保护</span><br>&nbsp; web.xml<br>&nbsp; 1. <span style="font-weight: bold;">通过标准安全限制实现资源保护</span><br>&nbsp; 2. <span style="font-weight: bold;">通过一个简单、通用的配置实现资源保护</span><br>&nbsp;&nbsp;&nbsp;&nbsp; 只需把那些限制访问的资源放到Web应用的/WEB-INF/目录下即可。<br><br><span style="font-weight: bold;">&nbsp; 重复的表单提交</span><br>&nbsp; 同步器令牌（又名&#8220;时曾相识&#8221;令牌）<br><br><span style="font-weight: bold;">验证</span><br>&nbsp; 客户端+服务器端验证<br>&nbsp; <span style="font-weight: bold;">在客户端验证</span><br>&nbsp; JavaScript<br><br>&nbsp; <span style="font-weight: bold;">在服务器端验证</span><br>&nbsp; 1. <span style="font-weight: bold;">基于表单的验证</span><br>&nbsp;&nbsp;&nbsp;&nbsp; 容易实现，比较高效；应用系统越大，造成的重复代码越多。<br>&nbsp; 2. <span style="font-weight: bold;">基于抽象类型的验证</span><br>&nbsp;&nbsp;&nbsp;&nbsp; 从状态中抽象出类型和限制信息，放入一个通用的框架中。<br>&nbsp;&nbsp;&nbsp;&nbsp; 例如，可以使用一个组件或者一个子系统来封装验证逻辑。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-weight: bold;">缺陷</span>：<br>&nbsp;&nbsp;&nbsp;&nbsp; ①效率、性能上可能具有潜在的损失；<br>&nbsp; &nbsp;&nbsp; ②通用解决方案强大，但难于理解、不易维护。<br><br><span style="font-weight: bold;">助手类属性——完整性和一致性</span><br>&nbsp; JavaBean助手类通常用于存放由客户端请求传来的中间状态。<br>&nbsp; &lt;jsp:setProperty name="helper" property="*"/&gt;<br>&nbsp; 当请求中的参数值为空的时候，技术规范规定，不对该属性的值做任何变化。<br><br>&nbsp; <span style="font-weight: bold;">解决方案</span>：<br>&nbsp; 在多次请求之间重置JavaBean的所有状态。<br><br><br><span style="font-weight: bold;">表现层不佳实践</span><br><span style="font-weight: bold;">多个视图中都包括控制代码</span><br>&nbsp; <span style="font-weight: bold;">参照解决方案</span>：<br>&nbsp; 合并控制代码，引入一个控制器和相关的命令助手。<br><br>&nbsp; <span style="font-style: italic;">Ch4，&#8220;引入控制器&#8221;、&#8220;隔离不同逻辑&#8221;</span><br>&nbsp; <span style="font-style: italic;">Ch6，&#8220;命令与控制器策略&#8221;、&#8220;视图助手&#8221;</span><br><br><span style="font-weight: bold;">把表现层的数据结构暴露给业务层</span><br>&nbsp; 表现层的数据结构，例如<span style="font-weight: bold;">HttpServletRequest</span>，应该只限于表现层。<br><br>&nbsp; <span style="font-weight: bold;">参照解决方案</span>：<br>&nbsp; <span style="font-style: italic;">Ch4，&#8220;对业务层隐藏表现细节&#8221;</span><br><br><span style="font-weight: bold;">把表现层数据结构暴露给业务领域对象</span><br>&nbsp; <span style="font-weight: bold;">参照解决方案</span>：<br>&nbsp; <span style="font-style: italic;">同上</span><br><br><span style="font-weight: bold;">允许重复提交表单</span><br>&nbsp; <span style="font-weight: bold;">参照解决方案</span>：<br>&nbsp; 需要监管、控制请求流程。<br><br>&nbsp; <span style="font-style: italic;">Ch4，&#8220;引入同步器令牌&#8221;</span><br><br><span style="font-weight: bold;">把敏感资源暴露给客户端的直接访问</span><br>&nbsp; <span style="font-weight: bold;">参照解决方案</span>：<br>&nbsp; 保护敏感资源、禁止客户端直接访问。<br><br>&nbsp; <span style="font-style: italic;">Ch4，&#8220;对客户端隐藏资源&#8221;</span><br><br><span style="font-weight: bold;">假定&lt;jsp:setProperty&gt;会重置Bean属性</span><br>&nbsp; <span style="font-weight: bold;">参照解决方案</span>：<br>&nbsp; 记住&lt;jsp:setProperty&gt;的这种不太直观的赋值机制，在使用bean属性之前先做初始赋值。<br><br><span style="font-weight: bold;">创建出&#8220;胖控制器&#8221;</span><br>&nbsp; <span style="font-weight: bold;">参照解决方案</span>：<br>&nbsp; <span style="font-style: italic;">Ch4，&#8220;引入控制器&#8221;，Ch6，&#8220;命令与控制器策略&#8221;；</span><br>&nbsp; <span style="font-style: italic;">Ch4，&#8220;隔离不同逻辑&#8221;，Ch6，&#8220;视图助手&#8221;</span><br><br><span style="font-weight: bold;">把视图助手当作Scriptlet使用</span><br>&nbsp; <span style="font-weight: bold;">参照解决方案</span>：<br>&nbsp; 视图中的Java Scriptlet；使用JSTL助手；使用标记库；标记文件助手<br>     <img src ="http://www.blogjava.net/qixiangnj/aggbug/139290.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qixiangnj/" target="_blank">Thomas</a> 2007-08-25 18:49 <a href="http://www.blogjava.net/qixiangnj/archive/2007/08/25/139290.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【J2EE核心模式】——J2EE模式概览</title><link>http://www.blogjava.net/qixiangnj/archive/2007/08/12/136214.html</link><dc:creator>Thomas</dc:creator><author>Thomas</author><pubDate>Sun, 12 Aug 2007 12:42:00 GMT</pubDate><guid>http://www.blogjava.net/qixiangnj/archive/2007/08/12/136214.html</guid><wfw:comment>http://www.blogjava.net/qixiangnj/comments/136214.html</wfw:comment><comments>http://www.blogjava.net/qixiangnj/archive/2007/08/12/136214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/qixiangnj/comments/commentRss/136214.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/qixiangnj/services/trackbacks/136214.html</trackback:ping><description><![CDATA[<span style="font-weight: bold;">模式</span><br>在一种<span style="color: red; font-weight: bold;">上下文</span>中，<span style="color: red; font-weight: bold;">一类问题</span>的一种<span style="color: red; font-weight: bold;">可重复使用</span>的<span style="color: red; font-weight: bold;">解决方案</span>。<br><br><span style="font-weight: bold;">发现模式</span><br>模式模板、模式挖掘<br>验证模式：<span style="font-weight: bold;">大三律</span>（Rule of Three）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只有经过三个以上不同系统的校验，一个解决方案才能从候选模式升格为模式。<br><br>怎样才能最好地交流这个模式？<br>&nbsp;&nbsp;&nbsp; 两种相近的解决方案 --&gt;&nbsp; 两个不同的模式<br>&nbsp; &nbsp; 相近的想法 --&gt; 同一个模式<br><br><span style="font-weight: bold;">模式 vs 策略</span><br>&nbsp;||&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ||<br>抽象&nbsp;&nbsp;&nbsp; 实现<br><br><br><span style="font-weight: bold;">分层思路</span><br><img alt="" src="http://www.blogjava.net/images/blogjava_net/qixiangnj/24869/r_j2ee_tier.jpg" align="left" height="401" width="576"><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><span style="font-weight: bold;">J2EE模式</span><br><span style="font-weight: bold;">表现层模式</span><br><img alt="" src="http://www.blogjava.net/images/blogjava_net/qixiangnj/24869/r_%e8%a1%a8%e7%8e%b0%e5%b1%82%e6%a8%a1%e5%bc%8f.JPG" align="left" height="239" width="528"><br><br><br><br><br><br><br><br><br><br><br><br><br><span style="font-weight: bold;">业务层模式</span><br><img alt="" src="http://www.blogjava.net/images/blogjava_net/qixiangnj/24869/r_%e4%b8%9a%e5%8a%a1%e5%b1%82%e6%a8%a1%e5%bc%8f.JPG" align="left" height="230" width="523"><br><br><br><br><br><br><br><br><br><br><br><br><br><span style="font-weight: bold;">集成层模式</span><br><img alt="" src="http://www.blogjava.net/images/blogjava_net/qixiangnj/24869/r_%e9%9b%86%e6%88%90%e5%b1%82%e6%a8%a1%e5%bc%8f.JPG" align="left" height="136" width="526"><br><br><br><br><br><br><br><br><br><br><span style="font-weight: bold;">J2EE模式目录指南</span><br>术语<br><br>UML的使用<br>&nbsp; 类图——静态视图<br>&nbsp; 序列图——动态视图<br>&nbsp; 构造型（stereotypes）——表现在类图和交互图中不同类型的对象<br><br>UML构造型<br>&nbsp; 构造型：设计师、架构师们创造、使用的一些术语。<br><br><span style="font-weight: bold;">模式模板</span><br>&nbsp; <span style="font-weight: bold;">问题</span><br>&nbsp; <span style="font-weight: bold;">约束</span>：原因和动机<br>&nbsp; <span style="font-weight: bold;">解决方案</span><br>&nbsp;&nbsp;&nbsp; <span style="font-style: italic; font-weight: bold;">结构</span><br>&nbsp;&nbsp;&nbsp; <span style="font-style: italic; font-weight: bold;">策略</span><br>&nbsp;&nbsp;&nbsp; <span style="font-style: italic; font-weight: bold;">效果</span><br>&nbsp;&nbsp;&nbsp; <span style="font-style: italic; font-weight: bold;">示例代码</span><br>&nbsp;&nbsp;&nbsp; <span style="font-style: italic; font-weight: bold;">相关模式<br><br><br></span><span style="font-weight: bold;">J2EE模式关系</span><br>J2EE模式关系图：<br><img alt=""  src="http://www.blogjava.net/images/blogjava_net/qixiangnj/24869/r_j2ee%e6%a8%a1%e5%bc%8f%e5%85%b3%e7%b3%bb%e5%9b%be.JPG" align="left" height="480" width="396"><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><span style="font-style: italic; font-weight: bold;"></span><span style="font-weight: bold;"> 采用一个新模式，会引入什么新问题？</span><br><span style="font-weight: bold;">回顾模式关系图，考虑替代方案。<br><br><br>与现有其他模式的关系<br></span>GOF、PEAA<br><br><br><span style="font-weight: bold;">模式路线图</span><br>P93<br><span style="font-weight: bold;"></span><img src ="http://www.blogjava.net/qixiangnj/aggbug/136214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/qixiangnj/" target="_blank">Thomas</a> 2007-08-12 20:42 <a href="http://www.blogjava.net/qixiangnj/archive/2007/08/12/136214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>