Web AOP?

今天这个其实不是争论。

这是我接手的一个web系统的一个设计。我觉得很不爽,但是一时又没有好的解决方法。

情况是这样的。

我们的web app是一个传统的jsp+controller+dao的设计(Controller用的是我们元老自己设计的一个框架)。

这个app我们叫做product。

除此之外,我们还有一个定制版本的app。这个定制版本是给某个客户定制的。功能和product大同小异。但是有些小的地方的业务逻辑或者web页面会有些区别。(比如说某个提示信息不同,或者多出或者少一个text box之类的)


大家知道jsp的复用不是很容易的。而这个定制版本和product的区别完全都是这个特定客户决定的,并没有可以实现预测的比较系统的规则。


现在的解决方法,是在product里面增加一个叫做HtmlManipulator的接口:
[code]
interface HtmlManipulator {
String manipulate(String html);
}
[/code]

然后通过一个ChainManipulator把一个数组里的HtmlManipulator串接起来。在product里面这个manipulator的数组是空的。而在定制版本里面,则是通过写各种HtmlManipulator来实现订制,比如下面的伪代码:
[code]
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");
}
}
[/code]

也就是说,所有的定制都是通过拦截并且篡改product生成的html文本来实现的。
是不是看起来非常象基于web页面的aop?

我很不喜欢现在这个方法。
效率是一方面。
这个方法感觉非常原始,而且很多这种manipulator工作都是依赖于html里面的某个特征字符串,理论上如果数据库里面储存了一个“user message”然后被product写入html,那么上面的代码就会失效。

不过,至少在不彻底推翻现有框架的基础上,我想不出什么好方法。

独立维护product/定制两套代码是不可接受的。

感觉也许需要采用基于web组件的技术才行。(不熟悉tapestry,不知道是不是合适)。
这两天发现了一个StringTemplate,看来似乎也是一个可能的方向。

聪明如你,有什么好的方法么?
Spring是一个开源的轻量级Java框架,它为企业级应用提供了全面的基础设施支持,包括IoC、AOP、事务管理、Web应用、批处理和框架整合等功能。通过Spring的应用,可以使Java应用的开发变得更加简单、快捷、灵活、高效。 Spring能够做的事情非常丰富,包括: 1. 提供IoC(控制反转)容器,实现Java对象的创建、管理和注入。 2. 提供AOP(面向切面编程)框架,实现应用程序的横切关注点的分离,例如事务、安全、日志等。 3. 提供声明式事务管理,使得事务管理变得简单、易用。 4. 提供Web应用框架,支持MVC、RESTful Web Service等Web开发技术。 5. 提供批处理框架,支持大数据处理和复杂业务流程处理等。 6. 提供框架整合功能,支持多种开源框架的整合,例如Hibernate、MyBatis等。 Spring IOC(控制反转)是Spring框架的核心,它是一种设计模式,它将对象的创建和依赖关系的管理交给Spring容器来处理,而不是由应用程序自己管理。通过IOC,Spring框架实现了应用程序中各个Java对象之间的解耦,使得应用程序更加灵活、可扩展。 Spring AOP(面向切面编程)是一种编程范式,它通过将与业务逻辑无关的横切关注点(如日志、安全、事务等)从业务逻辑中分离出来,实现代码的重用和解耦。Spring AOP是基于动态代理和字节码生成技术实现的,它可以在不修改源代码的情况下,为应用程序添加额外的功能。 下面是一个简单的Spring属性注入示例: 假设有一个Person类,包含name和age两个属性,我们可以通过Spring的IoC容器将这些属性注入到Person对象中: ```java public class Person { private String name; private int age; // 省略getter和setter方法 } public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Person person = (Person) context.getBean("person"); System.out.println(person.getName() + ", " + person.getAge()); } } ``` 在上述示例中,我们首先定义了一个Person类,然后在Spring的配置文件applicationContext.xml中,通过<bean>元素将Person类注入到IoC容器中,并设置name和age属性的值: ```xml <bean id="person" class="com.example.Person"> <property name="name" value="张三" /> <property name="age" value="18" /> </bean> ``` 最后,在Main类中,通过ApplicationContext对象获取Person对象,并输出name和age属性的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值