`

Struts2 自定义标签与struts2 无缝整合支技ognl 等

 
阅读更多

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>
 

 

 

 

 

 

分享到:
评论
3 楼 mianhuaman 2014-01-20  
可以放在webapp下不过那样就回到了原始标签的状态了用freemark 就没有真真的组件化了
2 楼 mianhuaman 2014-01-20  
所有的freemark.ftl文件是放在src目录下的
你想想struts2 在webapp下有没有ftl文件。
以jar的形式发布不更好
1 楼 glyphvectory 2013-11-03  
您好,看见你写的很乐观,不过我遇到一个问题,按你写的。
freemark的文件我放在那里了?我去设置了:默认目录,始终都不行都是:
/template/simple/cccc.ftl not found

我建了这个文件夹,放在。webapp下
能不能指教指教,谢谢

相关推荐

Global site tag (gtag.js) - Google Analytics