author liuqing
刘庆
标签原理这里就不做详细介绍了
1. 首先我们来读一读struts2 的源代码
public abstract class UIBean extends Component {
private static final Logger LOG = LoggerFactory.getLogger(UIBean.class);
protected HttpServletRequest request;
protected HttpServletResponse response;
public UIBean(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
super(stack);
this.request = request;
this.response = response;
this.templateSuffix = ContextUtil.getTemplateSuffix(stack.getContext());
}
// The templateSuffic to use, overrides the default one if not null.
protected String templateSuffix;
// The template to use, overrides the default one.
protected String template;
// templateDir and theme attributes
//定义freemark.ftl文件夹
protected String templateDir;
//对应根目录
protected String theme;
// shortcut, sets label, name, and value
protected String key;
protected String id;
protected String cssClass;
protected String cssStyle;
protected String cssErrorClass;
protected String cssErrorStyle;
protected String disabled;
protected String label;
protected String labelPosition;
protected String labelSeparator;
protected String requiredposition;
protected String name;
protected String required;
protected String tabindex;
protected String value;
protected String title;
// HTML scripting events attributes
protected String onclick;
protected String ondblclick;
protected String onmousedown;
protected String onmouseup;
protected String onmouseover;
protected String onmousemove;
protected String onmouseout;
protected String onfocus;
protected String onblur;
protected String onkeypress;
protected String onkeydown;
protected String onkeyup;
protected String onselect;
protected String onchange;
// common html attributes
protected String accesskey;
// javascript tooltip attribute
protected String tooltip;
protected String tooltipConfig;
protected String javascriptTooltip;
protected String tooltipDelay;
protected String tooltipCssClass;
protected String tooltipIconPath;
// dynamic attributes
protected Map<String,Object> dynamicAttributes = new HashMap<String,Object>();
protected String defaultTemplateDir;
protected String defaultUITheme;
protected TemplateEngineManager templateEngineManager;
//注入对应的目录文件夹内容
@Inject(StrutsConstants.STRUTS_UI_TEMPLATEDIR)
public void setDefaultTemplateDir(String dir) {
this.defaultTemplateDir = dir;
}
定义基Bean
package org.cxkj.struts2.components;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.components.UIBean;
import org.apache.struts2.views.annotations.StrutsTagAttribute;
import com.opensymphony.xwork2.util.ValueStack;
/**
*
* @author liuqing
* @version 2.0
* 2011-3-8
*
*/
public abstract class HtmlBean extends UIBean {
protected String width;
protected String height;
protected String align;
public HtmlBean(ValueStack stack, HttpServletRequest request,
HttpServletResponse response) {
super(stack, request, response);
}
/* (non-Javadoc)
* @see org.apache.struts2.components.UIBean#evaluateParams()
*/
@Override
public void evaluateParams() {
super.evaluateParams();
if (width != null) {
addParameter("width", findString(width));
}
if (height != null) {
addParameter("height", findString(height));
}
if (align != null) {
addParameter("align", findString(align));
}
}
/**
* @param width the width to set
*/
@StrutsTagAttribute(description="")
public void setWidth(String width) {
this.width = width;
}
/**
* @param height the height to set
*/
@StrutsTagAttribute(description="")
public void setHeight(String height) {
this.height = height;
}
/**
* @param align the align to set
*/
@StrutsTagAttribute(description="")
public void setAlign(String align) {
this.align = align;
}
}
添加时间控件
package org.cxkj.struts2.views.jsp.ui;
import org.apache.struts2.views.jsp.ui.AbstractUITag;
import org.cxkj.struts2.components.HtmlBean;
/**
*
* @author liuqing
* @version 2.0
* 2011-3-8
*
*/
public abstract class HtmlDateboxTag extends AbstractUITag {
protected String width;
protected String height;
protected String align;
/* (non-Javadoc)
* @see org.apache.struts2.views.jsp.ui.AbstractUITag#populateParams()
*/
@Override
protected void populateParams() {
super.populateParams();
HtmlBean html = (HtmlBean)this.component;
html.setWidth(width);
html.setHeight(height);
html.setAlign(align);
html.setDynamicAttributes(dynamicAttributes);
}
/**
* @param width the width to set
*/
public void setWidth(String width) {
this.width = width;
}
/**
* @param height the height to set
*/
public void setHeight(String height) {
this.height = height;
}
/**
* @param align the align to set
*/
public void setAlign(String align) {
this.align = align;
}
}
定义实现标签
package org.cxkj.struts2.views.jsp.ui;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.components.Component;
import org.cxkj.struts2.components.DateboxBean;
import com.opensymphony.xwork2.util.ValueStack;
/**
*
* @author liuqing
* @version 2.0
* 2011-3-8
*
*/
public class DateboxTag extends HtmlDateboxTag {
@Override
public Component getBean(ValueStack valueStack, HttpServletRequest request,
HttpServletResponse response) {
return new DateboxBean(valueStack,request,response);
}
}
定义freemarker 模板文件
<#--
/*
* $Id: text.ftl 720258 2008-11-24 19:05:16Z musachy $
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
-->
<div style="margin:2px;text-align:<#rt/>
<#if parameters.align??>
${parameters.align?html};"> <#rt/>
</#if>
<input type="text"<#rt/>
name="${parameters.name?default("")?html}"<#rt/>
class="easyui-datebox" <#rt/>
<#if parameters.get("size")??>
size="${parameters.get("size")?html}"<#rt/>
</#if>
<#if parameters.maxlength??>
maxlength="${parameters.maxlength?html}"<#rt/>
</#if>
<#if parameters.nameValue??>
value="<@s.property value="parameters.nameValue"/>"<#rt/>
</#if>
<#if parameters.disabled?default(false)>
disabled="disabled"<#rt/>
</#if>
<#if parameters.readonly?default(false)>
readonly="readonly"<#rt/>
</#if>
<#if parameters.tabindex??>
tabindex="${parameters.tabindex?html}"<#rt/>
</#if>
<#if parameters.id??>
id="${parameters.id?html}"<#rt/>
</#if><#rt/>
style="<#rt/>
<#if parameters.width??>
width:${parameters.width?html}px;<#rt/>
<#else>
width:160px;<#rt/>
</#if><#rt/>
<#if parameters.height??>
height:${parameters.height?html}px;<#rt/>
<#else>
height:26px;<#rt/>
</#if>" <#rt/>
<#include "/${parameters.templateDir}/simple/css.ftl" />
<#if parameters.title??>
title="${parameters.title?html}"<#rt/>
</#if>
<#include "/${parameters.templateDir}/simple/scripting-events.ftl" />
<#include "/${parameters.templateDir}/simple/common-attributes.ftl" />
<#include "/${parameters.templateDir}/simple/dynamic-attributes.ftl" />
/>
</div>
添加tld 文件到WEB-INF目录下
OK<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <description><![CDATA["To make it easier to access dynamic data; the Apache Struts framework includes a library of custom tags. The tags interact with the framework's validation and internationalization features; to ensure that input is correct and output is localized. The Struts Tags can be used with JSP FreeMarker or Velocity."]]></description> <display-name>"Struts Tags"</display-name> <tlib-version>2.2.3</tlib-version> <short-name>sx</short-name> <uri>/struts-tags-cxkj</uri> <tag> <description><![CDATA[Execute an action from within a view]]></description> <name>datebox</name> <tag-class>org.cxkj.struts2.views.jsp.ui.DateboxTag</tag-class> <body-content>JSP</body-content> <attribute> <description><![CDATA[Whether the result of this action (probably a view) should be executed/rendered]]></description> <name>executeResult</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Whether the writer should be flush upon end of action component tag, default to true]]></description> <name>flush</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Deprecated. Use 'var' instead]]></description> <name>width</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Deprecated. Use 'var' instead]]></description> <name>height</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Deprecated. Use 'var' instead]]></description> <name>id</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Whether the request parameters are to be included when the action is invoked]]></description> <name>ignoreContextParams</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Name of the action to be executed (without the extension suffix eg. .action)]]></description> <name>name</name> <required>true</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Namespace for action to call]]></description> <name>namespace</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Namespace for action to call]]></description> <name>value</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Namespace for action to call]]></description> <name>align</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Whether an exception should be rethrown, if the target action throws an exception]]></description> <name>rethrowException</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <description><![CDATA[Name used to reference the value pushed into the Value Stack]]></description> <name>var</name> <required>false</required> <rtexprvalue>false</rtexprvalue> </attribute> <dynamic-attributes>false</dynamic-attributes> </tag> </taglib>
<%@taglib prefix="sx" uri="/struts-tags-cxkj" %>
<sx:datebox name="umlj" width="400" height="80" align="right" value="%{'1008-10-23'}">
</sx:datebox>