1. 程式人生 > >Struts中自定義標籤中獲取值棧valuestack

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函式就不寫出來了	
	

}

相關推薦

Struts定義標籤獲取valuestack

    首先,要糾正下在《自定義-擴充套件struts2的標籤》一文中筆者的分析。在該文中筆者說,     最近在做j2ee的專案,需要封裝很多標籤,發現直接從BodyTagSupport繼承的話,無法獲取valuestack,也無法借用struts的國際化解決方案。所以需

struts定義標籤引入到jsp中報錯問題,不能引入問題

Can not find the tag library descriptor for "/Idefine-tags",前幾天專案就出現這個問題,我沒放在心上,不管它就去看文件和其他程式碼去了。因為平時匯入專案都是滑鼠右鍵專案——》找到build-path------》Co

如何在Spring定義標籤

標籤定義檔案 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!--matrix.xsd--> <xsd:schema xmlns="http://zhangyuy

django定義標籤和過濾器

準備(必需)工作: 1  在某個app下建立一個名為templatetags(必需,且包名不可變)的包。假設我們在名為polls的app下建立了一個templatetags的包,並在該包下建立了一個名為mytags的檔案。那麼目錄結構看起來應該就像這樣: polls/

jsp定義標籤自動載入下拉框內容

第一步:在web專案下的web-inf的tlds目錄下,新建一個配置檔案,名字為relation.tld,內容如下: 自定義標籤的字首為relation(由short-name標籤決定),屬性有saveField(要儲存到資料庫的欄位名),value(要被選中的資料值)

javaScript定義sort的比較函數,用於比較字符串長度,數值大小

var cti lin family 字符串長度 tr1 個數 new fun var arr = [‘aa‘, 23, 1.2, ‘bb‘, ‘cc‘]; var len = arr.length; // for (var i = 0; i < len; i++)

JavaScript定義函數以及文本框、radio、下拉框的獲取,結合淘寶競拍案例來理解。。。

支付寶 價格 select back html alt 文本框 lec 獲取 淘寶競拍案例: HTML部分代碼: <form action="#" method="post"> <h2>歡迎進入淘寶競拍</h2> &l

C# 定義Attribute獲取與優化

C#自定義Attribute值的獲取是開發中會經常用到的,一般我們的做法也就是用反射進行獲取的,程式碼也不是很複雜。 1、首先有如下自定義的Attribute [AttributeUsage(AttributeTargets.All)] public sealed

Taglib標籤之六Taglib常用的屬性與tld常用標籤簡介與web.xml設定定義標籤的uri

tld標籤的描述檔案   標籤的描述檔案是一個描述整個標籤庫標記資訊和標籤庫中每個標籤處理器以及其屬性的XML文件。可以包含如下的一些元素。   1. tlibversion:標籤庫版本號,是一個點式十進位制數(例如1.0),最多為4組小數點分隔的數字組成。   2. jspversion:標籤庫所需

java定義註解並通過反射獲取註解屬性

直接上程式碼,註釋中有說明: 1、定義自定義註解類(類註解和欄位註解): package com.uno.ray;   import java.lang.annotation.Documented;   import java.lang

定義view獲取android layout_width等屬性

這裡以獲取layout_width和layout_height為例 1,新建attr檔案 <?xml version="1.0" encoding="utf-8"?> <resour

DevExpressGridControl定義匯總列(有選擇性的匯總)

checked order sender end void calc custom expr total 今天碰到有同事遇到這個方面的需求,貼一下吧。 private void gvTop_CustomSummaryCalculate(object sender, Cust

如何獲取數據表增主鍵的

兩個 包含 enc gpo into int acl sql emp 一、MySql數據庫   當向數據庫中插入一條數據的時候,默認是拿不到自增主鍵的值的, 需要設置如下兩個屬性才可以拿到主鍵值!   設置userGeneratedKeys屬性值為true:使用自動增長的主

javaweb標籤體的定義標籤

1.完整的示例程式碼: 標籤體的處理器類,JspFragmentTest.java package com.javaweb.tag; import java.io.IOException; import java.io.StringWriter; import javax.servlet.jsp

iOS開發學習-定義控制元件賦問題--在model的set方法給控制元件賦

在自定義控制元件的過程中,剛開始的時候碰到問題是如何給各控制元件動態賦值,最初的想法是把各控制元件屬性放在.h檔案中定義.然後在控制器內獲取資料一一賦值(可行),但是這樣就增加了控制器中的程式碼,比如給定一個場景: collectionViewCell中,有10個控制元件,需要顯示10個數據,這

shell定義函式,返回

shell中的自定義函式 直接看截圖和程式碼吧,一目瞭然! #!/bin/bash #如下語句會報錯,因為在呼叫test1函式之前要先宣告test1函式 #也就是說,函式的呼叫語句要放在函式的宣告的後面(呼叫函式語句的位置要放在函式宣告語句的位置的後面) #test1

獲取實現了某介面的所有類,並返回該類定義的方法的方法名

準備階段:   定義介面和實現介面的類。 interface IMyInterface { void Write(); } /// <summary> /// 實現類1 /// </summary>

visual studio 配置屬性增加定義巨集和巨集

visual studio中配置自己的巨集。 下面是vs中的巨集,SolutionDir這個是工程所在目錄資料夾。如何建立自己的巨集呢 檢視->其他視窗->屬性管理器,跳轉到屬性管理器介面。然後選擇一個工程,右鍵出現下圖所示 點選新增新專案屬性表,給屬性表命名一個

MR定義bean作為key,輸出某組排序最大

目錄 需求:MR中自定義bean作為key,輸出某組排序中最大值。 方案:重寫MR中groupingcomparator方法 1.需求:MR中自定義bean作為key,輸出某組排序中最大值。    場景:求出多個訂單中,金額最大的商品價格。 2.方

django使用定義過濾器和定義標籤

自定義過濾器 首先在app底下新建一個templatetags目錄,裡面新增兩個檔案,目錄結構如下: 然後在settings.py中把templatetags目錄作為app註冊 INSTALLED_APPS = [ 'django.cont