display tag 使用技巧(一)

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

先描述先display tag的代码
Java代码 复制代码  收藏代码
  1. <div class="displayTable">   
  2.         <display:table name="userFuncList" id="row" pagesize="15" export="true" class="displaytag" requestURI="func2user_view.action" >   
  3.             <display:column title="编号"style="text-align:center;">    
  4.                 ${row_rowNum}    
  5.             </display:column>    
  6. <display:column headerClass="dataHead" property="id.funcID" title="选中<input type='checkbox' name='checkall' value='all' οnclick='checkAll();'/> " media="html" style="text-align:center;" decorator="com.mmif.web.decorator.SelectDecorator" >     
  7.             </display:column>   
  8.             <display:setProperty name="export.csv.filename" value="Function2User.csv"/>   
  9.             <display:setProperty name="export.excel.filename" value="Function2User.xls"/>    
  10.         </display:table>    
<div class="displayTable">
		<display:table name="userFuncList" id="row" pagesize="15" export="true" class="displaytag" requestURI="func2user_view.action" >
			<display:column title="编号"style="text-align:center;"> 
				${row_rowNum} 
			</display:column>	
<display:column headerClass="dataHead" property="id.funcID" title="选中<input type='checkbox' name='checkall' value='all' οnclick='checkAll();'/> " media="html" style="text-align:center;" decorator="com.mmif.web.decorator.SelectDecorator" >	
			</display:column>
			<display:setProperty name="export.csv.filename" value="Function2User.csv"/>
			<display:setProperty name="export.excel.filename" value="Function2User.xls"/>	
		</display:table>  

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

在action中生成需要展现的list就行了,别忘了userFuncList的属性构造器:
Java代码 复制代码  收藏代码
  1. public String view(){   
  2.     userFuncList tempFunc = service.loadUserFunctions(userID);   
  3.     return SUCCESS;   
  4.         //略去具体逻辑   
  5.     }  
public String view(){
	userFuncList tempFunc = service.loadUserFunctions(userID);
	return SUCCESS;
        //略去具体逻辑
	}

在model驱动实体里面有一个属性是表示要不要打勾的。
上面的代码大致能显示出来记录了,但是并不能满足我们打勾的目标,因为decorator="com.mmif.web.decorator.SelectDecorator" 我们还没有实现。
装饰者或者是装饰器,主要用来修改栏位的显示方式,在1.1里面需要实现ColumnDecorator 接口,在1.2里面接口被定义成DisplaytagColumnDecorator,所以我们需要实现这个接口来显示checkbox
Java代码 复制代码  收藏代码
  1. public class SelectDecorator implements DisplaytagColumnDecorator {   
  2.   
  3.     @Override  
  4.     public Object decorate(Object arg0, PageContext arg1, MediaTypeEnum arg2) throws DecoratorException {   
  5.       Integer elementid = (Integer) arg0;   
  6. //省略了判断逻辑   
  7.       return "<input type='checkbox' name=\"selected"+elementid+"\" type=\"checkbox\" value=\""+elementid+"\" checked=\"checked\"/>";   
  8. }   
  9. }  
public class SelectDecorator implements DisplaytagColumnDecorator {

	@Override
	public Object decorate(Object arg0, PageContext arg1, MediaTypeEnum arg2) throws DecoratorException {
      Integer elementid = (Integer) arg0;
//省略了判断逻辑
      return "<input type='checkbox' name=\"selected"+elementid+"\" type=\"checkbox\" value=\""+elementid+"\" checked=\"checked\"/>";
}
}

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

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

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

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

记录以备查询。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值