第一个问题就是javaBean能否用ActionForm替代?
例如:
[javaBean文件]
public class javaBeanTest{
    private String name;
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
}[ActionForm文件]
public class actionFormTest extends ActionForm{
    private String name;
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void reset(){
         this.name = null;
    }
    public ActionErrors validate(ActionMapping mapping,HttpServletRequest request){
    }
}
拿这个做测试,把javaBeanTest用actionFormTest替换编译没出错,而且页面调用也正常(数据原本存在javaBean中,页面调用该属性)。但有一个疑问:
这样的话,javaBean可以用ActionForm替换?替换了之后有得有失?得什么?失什么?另外一个问题(以上面描述为基础):
如果两者不能相互替换,而actionFormTest中的属性与javaBean的属性都相同,想在actionFormTest中实例这个javaBean,那页面中的<html:text property="这里应当怎么写?"/>?
若用代码说明,大致如下:
public class actionFormTest{
     javaBeanTest jBT = new javaBeanTest();
     public void reset(){
           jBT.setName(null);
     }
     public ActionErrors validate(ActionMapping mapping,HttpServletRequest request){}
}
配置:
<form-beans>
  <form-bean name="testForm" type="test.packs.actionFormTest"/>
</form-beans>
<action-mappings>
   <action path="/test" name="testForm" type="test.packs.actionFormAction">
      <forward......./>
   </action>
</action-mappings>
jsp的页面:test.jsp
我用
<html:form action="test">
   <nested:nest property="jBT">
       <html:text properyt="name"/>
   </nested:nest>
</html:form>

<html:form action="test">
   <nested:nest property="javaBeanTest">
       <html:text properyt="name"/>
   </nested:nest>
</html:form>
都不行,不知道这种情况下的html:text应当怎么写?高手帮我支支招,谢谢。

