HoffmanSong
2009-08-23 21:51 阅读 223
已采纳

关于Struts 2的类型转换

一个业务需求是:
栏目与模板的关系是多对一的关系,增加栏目时,需要在页面中选择栏目所使用的模板。
栏目的PO:
public class Testcolumn implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String colname;
private Testtemplate temp;
…………
}
模板的PO:
public class Testtemplate implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String tempname;
private String tempbody;
private Set columns;
…………
}

增加栏目的JSP包含如下代码:





/s:form

在后台的Action方法中,通过前台获取到了模板对象的id,那么我要么new一个带id属性的模板对象给栏目对象的这个模板属性赋值,要么使用Spring的BeanUtils使栏目的temp属性赋值。
Struts 2中能否直接对栏目的temp属性进行赋值。

我尝试着将JSP页面中的s:select修改为:

但出现后台错误。
请问大家这样的问题你们都是如何解决的?Struts 2是否具备这样的功能?
[b]问题补充:[/b]
首先先谢谢各位的帮助,我在补充一下我的问题。

PO还是之前那样。
栏目的PO对象中关于模板的属性是一个模板对象,两者是多对一的关系。
当在页面上需要增加栏目(Testcolumn)时,首先点击增加按钮后,首先先进入Action的一个叫addjump(),方法从数据库中将所有的模板(Testtemplate)获取并封装到一个List中(public List templist;)
之后跳转到新增的JSP页面。
在页面中,通过填写栏目名称,并选择栏目所使用的模板之后,提交便可增加栏目对象。

这里说一下再Struts1时我的JSP页面。



  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

9条回答 默认 最新

  • 已采纳
    walsh_bupt walsh_bupt 2009-08-23 23:59

    [color=red]首先明确说明,这种情况下,Struts 2中不能直接对栏目的temp属性进行赋值。[/color]

    原因如下:
    [quote] [/quote]

    如果你的select中[color=red]listKey="id"[/color],listKey的值为id,那你的name值必须是column.temp.id;这样当后台接收到这个id的时候,会利用反射机制自动调用你的模板类中的setId()方法,从而为模板的id赋值。(最重要的一点就是,当点击增加按钮时,对于这个select,传递的是listKey指定的值,其他不会传递任何和这个select有关的值)

    至于你说的,如果改为:
    [quote] [/quote]

    name="column.temp",当后台接收到的时,会自动查找是否有setTemp()方法,查找到没有,就是有也会出现异常,以为类型不对,不信,你可以试试,你传递的是字符串类型,而后台需要赋值的是模板类型,当然会出现异常了。

    所以通用的方法是:
    [code="java"]import com.opensymphony.xwork2.ActionSupport;

    public class OperationAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    private Testcolumn column;

    public Testcolumn getColumn() {
        return column;
    }
    
    public void setColumn(Testcolumn column) {
        this.column = column;
    }
    
    public String execute() {
        System.out.println("栏目的名称:" + column.getColname());
        System.out.println("栏目描述:" + column.getColdesc());
        Testtemplate template = new Testtemplate();
        template.setId(column.getTemp().getId());
        column.setTemp(template);
        //save(column)//保存操作,或调用DAO
        return SUCCESS;
    }
    

    }[/code]

    上面我只是给你举了一个例子。

    点赞 评论 复制链接分享
  • wanghaolovezlq wanghaolovezlq 2009-08-23 22:12

    你这可能是没把s:select 标签使用正确吧,应该是可以的

    点赞 评论 复制链接分享
  • wanghaolovezlq wanghaolovezlq 2009-08-23 22:16
    点赞 评论 复制链接分享
  • Killvin KILLVIN_LIU 2009-08-24 00:55

    自己做类型转换,可以参考http://struts.apache.org/2.0.14/docs/type-conversion.html

    在这个例子中Struts2根本不可能知道你的业务逻辑也就不可能将template对象传给Action,你需要自己实现TyperConverter接口

    点赞 评论 复制链接分享
  • iteye_15225 iteye_15225 2009-08-24 10:10

    Struts支持这种对象的嵌套,但是要提供默认的构造函数或者已经初始化。

    如果这样的话Testcolumn 中的TestTemplate对象只有一个id值。

    不知道满足不满足LZ的需求。

    要不LZ再具体说一下自己的需求,这个问题不难。

    点赞 评论 复制链接分享
  • walsh_bupt walsh_bupt 2009-08-24 14:22

    [size=large][color=red]楼主,你好好看看我我回答吧,你如果明白Struts2传递参数的原理,以及select标签的功能,可能就不会再问了。上面我已经给你分析很清楚了。

    另外你在好好看看,我给你讲的select标签传值的原理吧。[/color][/size]

    点赞 评论 复制链接分享
  • iteye_15225 iteye_15225 2009-08-24 14:37

    还是没有看懂LZ想表达什么意思。

    如果页面中只有column.temp.id那么在Action中的column的template对象只有id值,不会有别的值,这个Struts2可以帮你搞定。

    点赞 评论 复制链接分享
  • iteye_15225 iteye_15225 2009-08-24 14:55

    listKey="id"传的是templist列表中各个模板对象的id值,
    我想能否直接传递templist列表中的模板对象。

    这个肯定不行了,listkey是用来渲染option value值的,怎么可能是一个模板对象呢?

    LZ这样的想法出于什么目的,是要搞定什么问题?

    点赞 评论 复制链接分享
  • walsh_bupt walsh_bupt 2009-08-24 14:56

    [size=large]楼主你不要想着Struts2的select标签有多么强大,当你提交表单后,对于select标签,也只能传给后台[color=red]listKey="id"[/color],listKey所指定的值。别的不会传递任何东西,当然有关栏目的名称,根本就不会传到后台,这个和Html中的select一样的。

    只不过在后台接收到id之后,根据你select中的name属性column.temp.id(这个也相当于html中的name),然后利用java的反射机制,调用你模板中的setId()方法,为你的模板属性id赋值,只能做到这一点。明白了吗。

    置于你说的直接获取模板,是做不到的。
    最多也只能通过我上面给你说的方法,再说中写法,也和你数据库中表对应着的,数据库中表模板和栏目是多对一关系,所以在你保存栏目的时候,只需要模板的id就行了,因为这个id就是你栏目表的外键,既然是外键,那你也就可以通过该id获取模板的信息了。[/size]

    点赞 评论 复制链接分享

相关推荐