论坛首页 Java企业应用论坛

我对struts的一些实践

浏览 9469 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-07-19  
webwork固然优雅,但struts才是王者,评价一个框架不能光看优雅二字,有太多的东西要考虑。还有,框架不是最主要的,程序自身的设计才是核心,最近看到了一些可以减少代码量和代码重用的例子,贴出来共享,也希望javaeye的高手们多贴些代码,加上自己的评价和总结,统统放出来。

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); 
   发表时间:2005-07-19  
dazuiba 写道
webwork固然优雅,但struts才是王者,评价一个框架不能光看优雅二字,有太多的东西要考虑。还有,框架不是最主要的,程序自身的设计才是核心
......


不明白你这结论如何得出的,话说出来是很容易的,但是不能从你的文章得出这个结论。
0 请登录后投票
   发表时间: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]
0 请登录后投票
   发表时间:2005-07-19  
引用
dazuiba 写道:
webwork固然优雅,但struts才是王者,评价一个框架不能光看优雅二字,有太多的东西要考虑。还有,框架不是最主要的,程序自身的设计才是核心
......



不明白你这结论如何得出的,话说出来是很容易的,但是不能从你的文章得出这个结论。


只是对web设计的一些自己的看法,好的设计不需要多优雅的框架,只是希望以后少谈框架的运用,多谈设计层面上的东西。

javaeye的一个使命使将struts推下神坛,将webwork扶上框架的王座,在我看来这大可不必,王座上的永远不可能是哪个框架,而是用框架开发出的产品。
随便从国外的论坛溜溜,你就会发现,webwork的普及还不现实。
0 请登录后投票
   发表时间:2005-07-20  
只能说是井底之蛙罗。任何一件事物都有别人不可比拟的一面,就看你自己要选择那种,不要误导别人。
0 请登录后投票
   发表时间: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,不烦么?
0 请登录后投票
   发表时间:2005-07-20  
引用

只能说是井底之蛙罗。任何一件事物都有别人不可比拟的一面,就看你自己要选择那种,不要误导别人。


我水平太低,是个初学者,井底之蛙是暂时的,但没有误导人的意图。只是总结一下近来的开发经验,目的是交流。
0 请登录后投票
   发表时间: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的。
0 请登录后投票
   发表时间: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吗。他的代码还有其它的问题,只是权当他是笔误罢了。
0 请登录后投票
   发表时间: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);
        {
               ......
        }

}
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics