`

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下
能不能指教指教,谢谢

相关推荐

    struts2-2.0.14

    Struts2与Spring的整合使得开发者可以利用Spring的依赖注入(DI)和面向切面编程(AOP)能力,方便地管理Action类和其他业务组件的生命周期。通过这个插件,Struts2可以识别并直接注入由Spring管理的bean,无需手动...

    Struts2 技术内幕——深入解析Struts2架构设计与实现原理.zip

    《Struts2技术内幕——深入解析Struts2架构设计与实现原理》这本书深入讲解了这些内容,包括但不限于Action的设计模式、Interceptor的实现原理、ValueStack的工作流程、以及Struts2与其他框架的整合策略,对于想要...

    struts2标准jar包集

    - `struts2-spring-plugin.jar`:Struts2与Spring整合的插件 - `xwork-core.jar`:Struts2基于的XWork框架的核心库 - `ognl.jar`:对象图导航语言库,用于Action属性的访问 - `javassist.jar`:动态类生成和修改库,...

    Struts2入门与配置

    本文将深入讲解Struts2的入门与配置,以及其核心概念和原理,同时涵盖Struts2与其他技术如JSF和Ajax的整合。 **Struts2入门及基本配置** Struts2入门首先需要理解其基本架构。Struts2的核心是Action类,它是处理...

    struts2框架基础jar包

    7. **Spring整合**:如果项目中使用了Spring框架,`struts2-spring-plugin.jar`可以帮助无缝集成,实现依赖注入和事务管理。 8. **Action的生命周期**:一个典型的Struts2 Action实例会经历创建、初始化、执行、...

    struts2的 完整教程

    5. **整合其他技术**:Struts2可以与其他框架如Hibernate、Spring等无缝集成,提高开发效率。 6. **最佳实践与性能优化**:如何编写高效、健壮的Struts2应用,避免常见陷阱,提升应用性能。 通过这个完整的Struts2...

    Struts2_Spring_Example.zip_spring struts2_struts2-examp

    Struts2 和 Spring 的整合是企业级 Java 应用开发中的常见实践,这两个框架的结合可以充分利用它们的优势,实现更好的控制层(MVC)管理和依赖注入。本示例代码提供了如何将 Struts2 和 Spring 结合使用的具体实现,...

    Struts2源码

    Struts2是一个强大的Java web应用程序框架,用于构建和...同时,也要关注Struts2与其他框架(如Spring、Hibernate)的整合,以及如何利用Struts2实现RESTful服务。通过深入学习,你将成为一个熟练掌握Struts2的开发者。

    Struts2入门教程_Struts2入门教程_skindzj_

    Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、结构清晰的MVC(模型-...同时,随着实践的深入,你还可以探索Struts2的更多高级特性,如动态方法调用、OGNL表达式语言等,进一步提升你的开发技能。

    Struts2教程.rar

    Struts2与Spring的整合** Struts2可以无缝集成Spring框架,实现依赖注入(DI),便于进行单元测试和管理Action的生命周期。 **11. 自定义标签库** Struts2提供了丰富的自定义标签库,如s:form、s:textfield等,...

    Struts2 Design and Programming: A Tutorial.pdf

    7. **Struts2与Spring的整合** - Struts2可以与Spring框架无缝集成,实现依赖注入,便于管理Action的生命周期和业务对象。 8. **异常处理** - Struts2提供了一套完整的异常处理机制,允许开发者自定义错误页面和...

    struts2学习文档以及一些相关项目的代码

    "struts2-spring-plugin-2.0.9.jar" 文件表明了Struts2与Spring框架的整合。Struts2 Spring Plugin允许开发者在Struts2应用中无缝集成Spring,便于进行依赖注入、事务管理和其他Spring服务的利用,这对于大型企业级...

    struts2入门经典教程

    对于有Struts1基础的开发者,需要注意Struts2与Struts1的主要差异,如更强大的拦截器机制、更简洁的配置方式以及Ognl的使用。 “Struts2入门经典教程”PDF文档将详细介绍这些概念和实践操作,涵盖了从环境搭建、第...

    struts2开发包

    11. **Struts2与Spring整合**:可以将Struts2与Spring框架无缝集成,实现依赖注入(DI)和控制反转(IoC),提升应用程序的可维护性和可测试性。 12. **安全方面**:Struts2框架虽然曾因为某些漏洞受到关注,但经过...

    struts2权威指南

    Struts2的OGNL(Object-Graph Navigation Language)表达式语言也是重点,包括变量的引用、运算符、集合操作等。同时,还会讨论Struts2的类型转换和数据验证机制,帮助开发者确保输入数据的准确性和安全性。 视图...

    struts2学习大全

    8. ** strut2与Spring的整合**:Struts2可以与Spring框架无缝集成,利用Spring管理Action的依赖注入,实现业务层和持久层的解耦。 9. **Struts2的测试**:Struts2提供了JUnit测试支持,可以对Action进行单元测试,...

    浪曦Struts2应用开发系列ppt

    Struts2标签库简化了视图层的开发,提供了诸如displayTag、s Tag等便捷的标签。最后,Struts2可无缝集成Hibernate和Spring,实现持久化和依赖注入,构建完整的MVC架构。 总之,浪曦Struts2应用开发系列PPT是一个...

    struts2.0标签

    例如,在`第十一章 集成Spring framework.html`中,可能会介绍如何配置Struts2与Spring的整合,通过Spring管理Action类的生命周期,实现依赖注入,提高代码的解耦度。 综上所述,Struts2.0标签库是开发Java Web应用...

    Struts2 in action

    11. **Struts2与其他技术的集成**:Struts2可以与Spring、Hibernate、iBatis等其他流行框架无缝集成,构建更强大的企业级应用。 通过阅读《Struts2 in Action》中文版,读者不仅可以掌握Struts2的基本概念和使用...

    Struts2教程(很基础很详细)

    10. **插件和集成**:Struts2可以与Spring、Hibernate等其他框架无缝集成,提高开发效率。教程可能包括如何配置和使用这些插件。 11. **实战案例**:教程可能会包含一个简单的示例项目,比如用户登录、注册系统,让...

Global site tag (gtag.js) - Google Analytics