首先,要糾正下在《自定義-擴展struts2的標籤》一文中筆者的分析。在該文中筆者說,
最近在做j2ee的項目,需要封裝很多標籤,發現直接從BodyTagSupport繼承的話,無法獲取valuestack,也無法借用struts的國際化解決方案。所以需要擴展struts的標籤。
最近研究發同,其實即使從BodyTagSupport類繼承來實現自定義的標籤類,也可以取到valuestack. ,如下所示:
ValueStack stack = TagUtils.getStack(pageContext);
最近實現的一個日期控件就是這樣做的:
package com.jdgm.common.tag;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.views.jsp.TagUtils;
import com.jdgm.framework.model.UiItem;
import com.jdgm.platform.ConstantsPF;
import com.jdgm.platform.common.enums.QueryControlType;
import com.jdgm.platform.common.enums.QueryOperatorType;
import com.jdgm.platform.common.tag.CommonStrutsTag;
import com.jdgm.platform.components.log.LogUtil;
import com.opensymphony.xwork2.util.ValueStack;
/**
*
* @author zhangpf 20120801
* 因爲之前使用的jscalendar的諸多問題,在當前項目中不得不擴展自己的控件,使用My97Datepicker
*/
public class Calendar extends BodyTagSupport{
private String id="";
private String name="";
private String value="";
/**
* 日期格式
* 年月日:yyyy-MM-dd
* 年月日 時分秒:yyyy-MM-dd HH:mm:ss
*/
private String format="yyyy-MM-dd";
/**
* 當只讀爲true是,不會顯示輸入框右側的圖片,也不能打開日期編輯窗口
*/
private String readonly="false";
private String width="150";
@Override
public int doEndTag() throws JspException {
try{
String content ="<input readonly type='text' id=\"%s\" name=\"%s\" value='%s' style='width:%s' %s > \n %s";
// 取得值棧,實現回顯功能
ValueStack stack = TagUtils.getStack(pageContext);
String valueStr="";
if(stack!=null)
{
Object obj=stack.findValue(name);//取出的對象,可能是timestamp也可能是String
if(obj!=null)
{
//把取得值轉換成用戶設置的格式
SimpleDateFormat formatter = new SimpleDateFormat(this.getFormat());
Date date=null;
if(obj instanceof Timestamp)
date=formatter.parse(((Timestamp)obj).toString());
else if(obj instanceof Date)
date=(Date)obj;
else
date=formatter.parse(String.valueOf(obj));
if(date!=null)
valueStr=formatter.format(date);
}
if(StringUtils.isNotBlank(valueStr))
value=valueStr;
}
String out=String.format(content, this.getId(),this.getName(),value,this.getWidth(),this.getClickAction(),this.getImage());//
pageContext.getOut().println(out);
}
catch(Exception e)
{
LogUtil.error("生成日曆控件失敗", e);
}
return EVAL_PAGE;
}
/**
* 點擊動作的實現js
* 用於輸入框和日曆圖標的點擊事件
* @return
*/
private String getClickAction()
{
if(readonly.toUpperCase().equals("TRUE"))
return "";
return "onclick=\"WdatePicker({el:'"+this.getId()+"',dateFmt:'"+this.getFormat()+"'})\" ";
}
/**
* 輸出右側的日曆圖標
* @return
*/
private String getImage()
{
if(readonly.toUpperCase().equals("TRUE"))
return "";
return " <img src=\""+ConstantsPF.URL_WEBSITE+"/img/calendar.png\" width=\"16\" height=\"16\" \n"
+this.getClickAction()
+" style=\"cursor:hand\"> ";
}
....................//各變量的get/set函數就不寫出來了
}