首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

纯 servlet:重新考虑视图(3)

纯 servlet:重新考虑视图(3)

其他方面尽管 Web 框架往往让事情变得复杂,但是它们能够解决许多比较小的问题。基于 servlet 的设计提供了很高的灵活性,可以适当地解决这些问题,而不需要依赖于任何解决方案。
安全性在企业应用程序中,页面级的安全性往往在 XML 描述符文件中以声明性方式来处理。同样,根据我的经验,往往需要一个更动态的代码级接口来管理页面中特殊的行为 —— 例如,Picks servlet 中与日期相关的逻辑。这可以用 Servlet API 内置的安全方法来处理,比如请求对象上的 isUserInRole(),也可以将它写成单独的接口。使用 Servlet API 对这两种方式都有帮助。
HotSwap 和开发周期与修改 JSP 相比,修改并重新编译普通类比较麻烦,因为 JSP 会自动编译成可运行的应用程序。Java HotSwap 调试接口(在 Java 1.4 中引入)可以解决这个问题,它允许在运行时重新装载修改后的类,而不需要重新启动 Web 应用程序,也不会丢失会话状态。好的 IDE 支持这个特性。我选择的 servlet 容器是 Caucho Resin 3.0(参见 ),它甚至能够自动探测 WEB-INF/classes 中的修改并对它们进行热交换。

国际化尽管许多框架都可以以属性文件的形式对文本值进行国际化,但是可以在 HTML 写出器中用少量代码实现同样的结果。可以添加一个方法,比如 printText(),它以一个键作为自变量并输出翻译后的文本值(text() 会直接返回文本)。servlet 输出代码仍然很简洁,而且执行与等效的 JSP 相同的功能(如果不是更多的话)。这还可以更好地控制如何处理缺失的翻译词 —— 是抛出异常,还是使用默认语言。
智能皮肤March Madness 设计实现了一些很有意思的东西。进入主页并登录,就会看到一个欢迎消息。如果点击 “Welcome” 后面的逗号,就会发现外观和感觉发生了变化。替换的皮肤仅仅是另一个 CSS 文件。我扩展了 MadnessWriter;当选择替换皮肤时,servlet 基类对这个子类进行实例化,并将实例传递给受保护的服务方法。因此,MadnessWriter 子类不但可以覆盖默认的样式表,还可以覆盖结构性 HTML 输出代码,例如显示不同的徽标以及在框周围显示更复杂的边框。servlet 中不需要特殊代码。
关于缩进的说明关于这种方式,有一点需要注意:生成的 HTML 没有缩进,其格式的可读性不好。(但是,通过混合 HTML 和 scriptlet 在模板代码中创建缩进常常导致混乱。即使不使用 scriptlet,随着时间的推移,剪切和粘贴也会使代码支离破碎。)
只需在输出中添加一些新行字符,就能够让 March Madness 站点生成的 HTML 具有更好的可读性。但是对于这种方法来说,HTML 的格式是否漂亮并不重要,因为可以通过检查 Java 代码轻松地找到大多数布局 bug,不需要查看生成的 HTML 源代码。将元素和结构放在方法中大大提高了简洁性和可维护性。
结束语本文鼓励读者脱离常用 Web 框架的思维模式,考虑直接用 Java Servlet API 构建 Web 界面。Java Web 开发人员可用的框架和模板系统非常多,这让人误以为这些是必不可少的,但是它们往往非常复杂,很难使用。尽管有的框架非常适合某种类型的 Web 应用程序,但是也可以考虑用内置的语言特性(比如扩展和封装)来实现。正如 Bruce Tate 所说的(参见 ),“以简单灵巧的方法来解决问题往往更好”。
Web 框架有适合它们的场景,当项目有专门的 HTML 设计人员来生成和维护 JSP/模板时,JSP/模板是非常合适的。但是对于某些项目来说,纯 servlet 的简单性是非常有意义的。这种方法提供了控制能力和灵活性,而且不要求将所有动态内容都放在请求对象中。可以简便地对纯 servlet 进行单元测试。重用 HTML 输出也很简单,只需添加或覆盖一个方法。
返回列表