posts - 60,comments - 71,trackbacks - 0
form: http://www.blogjava.net/woweiwokuang/archive/2007/08/16/137171.html

最近学习了easyjweb,发现easyjweb和struts较量了,虽然说都传统的基于请求的MVC思想,但是它竭尽所能是java代码和页面分开了,结果的确做到了这一点,在easyjweb项目的页面上面你是找不到有java代码的,你看看页面的后缀都成了html了,不是jsp了。除此之外,easyjweb中还有独特的一面,不仅实现了像struts一样的MVC(MVC是easyjweb的核心),还有下面的具体实现:

1、容器及通用业务逻辑封装。作为一个旨在让基于Java的Web应用程序开发变得直接、快速、简易的框架,EasyJWeb提供了一个IoC容器,并对企业级应用中的一些通用业务逻辑(如分页、查询、DAO等)进行了抽象及封装,提供了一套可以直接操作、应用企业资源的组件及API。

2、代码生成引擎及工具。仅仅依靠一个灵活、简易的MVC核心引擎还不能最大限度的提高开发速度,因此EasyJWeb还提供了一个灵活、易用的代码生成引擎及工具,通过使用代码生成引擎,可以快速完成基于JavaEE平台的企业级应用程序生成。如数据库添删改查(CRUD)代码生成、自动页面模版生成、自动配置文件管理等。

3、EasyJWeb插件体系,项目中的各种实用功能的扩展,可以灵活地通过基于插件的形式安装到EasyJWeb中,提供各种针对性的功能。如ajax实用插件、代码生成插件等

   别的我也是不太了解,就MVC这方面说吧!不过我对easyjweb和struts都不是特别精通,就我对他们的了解说说我的看法吧!
第一:先来看看他们的配置文件吧!他们都有web.xml,下面的配置easyjweb和struts必须有的。
easyjweb中的web.xml文件的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>com.easyjf.web.CharsetFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value> 
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<servlet-name>easyjf</servlet-name>
</filter-mapping> 
  <servlet>
    <servlet-name>easyjf</servlet-name>
    <servlet-class>com.easyjf.web.ActionServlet</servlet-class>   
  </servlet>
  <servlet-mapping>
    <servlet-name>easyjf</servlet-name>
    <url-pattern>*.ejf</url-pattern>  
  </servlet-mapping> 
</web-app>


struts中的web.xml中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

</web-app>

 

呵呵,你可以看到easyjweb和struts都是通过自己的servlet来处理逻辑和接受http的请求。
他们分别把请求交给了easyjf-web.xml和struts-config.xml来处理请求和控制页面的转向。不过我说的都是他们默认的配置文件,你也可以在他们的web.xml中配置相应的配置文件。
如在easyjwb中的web.xml中你可以添加这样的配置

 <context-param>
  <param-name>easyjwebConfigLocation</param-name>
  <param-value>/WEB-INF/mvc.xml,/WEB-INF/mvc-bbs.xml,/WEB-INF/mvc-ec.xml,/WEB-INF/easyjf-web.xml</param-value>
 </context-param>

在struts中我想就不用说了吧!呵呵,还是说说吧!添加就可以了。如:

  <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config-zhangsan.xml,/WEB-INF/struts-config-lisi.xml</param-  value>
    </init-param>
如果你想详细了解的话,就看easyjweb和struts配置文件的说明吧!google.com就可以了。哈哈。。。


第二:我们来看看他们的分别的easyjf-web.xml和struts-config.xml吧!只他们中最简单的地方噢!

easyjf-web.xml中的配置

<?xml version="1.0" encoding="utf-8"?>
<easyjf-web>


<module path="/hello" form="" scope="request"
  action="com.easyjweb.action.MessageAction" defaultPage="hehe">
  <page name="hehe" url="/message.html" type="template" />

</module>
</easyjf-web>


sturts-config.xml中的配置:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
  <data-sources />
  <form-beans >
   <form-bean name="productForm" type="com.cclen.forms.ProductForm"/>
  </form-beans>
 <action path="/marketWeb"
     type="com.cclen.actions.MarketWebAction"
     name="marketWebForm"
     scope="request">
     <forward name="listmarkweb"           path="/administrator/proxy/proxy_Add.jsp"></forward>
     </action>
  </action-mappings>
</struts-config>


