display tag 使用技巧(一)

阅读更多
display tag的相关介绍网上不算太多,所以学习还是要自己摸索,比较好的介绍:
http://hi.baidu.com/lvjunnan/item/aa5abcf4289e91bc31c199db
http://hi.baidu.com/hicc2012/item/39aec890118bfc18934f415f
但是这些介绍的都比较肤浅,甚至有的例子我都跑不通。
今天记录一个我自己用的例子:display 中使用checkbox 作为一列的相关操作
背景:我们很多地方需要设一对多的关系,这样第一个页面选择主key,第二个页面展示所有的可选项,并且把已经选上的条目打上勾,用户可以重新选择后提交新数据。

先描述先display tag的代码
${row_rowNum}

可能有点乱,但是大概实现的功能就是展现后台从DB中查询出来的table。
第一列是编号,跳过不讲。
第二列是我要讲的checkbox列,主菜单上有个checkbox,用来多选。
下面2个是导出文件,定义了文件格式和名称。

在action中生成需要展现的list就行了,别忘了userFuncList的属性构造器:
public String view(){
	userFuncList tempFunc = service.loadUserFunctions(userID);
	return SUCCESS;
        //略去具体逻辑
	}

在model驱动实体里面有一个属性是表示要不要打勾的。
上面的代码大致能显示出来记录了,但是并不能满足我们打勾的目标,因为decorator="com.mmif.web.decorator.SelectDecorator" 我们还没有实现。
装饰者或者是装饰器,主要用来修改栏位的显示方式,在1.1里面需要实现ColumnDecorator 接口,在1.2里面接口被定义成DisplaytagColumnDecorator,所以我们需要实现这个接口来显示checkbox
public class SelectDecorator implements DisplaytagColumnDecorator {

	@Override
	public Object decorate(Object arg0, PageContext arg1, MediaTypeEnum arg2) throws DecoratorException {
      Integer elementid = (Integer) arg0;
//省略了判断逻辑
      return "";
}
}

值得注意的是,如果显示的记录有多条,这个方法会被调用多次,但是你不能从每次调用的PageContext 中获取到当次调用的具体request信息,而PageContext中保留的是你最后一条记录的信息,这点我觉得很不好,需要再完善。
如果你使用的是复杂类型,我建议是放在session中共享数据,自己做好清楚动作。

这样就可以根据你的逻辑判断给需要打勾的记录打上勾了。

然后是提交数据了,如果你没有区分id,那么提交打包的数据将是一样的name,这个感觉不太好,所有大家注意到我的checkbox的name都加了key作为标识,这样在取数据的时候会方便点。如果没有选中的记录,提交时是不会打包数据的,这点很好。
selected2 2 11
selected4 4 11

到这里整个的需求就基本完成了,有很多地方需要完善,但是大家可以看看我上面转的2个链接,那是基础的东西,再看看我写的,可能就不觉得那么乱了。

记录以备查询。

你可能感兴趣的:(java,dojo,display,tag)