现有的textfield不太满足要求,自己试着写了一个,分享给大家。1、写一个UIBean。继承TextField
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts2.components.TextField;
import org.apache.struts2.views.annotations.StrutsTag;
import org.apache.struts2.views.annotations.StrutsTagAttribute;import com.opensymphony.xwork2.util.ValueStack;
//这个注解要写对哦。
@StrutsTag(name = "gageTextField", tldTagClass = "com.gage.framework.web.components.GageTextField", description = "gageTextField")
public class GageTextField extends TextField {
//新加入的属性
protected String lockMode; public GageTextField(ValueStack stack, HttpServletRequest request,
HttpServletResponse response) {
super(stack, request, response);
}
//这块是ftl模板文件名。
@Override
protected String getDefaultTemplate() {
return "gagetext";
}
//注意注解
@StrutsTagAttribute(description = "lockMode", type = "String")
public void setLockMode(String lockMode) {
this.lockMode = lockMode;
}
//把参数加进去
@Override
protected void evaluateExtraParams() {
super.evaluateExtraParams(); if (null != lockMode) {
addParameter("lockMode", findString(lockMode));
}
}}2、写tag。继承TextFieldTagimport javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ui.TextFieldTag;import com.gage.framework.web.components.GageTextField;
import com.opensymphony.xwork2.util.ValueStack;public class GageTextFieldTag extends TextFieldTag { private static final long serialVersionUID = -4506587928277134021L;
protected String lockMode; @Override
public Component getBean(ValueStack stack, HttpServletRequest request,
HttpServletResponse response) {
//这里要注意哦,要返回刚才的UI
return new GageTextField(stack, request, response);
} @Override
protected void populateParams() {
super.populateParams();
//刚才UI的类型
GageTextField gageTextField = (GageTextField) component;
gageTextField.setLockMode(lockMode);
} public void setLockMode(String lockMode) {
this.lockMode = lockMode;
}}3、写tld。在web-inf下面建立tlds文件夹下面建tld文件
<?xml version="1.0" encoding="UTF-8"?>
<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>gtaglib</description>
    <tlib-version>2.0</tlib-version>
    <short-name>gagetag</short-name>
    <uri>/gagetag</uri>

    <tag>
        <name>gageTextField</name>
        <tag-class>com.gage.framework.web.views.jsp.ui.GageTextFieldTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
            <name>lockMode</name>
            <required>true</required>
        </attribute>

.....其他的都是textfield的属性,就不写了。
    </tag>
</taglib>4、然后是ftl文件。WebRoot下面建立template\simple文件夹。下面写第一步UIBean里面定义的ftl文件。
<input type="text"<#rt/>
 name="${parameters.name?default("")?html}"<#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="${parameters.nameValue?html}"<#rt/>
</#if>
<#if parameters.lockMode="delete">
 disabled="disable"<#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>
<#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" />
/>5、最后jsp就可以使用啦
<%@ taglib uri="/struts-tags" prefix="s"%>
<%@ taglib uri="/gagetag" prefix="gage"%><gage:gageTextField name="e.mainId" theme="simple"  lockMode="%{screenMode}"/>希望对大家有用 呵呵。