Struts中自定義標籤中獲取值棧valuestack

    首先,要糾正下在《自定義-擴展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函數就不寫出來了	
	

}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章