锁定老帖子 主题:我对struts的一些实践
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-07-19
1 让配置文件更容易管理:在web.xml中配置(关于模块间转换参照google) <init-param> <param-name>config/ex1</param-name> <param-value>/WEB-INF/struts-configex1.xml</param-value> </init-param> 这样,所有在struts-configex1.xml中出现的path都以/ex1/path访问 2 DispatchAction,将所有相关的业务(load,insert,query,del,list。。。)放到一个action,更加合理地安排action的粒度,所有的方法调用在struts-config.xml中的param中声明 public class DispatchAction extends Action private String invoke(String methodName);throws Exception {cls.getMethod(methodName, null);.invoke();; } public ActionForward execute();{ return mapping.findForward(invoke(mapping.getParameter();););; } 只要将你自己的action继承这个类就行了,直接把业务方法写上即可,无须其他代码 public class TeacherAction extends DispatchAction public String del();{ BoTeacher b=new BoTeacher();; //do something before,eg.getFormbeaninfo b.del(bean);; } public String query();{request.setattr(bo.query(););;} public String insert();{}; 3 显示层,控制层,业务层,数据库操作层之间的数据共享 每个框架都会有这种功能, struts的解决方案不值得一提,把request对象传来传去 这样做简单,但不好维护代码。下面介绍两种方案,一种是和webwork的方法类似,来自JPetStore,另一个是自己的,比较繁琐。 方案一:代码参见JPetStore的 com.ibatis.struts.httpmap;核心类是ActionContext,它是一个ThreadLocal类,所有的作用域(request,session,application,~~~)都可以在这个类中得到,这些作用域被转换成map然后放进了ActionContext对象,访问方法: ActionContextgetActionContext.getSessionMap();.get(key); 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-07-19
dazuiba 写道 webwork固然优雅,但struts才是王者,评价一个框架不能光看优雅二字,有太多的东西要考虑。还有,框架不是最主要的,程序自身的设计才是核心
...... 不明白你这结论如何得出的,话说出来是很容易的,但是不能从你的文章得出这个结论。 |
|
返回顶楼 | |
发表时间:2005-07-19
方案二:这个方案我说的可能有些罗嗦(水平所限)
总体上说,这个方案只是对struts的一些改进,首先修改所有action的父类DispathAction(上面提到的)的excute方法,在上面的论述中,该方法只是做了个方法转交,现在增添对request,response,form对象的封装,代码如下: public class DispatchAction extends Action { private ThreadLocal threadLocal = new ThreadLocal();; public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response); throws Exception { HashMap map = new HashMap();; map.put("req" , request);; map.put("rep", response);; map.put("form", translateToMap(form););; threadLocal.set(map);; String reval = invoke(mapping.getParameter(););; return mapping.findForward(reval);; } public getMap();{return threadLocal.get();; } public getRequest();{return threadLocal.get("req"); public getSession();{return threadLocal.get("req");.getSession();; } public getRep();;同上 public getForm();;同上 } 有了这层封装以后,页面的数据往里传就好多了,比如“注册用户” public class RegistAction extends DispatchAction{ public String reg();{ BoReg bo=new BoReg();; Boreg.add(getForm(););; return "SUCCESS"; } }不错把,就这么几行代码,功能都分解到了father和Bo,如果再在bo中加入动态的方法处理加以简化,就可以让代码量达到最小。 [/b] |
|
返回顶楼 | |
发表时间:2005-07-19
引用 dazuiba 写道:
webwork固然优雅,但struts才是王者,评价一个框架不能光看优雅二字,有太多的东西要考虑。还有,框架不是最主要的,程序自身的设计才是核心 ...... 不明白你这结论如何得出的,话说出来是很容易的,但是不能从你的文章得出这个结论。 只是对web设计的一些自己的看法,好的设计不需要多优雅的框架,只是希望以后少谈框架的运用,多谈设计层面上的东西。 javaeye的一个使命使将struts推下神坛,将webwork扶上框架的王座,在我看来这大可不必,王座上的永远不可能是哪个框架,而是用框架开发出的产品。 随便从国外的论坛溜溜,你就会发现,webwork的普及还不现实。 |
|
返回顶楼 | |
发表时间:2005-07-20
只能说是井底之蛙罗。任何一件事物都有别人不可比拟的一面,就看你自己要选择那种,不要误导别人。
|
|
返回顶楼 | |
发表时间:2005-07-20
dazuiba 写道 方案二:这个方案我说的可能有些罗嗦(水平所限)
总体上说,这个方案只是对struts的一些改进,首先修改所有action的父类DispathAction(上面提到的)的excute方法,在上面的论述中,该方法只是做了个方法转交,现在增添对request,response,form对象的封装,代码如下: public class DispatchAction extends Action { private ThreadLocal threadLocal = new ThreadLocal();; public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response); throws Exception { HashMap map = new HashMap();; map.put("req" , request);; map.put("rep", response);; map.put("form", translateToMap(form););; threadLocal.set(map);; return mapping.findForward(reval);; return null; } public getMap();{return threadLocal.get();; } public getRequest();{return threadLocal.get("req"); public getSession();{return threadLocal.get("req");.getSession();; } public getRep();;同上 public getForm();;同上 } 有了这层封装以后,页面的数据往里传就好多了,比如“注册用户” public class RegistAction extends DispatchAction{ public String reg();{ BoReg bo=new BoReg();; Boreg.add(getForm(););; return "SUCCESS"; } }不错把,就这么几行代码,功能都分解到了father和Bo,如果再在bo中加入动态的方法处理加以简化,就可以让代码量达到最小。 [/b] struts1.1后我就没碰过了,不知道你提的这些功能是否基于最新的feature。但我非常怀疑你这段代码是否真的实际应用到项目中了。 你这个自定义的DispatchAction是extends Action的,并不是Struts的那个DispatchAction,那RegistAction执行的是execute(),怎么可以执行reg()?通过Struts-config来配置调用的方法,还是RegistAction重写一下execute()来手工调用reg()? 如果是通过配置来调用reg(),那执行reg()前难道框架还自动先调用execute()完成你那堆map.put()? 如果是重写execute()手工调用,那你还得完成DispathMethod,不烦么? |
|
返回顶楼 | |
发表时间:2005-07-20
引用 只能说是井底之蛙罗。任何一件事物都有别人不可比拟的一面,就看你自己要选择那种,不要误导别人。 我水平太低,是个初学者,井底之蛙是暂时的,但没有误导人的意图。只是总结一下近来的开发经验,目的是交流。 |
|
返回顶楼 | |
发表时间:2005-07-20
ww2和struts都是优秀的表示层框架,但是他们的设计角度是不同的。选择什么样子的框架进行开发,可能并不取决于某个框架本身究竟有多出色,设计有多优雅,而是你在选择这个框架的时候,这个框架本身是否能解决你的很多现实问题。
我当初一直是用Struts进行表示层开发的,比起当初jsp,servlet的时代,我一直觉得Struts使我的开发思路更加清晰,代码结构更加完善。然而同时我也感觉到Struts在某些方面比较麻烦,比较典型的问题,比如,它的标签不太好用,需要一定的时间来学习,而此时,让美工去理解这些标签简直就是天方夜谈。再比如,Struts的Action从页面上面取数据其实和Servlet并没有什么两样,对于类似数组、List、Date这样的特殊数据类型的传递基本上都要写一个FormBean或者在Action中用request.getParameter这样来获取,让我感觉很不爽。 在这以后,接触了ww2,学习了拦截器框架,学习了OGNL置值。了解了更多除了JSP以外的页面表示模板等。而像拦截器这样的设计,让我感觉我可以将Action的代码更加关注于一个主要事件流,我觉得非常爽。而OGNL则更加解决了我从页面到Action的置值问题。 所以,正因为ww2可以解决我的问题,我选择了它,而并不是因为它多优秀,Struts目前是很普及,也很优秀,并且在不断的发展中,没准哪天我发现Struts能解决我更多的困惑,我也会回头选择Struts的。 |
|
返回顶楼 | |
发表时间:2005-07-21
dhj1 写道 这些代码我看是没有问题的,原来很多人在批判STRUTS时,是去批判它的最初的版本. ![]() 现在STRUTS新的版本是1.27有很多新特性. DispathMethod是一个1.1版本中很好用的特性. DispathMethod子类中如果有方法A,B,C等,在网页中引用时,带个POST或GET参数method=A,method=B,method=C 等,就可以分别引用了. 你自已没搞懂就在这里说是重写execute(),还说是MAP一堆东西,还自已说烦,现实中是没有人这样做的. 你要评论一个东西,你得先去了解这个东西.不然只能是乱说或者大家说什么就跟着说什么. 唉,又得和你说一大通了。我知道Struts1.1的DispatchAction怎么用,除非你说1.27增加了DispatchAction的新的用法。此DispatchAction是彼DispatchAction吗?你看清楚他的DispatchAction extends什么类了?你能通过通过传Parameter的方式method=reg来调用reg()他这个DispatchAction吗。他的代码还有其它的问题,只是权当他是笔误罢了。 |
|
返回顶楼 | |
发表时间:2005-07-21
难道不是应该这样吗?
abstract class BaseAction extends org.apache.struts.actions.DispatchAction { private static ThreadLocal threadLocal = new ThreadLocal();; public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response); throws Exception { HashMap map = new HashMap();; map.put("req" , request);; map.put("rep", response);; map.put("form", translateToMap(form););; threadLocal.set(map);; return super.execute(mapping,form,request,response);; } ...... } public class ActionA extends BaseAction { public ActionForward reg(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response); { ...... } } |
|
返回顶楼 | |