HoffmanSong 2009-08-23 21:51
浏览 229
已采纳

关于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 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]

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条