刚学struts2和hibernate3struts2的action中可以直接设定属性来接收页面传递来的值,或者定义一个VO对象VOEmployee(包含setter和getter) 来使用employee.name,enployee.age 等接受来自页面的字段age和name。菜鸟现在有如下几个问题请教各位:1.在持久层我们肯定也定义了一个PO对象PoEmployee,这个对象和以上的实体对象不就有些重复了么?但是将持久对象放到action中来接受来自页面的传递值,是不是不符合设计? 持久层不应该穿透逻辑层到上面来吧?2.假若页面的字段传递过来中,是一个关于员工添加的页面addEmployee.jsp ,其中包含员工的信息和其所在员工的部门信息。
在数据库中肯定对应的是员工信息表(其中肯定有一个字段是部门ID)定义持久层的PO类,大家肯定会都定义如下:class POEmploy
{
    private String name;
    private Integer age;
    pirvate Department department;//定义对象关联
    //getter和setter方法
}
但这个时候,就不可以放到action中来接受页面的传递的字段值了吧? 页面传递的是部门 id 值,而这里po类中使用的是部门这个对象.那是不是得又单独建立一个vo对象用来接收页面传递的值,像这样?:class VOEmploy
{
    private String name;
    private Integer age;
    pirvate Integer depId; //部门编号
    
    //getter和setter方法
}
这样可行吗?有人说直接使用action中字段的属性接收,当你页面有十几个值要传递时候,action中很多很多属性,不是乱七八糟感觉多建立以个vo来接受页面参数传递值,那又比struts1的actionForm 好得到那里去呢?不知道各位在商业项目中到底是怎么做的啊,请说说。 谢谢.

解决方案 »

  1.   

    http://blog.csdn.net/APOLLO_TS/archive/2010/02/23/5318740.aspx如果很多属性页面可以使用对象属性,这样action没有过多的属性,只有一个对象。struts默认没有采用模型驱动大概就是这个原因,模型驱动只是照顾1的遗留程序。
      

  2.   

    看了你的博客 不过没有找到我要问的问题  需要在建立以个不同于PO的VO对象来接受页面传递的字段值嘛???
      

  3.   


    1.也不一定 不是盲目的将PO转换成VO(虽然有些时候总感觉前台和数据库都用一个实体感觉不自在..)
      几个目的  首先是封装 有些时候一个VO可能变成多个PO 或者有些时候PO里的数据不适合显示到前台 所以中途要有个封装的过程 顺带说一下 PO跟SESSION是有关系的 所以有些时候没VO来的方便(这个很重要)
    2.如果你选择直接使用PO作为FORMBEAN的话 不是不可以 像你说的这种情况我们通常都会建立一个瞬态的属性 用来在不方便的时候方便一下
      

  4.   

    也可以通过在PO里写个转换器 用来应对多种情况 比如说作为FORMBEAN的时候怎么怎么用 作为EntityBean的时候怎么怎么用 他俩之间可以互相切换
      

  5.   

    我个人是这样认为的:
    不用定义voemploy,虽然页面上可能有n多属性但只要在Action中new一个po对象即可,交互操作的是一个对象,例如添加一个或者删除一个都是对实例化的这个对象进行的操作。