在以easyjweb中的配置文件中,我们需要有hello.ejf来请求com.easyjweb.action.MessageAction的处理。     
不过module这里还有比struts更牛比的东西配置呢,就是Module中也包含了Page对象,控制器,拦截器,注入的bean.
这里可以参考easyjweb的文档来具体的了解。。


在struts里面中的配置文件中,我们需要有marketWeb.do来请求com.cclen.actions.MarketWebAction的处理。
哦,他们的后缀名都可以随便的改变,在需要在web.xml中配置,你改一下试试就可以明白了。

第三:终于到了Action了,这个里面的东西我们来看看了,就我知道的说啊!在网上千万可别骂我。
1、easyjweb中三种的Action分别是IWebAction  AbstractCmdAction  AbstractPageCmdAction

 struts中有两种的Acton分别是Action,DispatchAction

他们要作为父类,你要实现他们中间的方法啊!

2、easyjweb中的IWebAction相当于struts中的Action了啊!他们分别要实现的方法是:

IWebAction中要实现的方法是:

public Page execute(WebForm form, Module module) throws Exception;

struts中的Action要实现的方法是:

public ActionForward execute(ActionMapping mapping,ActionForm form,
   HttpServletRequest request,
   HttpServletResponse response) throws Exception ;

从这里就可以看到easyjweb的简易,他只有两个参数,而struts中的Action方法要有四个参数,这给测试就带来了麻烦啊!

3、easyjweb中的AbstractCmdAction相当于struts中的DispatchAction了啊!即在一个Action中提供多个处理方法,比如说:
AbstractCmdAction中有这样的处理方法:
public Page doAdd(WebForm form, Module module) throws Exception;
public Page doDel(WebForm form, Module module) throws Exception;
public Page doUpdate(WebForm form, Module module) throws Exception;

在请求中使用easyJWebCommand或者cmd传递的参数直,会作为请求执行的方法名的构成。构成的规则为doXxxx()。
如:

xxx.ejf?easyJWebCommand=add,就会执行doAdd()方法了。
这个easyjwebCommand和cmd是不用配置的,不用问他们担心了。


那么struts中的DispatchAction中就应该有这样的方法了
public ActionForward add(ActionMapping mapping,ActionForm form,
   HttpServletRequest request,
   HttpServletResponse response) throws Exception;

public ActionForward del(ActionMapping mapping,ActionForm form,
   HttpServletRequest request,
   HttpServletResponse response) throws Exception;

public ActionForward update(ActionMapping mapping,ActionForm form,
   HttpServletRequest request,
   HttpServletResponse response) throws Exception;
在请求中要通过struts-config.xml中的Action配置的parameter参数来传递,
如:
<action path="/marketWeb"
     type="com.cclen.actions.MarketWebAction"
     name="marketWebForm"
     parameter="hahahaha"
     scope="request"/>
marketWeb.do?hahahaha=del,就会执行方法
public ActionForward del(ActionMapping mapping,ActionForm form,
   HttpServletRequest request,
   HttpServletResponse response) throws Exception;

 


不过easyjweb中的AbstractCmdAction有一个默认的方法是:
public Page doInit(WebForm form, Module module)
这个方法是当你没有传入具体参数时,要调用的方法了。
就是说用 执行xxx.ejf时,就是执行上面的方法了


4、easyjweb中的AbstractPageCmdAction是非常智能的啊!struts中真的没有了啊!easyjweb中特有的方法了。
在AbstractCmdAction的基础上,EasyJWeb提供了另外一个对视图具有自动识别能力的AbstractPageCmdAction。该类能通过应用“惯例代替配置”来智能判断程序中要使用的视图模板,甚至不需要书写方法签名也可以调用视图模板。如:
public void doEdit(){}
该方法中虽然没有一句代码,也没有明确的视图切换或转向。但AbstractPageCmdAction会根据惯例原则,自动选择edit.html文件作为视图模板。
这些牛牛人啊!还弄这么智能的东西出来啊。佩服佩服!

 

第四:来看看easyjweb和struts对表单数据的获取和返回吧! 分别用easyjweb中的IWebAction和struts中的Action来说明问题吧!
 1、用实现IwebAction就要实现方法
public Page execute(WebForm form, Module module) throws Exception;
看到了吧!其中只要两个参数,webForm就可以解决获取表单数据和返回页面数据(返回页面数据就是指在action中处理过的数据将添加到页面上)
 
