今天这个其实不是争论。
这是我接手的一个web系统的一个设计。我觉得很不爽,但是一时又没有好的解决方法。
情况是这样的。
我们的web app是一个传统的jsp+controller+dao的设计(Controller用的是我们元老自己设计的一个框架)。
这个app我们叫做product。
除此之外,我们还有一个定制版本的app。这个定制版本是给某个客户定制的。功能和product大同小异。但是有些小的地方的业务逻辑或者web页面会有些区别。(比如说某个提示信息不同,或者多出或者少一个text box之类的)
大家知道jsp的复用不是很容易的。而这个定制版本和product的区别完全都是这个特定客户决定的,并没有可以实现预测的比较系统的规则。
现在的解决方法,是在product里面增加一个叫做HtmlManipulator的接口:
interface HtmlManipulator {
String manipulate(String html);
}
然后通过一个ChainManipulator把一个数组里的HtmlManipulator串接起来。在product里面这个manipulator的数组是空的。而在定制版本里面,则是通过写各种HtmlManipulator来实现订制,比如下面的伪代码:
class ChangeUserMessageManipulator implements HtmlManipulator {
public String manipulate(String html) {
range = find range of element("user message");
return replaceRangeWith(html, range, "this is the new user message");
}
}
也就是说,所有的定制都是通过拦截并且篡改product生成的html文本来实现的。
是不是看起来非常象基于web页面的aop?
我很不喜欢现在这个方法。
效率是一方面。
这个方法感觉非常原始,而且很多这种manipulator工作都是依赖于html里面的某个特征字符串,理论上如果数据库里面储存了一个“user message”然后被product写入html,那么上面的代码就会失效。
不过,至少在不彻底推翻现有框架的基础上,我想不出什么好方法。
独立维护product/定制两套代码是不可接受的。
感觉也许需要采用基于web组件的技术才行。(不熟悉tapestry,不知道是不是合适)。
这两天发现了一个StringTemplate,看来似乎也是一个可能的方向。
聪明如你,有什么好的方法么?
分享到:
相关推荐
在Spring框架中,AOP(面向切面编程)是一种强大的工具,允许开发者在不修改源代码的情况下添加额外的功能或监控代码,如日志、事务管理、权限检查等。然而,在实际项目开发中,有时可能会遇到Controller无法被AOP...
**Spring AOP在Web中的使用** Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它允许我们通过定义切面来实现代码的模块化,特别是那些具有横切关注点的代码,如日志、事务...
在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种强大的设计模式,它允许我们定义横切关注点,如日志、事务管理、权限检查等,然后将这些关注点与核心业务逻辑解耦。这篇教程将详细讲解...
本主题将深入探讨Java Web开发中的异常处理方式以及Aspect-Oriented Programming(面向切面编程,简称AOP)技术,这两种技术在构建健壮和可维护的应用程序中起着核心作用。 首先,让我们了解Java Web开发中的异常...
### 基于AOP的智能Web缓存框架 #### 概述 随着互联网技术的飞速发展,Web应用程序的需求量急剧增加,这对服务器的处理能力提出了更高的要求。为了提高Web应用系统的性能,缓存技术成为了优化用户体验的重要手段之...
**Spring AOP 简介** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要模块,它扩展了传统的面向对象编程,允许开发者定义“横切关注点”(cross-cutting concerns),如日志、事务...
在本项目中,你将看到如何在Maven和Spring框架下构建一个Web应用,并利用Spring AOP实现具体的业务逻辑。 1. **Maven集成Spring AOP** Maven是一个项目管理工具,通过依赖管理和项目构建,使得构建、测试和部署变...
升级到spring.web-3.0.5.jar和spring.webmvc-3.0.5.jar是为了确保你拥有最新的AOP特性和对Servlet API的兼容性。这两个库包含了Spring MVC的实现,Spring MVC是Spring框架的一部分,专门用于构建Web应用程序。`...
本教程将引导新手理解如何利用AOP来记录Web请求日志。下面将详细阐述这个过程。 首先,我们需要了解AOP的基本概念。AOP允许我们在程序执行过程中,在特定的“连接点”(例如方法调用)上插入自定义的行为,这些行为...
<aop:pointcut id="logPointCut" expression="execution(* com.controller.web.*.*(..)) or execution(* com.controller.web.*.*(..))"/> <!-- 定义切面 --> <aop:aspect ref="springAopLog"> <aop:before ...
这本书详细介绍了Spring 3.2版本的各个模块和功能,包括依赖注入、事务管理、数据访问、Web应用以及AOP等。通过阅读,你可以了解到如何配置和使用Spring的核心特性,以及如何将这些特性整合到你的项目中,提升代码的...
"mysql" 是一个流行的开源关系型数据库管理系统,广泛用于Web应用程序和各种数据存储需求。 【压缩包子文件的文件名称列表】中的 "aop-choose-db-demo" 可能是一个核心模块,它包含了实现AOP逻辑以选择和管理MySQL...
6. **配置文件**:项目可能包含Web.config或其他配置文件,用于设置AOP框架的选项,如启用或禁用某些特性,或配置日志输出。 为了深入了解这个项目,你需要打开并分析Dzend.MvcTest的源代码,查看类定义、控制器、...
SSH是一种流行的Java Web应用程序开发框架组合,用于构建高性能、可维护的Web应用。 AOP是一种编程范式,它允许程序员定义“切面”,这些切面可以包含业务逻辑的各个部分,如日志、事务管理、安全检查等。这些切面...
本教程将通过一个具体的例子来介绍如何使用Spring AOP在Spring Boot中打印Web请求的参数信息。 首先,我们需要了解Spring AOP的基本概念。AOP是一种编程范式,用于处理系统中的横切关注点,如日志、事务管理等。在...
标题 "使用Spring AOP对Web应用数据进行Memcached缓存" 涉及到的关键技术是Spring AOP(面向切面编程)和Memcached,这是一种常见的高性能、分布式内存对象缓存系统。在Web应用程序中,使用缓存可以显著提高数据访问...
SSH(Spring、Struts2、Hibernate)是一个经典的Java Web开发框架,它整合了Spring的IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)功能,Struts2作为MVC(Model-View-...
至于拦截器,Spring AOP中的拦截器主要指的是Spring MVC中的HandlerInterceptor,通常用于Web层的请求拦截。不过在AOP中,我们可以通过自定义通知来实现类似的功能。例如,你可以定义一个`preHandle`方法作为前置...