为了减少action的数量,我一般把对单表的CRUD操作放在同一个action中实现了,但问题来了:
这样action的属性(实例变量)就会很多很杂乱,比如一个产品表的操作至少需要注入以下参数
List productList;//查询方法需要
Product product;//增加、修改方法需要
还有分页参数等等
搞的不好还有String productId之类的
这样导致action的逻辑看起来很混乱。
单一职责固然合理,但如果因此而引入大量的action类导致其他的如管理上的问题又是否值得呢?况且单表的CRUD操作之间也可能是有关联的,如删除操作后可能需要调用查询操作来返回一个新的产品列表。
我甚至觉得这是webwork设计上的一个问题,使用无侵入的getter/setter方式和视图间传递(交换)数据本身没有问题,但在action中使用属性(实例变量)也会带来很多的问题,不够清晰,而且搞的最后action也只有每次产生新的对象来保证线程安全问题,还有action的返回值使用String也不够OO,连struts都用了一个ActionForward来封装。
顺便说说我比较希望的方式:
[code]public class ***Action implements Action
{
private ProductManager productManager;
public ModelAndView update(ActionContext context)
{
Product product =(Product)context.getRequestArg("product");
productManager.update(product);
ModelAndView respOjb=new ModelAndView();
respOjb.addModel("product",product);
respOjb.setView("success");
return respObj;
}
.....
}[/code]
和事件机制类似,无状态,代码不比webwork长,有点像Spring的MVC了,但又没有和servlet产生依赖。
这样action的属性(实例变量)就会很多很杂乱,比如一个产品表的操作至少需要注入以下参数
List productList;//查询方法需要
Product product;//增加、修改方法需要
还有分页参数等等
搞的不好还有String productId之类的
这样导致action的逻辑看起来很混乱。
单一职责固然合理,但如果因此而引入大量的action类导致其他的如管理上的问题又是否值得呢?况且单表的CRUD操作之间也可能是有关联的,如删除操作后可能需要调用查询操作来返回一个新的产品列表。
我甚至觉得这是webwork设计上的一个问题,使用无侵入的getter/setter方式和视图间传递(交换)数据本身没有问题,但在action中使用属性(实例变量)也会带来很多的问题,不够清晰,而且搞的最后action也只有每次产生新的对象来保证线程安全问题,还有action的返回值使用String也不够OO,连struts都用了一个ActionForward来封装。
顺便说说我比较希望的方式:
[code]public class ***Action implements Action
{
private ProductManager productManager;
public ModelAndView update(ActionContext context)
{
Product product =(Product)context.getRequestArg("product");
productManager.update(product);
ModelAndView respOjb=new ModelAndView();
respOjb.addModel("product",product);
respOjb.setView("success");
return respObj;
}
.....
}[/code]
和事件机制类似,无状态,代码不比webwork长,有点像Spring的MVC了,但又没有和servlet产生依赖。