在WebForm中可以直接使用WebForm.get("poropertyName")来得到文本参数,而对于二进制的内容,直接使用WebForm.getFileElement("poropertyName")来处理.
一般不会用到form的,<form>元素用来定义前台页面表单的信息,一个WebForm就可以做到了。
WebForm还提供了两个方法:WebForm.toPo(Object obj):传入一个对象,直接从WebForm中拷贝值到改对象中。

WebForm.toPo(Class clazz):传入一个类型,WebForm会初始化这个类型的实例再将WebForm中的值拷贝
具体这两个方法的有更多的用法,请参考easyjweb的文档:www.easyjf.com

 

而表示层返回数据的话,就要用new WebForm().addResult()把数据添加到Velocity上下文中。WebForm也提供了一个简便的WebForm.addPo(obj)来处理多属性的对象的值的添加

还要注意这点啊 !WebForm在将数据保存到Velocity上下文时,不光要保存使用addResult方法和addPo方法放入的值,还要向Velocity上下文中保存textElement中的数据,意味着重复的数据可以不用在Action中重复的添加,这在应用中需要特别注意。

 

2、用实现Action就要实现方法
public ActionForward execute(ActionMapping mapping,ActionForm form,
   HttpServletRequest request,
   HttpServletResponse response) throws Exception ;
MessageForm messageForm = (MessageForm) form;

你可以配置ActionForm来取得数据,也可以通过request.getParameter(arg0)来去的数据,但是这里存在了情况了,但我不知道struts里面没有没更好的解决方法。比如说,对于二进制的内容,如果用到了org.apache.struts.upload.FormFile的话,你就必须用到ActionForm来取的数据了。

返回到表示层的数据就request.setAttribute("",object);


第五:页面数据的输出:

1、easyjweb中用的是Velocity作为页面引擎的,Velocity的语法简单,易学,并且是美工最喜欢的html页面,在这里你是找不到java的代码的。
2、struts有自己的标签,或者用sun公司支持的jstl标签,你不得不在页面上引用对象的类型,因为你传送到页面上的对象他们是无法识别的。
你可以看看你的jsp页面的顶部有没有这样的代码 import="java.sql.*,java.lang.*"这就是java代码啊!


第六:页面的转向。
1、easyjweb中的处理控制器就交给了Module,其实一个Module是包含着IWebAction,而在IWebAction中,却是在调用Module的资源。
如果要返回一个Page模版页面,只需要调用module.findPage("pageName")就能得到了。因为在Module中给我们配置了资源:
如:
<module path="/hello" form="" scope="request"
   action="com.easyjweb.action.MessageAction" defaultPage="hehe">
   <page name="hehe" url="/message.html" type="template" />
  </module>

它<page name="hehe" url="/message.html" type="template" />就是给我们配置的模板资源,只要在com.easyjweb.action.MessageAction 中通过module.findPage("hehe")就可以调用message.html的模板了。也可以直接返回new Page(,,),如:return new Page("succ","/user/success.html","html")


2、在struts中是把页面控制交给了ActionMapping,ActionMapping通过调用findForward(),即ActionMapping.findForward("name")转向。

如:
 <action path="/product"
            type="com.cclen.actions.ProductAction"
            name="productForm"
            parameter="method"
            >
            <forward name="listproduct" path="/administrator/product/listproduct.jsp"></forward>
           </action>
  你需要在com.cclen.actions.ProductAction中这样来指定页面ActionMapping.findForward("listproduct");


第六:我再重申一下在easyjweb中struts没有的东西。

easyjweb之所以能实现快速开发,是因为里面给我们提供了更好的实现,提供了工具类,强大的超级容器等等,由于俺是初学者,等俺精通了以后将慢慢补充easyjweb精彩方面!

 

 

 

posted on 2008-07-14 17:29 henry1451 阅读(240) 评论(2)  编辑  收藏

FeedBack:
# re: EasyJWeb vs Struts(转)[未登录]
2008-07-14 20:26 | javaread.com
看了觉得应该跟appfuse比或者springside  回复  更多评论
  
# re: EasyJWeb vs Struts(转)
2008-07-18 21:36 | henry1451
@javaread.com
呵呵,谢谢你的评论,确实,可能EasyJWeb用的比较少,但这是次要的,主要是比较两个优秀的框架时能看出它们的长处与不足之处,这样有利于我们明白一个优秀框架的精华所在,以便吸取它们的良好设计思想.  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: