`
ajoo
  • 浏览: 453105 次
社区版块
存档分类
最新评论

Web AOP?

阅读更多
今天这个其实不是争论。

这是我接手的一个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,看来似乎也是一个可能的方向。

聪明如你,有什么好的方法么?
分享到:
评论
7 楼 canonical 2007-08-15  
在我们的系统中可以修改biz文件来控制界面元素的增减, 特别是一般元素都定义了逆元操作, 因此页面差异一般不是什么问题.
6 楼 ajoo 2007-08-15  
hax 写道
这不是不爽,简直是不可理喻。

对于最终结果页面的字符串替换,只能用于解决特殊bug,用来作为一般的customize机制是自掘坟墓。

ajoo同志偶建议你把规则简单并且有明确意义的manipulator,可以提取出来,改成模板方式的。其他的,还是独立成一个单独的代码分支吧。


多谢,多谢。

俺已经不做擦大便很久了。
5 楼 hax 2007-08-15  
这不是不爽,简直是不可理喻。

对于最终结果页面的字符串替换,只能用于解决特殊bug,用来作为一般的customize机制是自掘坟墓。

ajoo同志偶建议你把规则简单并且有明确意义的manipulator,可以提取出来,改成模板方式的。其他的,还是独立成一个单独的代码分支吧。
4 楼 fixopen 2007-08-15  
似乎你的关键问题是:对于要操纵的Element没有把握,没有边界感,觉得低级的字符串比较太容易出现偏差。

你是不是可以想办法把加边界这个行为内嵌到页面生成里面,以方便后继的修改?什么?本来就没有逻辑上的边界,本来就是随意的选取一部分内容进行修改!哦,那就算了,那样的话,现在这个方法就不赖。
3 楼 jellyfish 2007-02-16  
Depends on the differences, there are several options.
1. Since the user will drive this difference, we need some kind of flag in the user object, like company name, to identify this case.
2. if the diff is only in web pages, not data, then put the difference in the jsp page where you can set the user as the flag.
3. if the diff is data only, then do it in the controller.
4. if the diff is both, then seperate them using 2 and 3.

If you have one client only, then a simple if else is good enough, otherwise, with 3 or most clients, we should refactor things out. For example, for web pages, we may create separate templates and name them with company name for selection. For data difference, we may create separate strategies depending on users/clients.
2 楼 dada 2007-02-16  
我建议用javascript结合java的方式进行改造。
我们把问题分成2个小问题:
1. 定制提示文本信息
   用EL表达式能解决大部分的问题。
2. 页面结构的定制
   在xml文件或者数据库中存放页面组件的结构,并提供客户动态定制的界面。java掌控组件结构和属性的初始化动作,将组件结构和属性通过xml或者json传递给页面,页面部分通过javascript来进行渲染。

以上仅供参考
1 楼 LucasLee 2007-02-16  
看来,这个产品没有经过良好的框架设计,或者说,没有良好的为可扩展性、可定制性进行设计。

一般来说,比较理想的情况是,一套公共的代码,加上不同的扩展程序、资源文件,即成为客户化的软件版本。
那么产品(即公共代码),应该对上述行为良好的支持。

针对你所提出的情况,
1.不同的提示。
  一般将这些提示放在资源文件中,java里是ResourceBundle,一般用在国际化用途上,在这里也完全可以用在多客户版本上。不同客户只需切换不同的资源文件即可,将变化的部分最小化、完全分离出来。
2.少量不同的JSP界面。
  我认为应该参考上面的做法,用可以配置的文件来组装不同的资源。比如使用XML。
  需要预先(或发现需要后重构)定义好扩展点,比如说什么地方可能加入Textbox的。可考虑使用spring或自定义的机制来完成。

总的来说,就是要清晰的隔离公共部分和客户化部分。
使得产品部分和客户化部分仅通过约定的接口关联,可以相对独立的进行开发,互相影响减到最低。

相关推荐

    44 Spring控制器Controller如何设置AOP?慕课专栏1

    在Spring框架中,AOP(面向切面编程)是一种强大的工具,允许开发者在不修改源代码的情况下添加额外的功能或监控代码,如日志、事务管理、权限检查等。然而,在实际项目开发中,有时可能会遇到Controller无法被AOP...

    Spring AOP 在WEB中的使用

    **Spring AOP在Web中的使用** Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它允许我们通过定义切面来实现代码的模块化,特别是那些具有横切关注点的代码,如日志、事务...

    使用Spring配置文件实现AOP

    在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种强大的设计模式,它允许我们定义横切关注点,如日志、事务管理、权限检查等,然后将这些关注点与核心业务逻辑解耦。这篇教程将详细讲解...

    Java Web开发异常处理方式及AOP技术

    本主题将深入探讨Java Web开发中的异常处理方式以及Aspect-Oriented Programming(面向切面编程,简称AOP)技术,这两种技术在构建健壮和可维护的应用程序中起着核心作用。 首先,让我们了解Java Web开发中的异常...

    基于AOP的智能web缓存框架.pdf

    ### 基于AOP的智能Web缓存框架 #### 概述 随着互联网技术的飞速发展,Web应用程序的需求量急剧增加,这对服务器的处理能力提出了更高的要求。为了提高Web应用系统的性能,缓存技术成为了优化用户体验的重要手段之...

    Spring AOP简单demo

    **Spring AOP 简介** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要模块,它扩展了传统的面向对象编程,允许开发者定义“横切关注点”(cross-cutting concerns),如日志、事务...

    spring aop

    在本项目中,你将看到如何在Maven和Spring框架下构建一个Web应用,并利用Spring AOP实现具体的业务逻辑。 1. **Maven集成Spring AOP** Maven是一个项目管理工具,通过依赖管理和项目构建,使得构建、测试和部署变...

    Spring3.0.5扩展支持AOP获取HttpServletResponse

    升级到spring.web-3.0.5.jar和spring.webmvc-3.0.5.jar是为了确保你拥有最新的AOP特性和对Servlet API的兼容性。这两个库包含了Spring MVC的实现,Spring MVC是Spring框架的一部分,专门用于构建Web应用程序。`...

    springboot基于AOP将web请求写入日志

    本教程将引导新手理解如何利用AOP来记录Web请求日志。下面将详细阐述这个过程。 首先,我们需要了解AOP的基本概念。AOP允许我们在程序执行过程中,在特定的“连接点”(例如方法调用)上插入自定义的行为,这些行为...

    spring aop切面拦截指定类和方法实现流程日志跟踪

    <aop:pointcut id="logPointCut" expression="execution(* com.controller.web.*.*(..)) or execution(* com.controller.web.*.*(..))"/> <!-- 定义切面 --> <aop:aspect ref="springAopLog"> <aop:before ...

    spring-springMVC开发文档和AOP详解

    这本书详细介绍了Spring 3.2版本的各个模块和功能,包括依赖注入、事务管理、数据访问、Web应用以及AOP等。通过阅读,你可以了解到如何配置和使用Spring的核心特性,以及如何将这些特性整合到你的项目中,提升代码的...

    aop-mysql-demo

    "mysql" 是一个流行的开源关系型数据库管理系统,广泛用于Web应用程序和各种数据存储需求。 【压缩包子文件的文件名称列表】中的 "aop-choose-db-demo" 可能是一个核心模块,它包含了实现AOP逻辑以选择和管理MySQL...

    c# aop+mvc+facAop

    6. **配置文件**:项目可能包含Web.config或其他配置文件,用于设置AOP框架的选项,如启用或禁用某些特性,或配置日志输出。 为了深入了解这个项目,你需要打开并分析Dzend.MvcTest的源代码,查看类定义、控制器、...

    aopalliance

    SSH是一种流行的Java Web应用程序开发框架组合,用于构建高性能、可维护的Web应用。 AOP是一种编程范式,它允许程序员定义“切面”,这些切面可以包含业务逻辑的各个部分,如日志、事务管理、安全检查等。这些切面...

    springboot 用aop打印web请求参数信息例子

    本教程将通过一个具体的例子来介绍如何使用Spring AOP在Spring Boot中打印Web请求的参数信息。 首先,我们需要了解Spring AOP的基本概念。AOP是一种编程范式,用于处理系统中的横切关注点,如日志、事务管理等。在...

    使用spring aop对web 应用数据进行memcached缓存

    标题 "使用Spring AOP对Web应用数据进行Memcached缓存" 涉及到的关键技术是Spring AOP(面向切面编程)和Memcached,这是一种常见的高性能、分布式内存对象缓存系统。在Web应用程序中,使用缓存可以显著提高数据访问...

    ssh添加aop配置

    SSH(Spring、Struts2、Hibernate)是一个经典的Java Web开发框架,它整合了Spring的IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)功能,Struts2作为MVC(Model-View-...

    Spring Aop的简单实现

    至于拦截器,Spring AOP中的拦截器主要指的是Spring MVC中的HandlerInterceptor,通常用于Web层的请求拦截。不过在AOP中,我们可以通过自定义通知来实现类似的功能。例如,你可以定义一个`preHandle`方法作为前置...

Global site tag (gtag.js) - Google Analytics