解决方案 »

  1.   

    楼主:
    从你给定两个class来看从使用上互换是没有区别的.
    但是从概念上看是有区别的.actionform主要是用户标记form属性和form验证.同时也是struts结构中的一个节点.而验证只用是actionform的主要任务,当然,用户可以写其他的方法过程.但是这样已经背离struts框架的初衷了.
    而javabean是所有java应用的都能用到.同时它和某个webform没有关联.也不是某种框架中之必不可少.javabean可以是属性对应,也可是是方法实现.它可以单个业务的描述,也可以是多个业务的描述.但是从规范和实际应用中,javabean基本上是单个或者关联对象的属性映射.
      

  2.   

    <html:form action="/test">
    <jsp:useBean  id="testForm" scope="request" class="test.packs.actionFormTest"></jsp:useBean>
       <nested:nest property="jBT">
        <html:text properyt="name"/>
       </nested:nest>
    </html:form>
    这样就ok
      

  3.   

    FormBean是用来封装页面中的域的对象,而我们在domain中设计的对象是与数据库表对应的对象,我觉得你说的javabean就是指domain对象。他们不能彼此替代。通常FormBean会由一个或多个domain中的对象中的多个域组成。
      

  4.   

    回 ljhyp_cn(香草山牧民) :
    从你给出的定义来说,javaBean与actionForm的关系,在struts中,前者可以被后者替换,反之不行?在非struts中就不存这种关系?
    如果按struts框架的意图,再加上我的意图,这里应当要用两个文件实现javaBean与ActionForm的关系,也就是说我需要一个javaBean文件,一个ActionForm文件,ActionForm中要调用javaBean的内容,就在其内部实例那个javaBean?另外第二个问题根据你的提示,我有个疑问,就是实例那个testForm的用处是什么?并没有调用到,这里实例有什么意义?另:按照你的思路测试也不成功,我改成:
    <html:form action="/test">
    <jsp:useBean  id="testForm" scope="request" class="test.packs.actionFormTest"></jsp:useBean>
       <nested:nest property="testForm">
        <html:text property="name"/>
       </nested:nest>
    </html:form>
    也不成功。
      

  5.   

    回蝈蝈:
    请恕我不清楚域的概念是什么:$
    我起初的思路是这样的:
    我创建javaBean是用来存取数据库的数据,然后对应的存在这个javaBean里,这样在页面中只需要调用相应的属性名即可。不知道这个算不算你说的域对象?如果是,那我要在ActionForm中要用到这些属性,是不是就要在ActionForm中实例这个对象,然后调用?
      

  6.   

    <html:form action="/test">
    <jsp:useBean  id="testForm" scope="request" class="test.packs.actionFormTest"></jsp:useBean>
        <html:text properyt="name"/>
    </html:form>对不起,没有仔细看,应该是这样的
      

  7.   

    从细节上讲,
    Struts populates the ActionForm by mapping the request parameters from the HTML form variables to the JavaBean properties of the ActionForm instance. Before it populates the form, Struts calls the reset() method of the ActionForm. (This occurs in the processPopulate method of the RequestProcessor by calling the populate
    method of RequestUtils.),当然他还提供了validate().
    而用javabean的setProperty属性时,假如有两个属性:name,class.第一次调用时name为axman,class为5,那么,这时取值,name=axman,class=5
    但第二次调用,如果没有传name,class,按我们想象应该是name="",class="".
    但jsp规范中实现应该是name=axman,class=5,就是说如果下一次调没有给property赋值的话.
    则当前值不是空,而是上一次的值.以上两段懒得自己打都是引用.上一段引用自:<<jakartastrutslive>>后面一段是axman的.呵呵.
      

  8.   

    替换是绝对可以的,但是也绝对不推荐你这么做。
    对java分层来说,formbean属于表现层对象,它相对于一个表现层的DTO,而你这里说的javabean实际上对应一个bo(也就是一个业务对象),这两者在某些时候是相同的,但是在很多地方是不同的(取决于你的业务需求)。
    对于一个良好的设计来说,要求你把这两种对象分离开来,以达到良好的可扩展性。所以,一般都是在action中进行bo与formbean的转换,这非常麻烦。实际上,也真是因为formbean起不到什么大的作用,所以structs的formbean才被很多人当作是鸡肋,巴不得去之而后快。
      

  9.   

    回 ljhyp_cn(香草山牧民):
    还是不行,前提是我在ActionForm当中实例了那个javaBean。回 thumb3344(祖国啊,我只是一个摆地摊的!) 
    或许你没明白我的问题,不过还是谢谢你让我对此有了一点了解。回 mxlmwl(飞星)
    我现在的作法是在formbean中实例这个javaBean,按你的意思,我现在这种处理方法(在formbean中实例这个javaBean)有比较良好的扩展性?
    如果真是这样的话,第一个问题是明白了,但第二个问题呢?
      

  10.   

    用<html:form action="test">   
           <html:text properyt="jBT.name"/>  
    </html:form>试试
    记得在form中对BEAN对象要进行getter,setter方法。。
    public class actionFormTest{
         javaBeanTest jBT = new javaBeanTest();
         public javaBeanTest getJBT(){
            return jBT;
    }   
         public void setJBT(javaBeanTest jBT){
            this.jBT=jBT; 
    }
         public void reset(){
               jBT.setName(null);
         }
         public ActionErrors validate(ActionMapping mapping,HttpServletRequest request){}
    }
      

  11.   

    第二个问题的写法是:<html:text properyt="jBT.name"/>你的这个做法也是一个做法,不过就是在写javascript判断的时候有点麻烦,而且生成的form表单就是的name就是jBT.name,看起来有点怪怪的。而且这种做法其实就是把bo直接传递到表现层去了,是否要这么做,网上曾有过很大的争论,对此我也没什么太好的建议。而另一种做法,也是一般的做法,就是把jbt中的属性getter()出来,然后setter()到formbean中去。如果你觉得麻烦,可以使用beanutils的copyproperties的方法,具体使用自己搜。