Struts2结合freemarker自定义标签

阅读本文之前建议先浏览《Struts2自定义简单标签》,了解Struts2标签的执行流程!

闲话不谈,直接进正题,以一个简单的<a>标签为例

 

1、在项目src下新建一个com.tag包,com.tag包下建立一个ATag.java类

========================--  start --============================

package com.tag;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ui.AbstractUITag;

import com.dwplay.common.tag.uibean.menuTemplate;
import com.opensymphony.xwork2.util.ValueStack;


/**
 * Struts2自定义标签
 * @author RSun
 * @Date 2012-10-27下午05:52:40
 */
public class ATag extends AbstractUITag {

 private static final long serialVersionUID = 3056187271821937613L;
 
 /** 链接内容 **/
 private String content;
 /** 链接地址 */
 private String murl;
  /** 链接的target **/
  private String mtarget;
 
 @Override
 public Component getBean(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
          return new Auibean(stack, request, response);
 }
 
 /** 初始化参数 **/
 @Override
 protected void populateParams() {
          super.populateParams();
          Auibean  ab = (Auibean) component;
          ab.setContent(content);
          ab.setMurl(murl);
          ab.setMtarget(mtarget);
 }

 

// 以下是set方法

public void setContent(String content) {
          this.content = content; 
 }

 public void setMurl(String murl) {
         this.murl = murl;
 }

 public void setMtarget(String mtarget) {
         this.mtarget = mtarget;
 }

}

========================--  end  --=============================

 

2、在com.tag包下建立一个uibean包,com.tag.uibean包下建立Auibean.java

========================--  start --=============================

package com.tag.uibean;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.components.UIBean;
import org.apache.struts2.views.annotations.StrutsTag;
import org.apache.struts2.views.annotations.StrutsTagAttribute;

import com.opensymphony.xwork2.util.ValueStack;

 

/**
 * Struts2自定义标签的UIBean
 * @author RSun
 * @Date 2012-3-5
 */
//strutsTag注解指明了该UIBean的名字和Tag类的类名和tld文件中的<body-content>yin</body-content>。
@StrutsTag(name="alink", tldBodyContent="yin", tldTagClass="com.tag.ATag", description="这是一个链接的tag")  
public class Auibean extends UIBean {
 
    /** freemarker模板文件名字 **/
    public static final String TEMPLATE = "alink";
    /** 链接内容 **/
    private String content;
    /** 链接地址 */
    private String murl;
    /** 链接的target **/
    private String mtarget;
   
    public Auibean(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {  
        super(stack, request, response);  
    }
  
    /**
  * 返回UIBean模板的名字 <br>
  * Struts2会自动在template.simple目录下面
  * 找到 xxx.ftl 的模板文件
  */
    @Override 
    protected String getDefaultTemplate() {
        return TEMPLATE;  
    }
   
 /**
  * UIBean初始化后会调用此方法来设置参数 <br>
  * addParameter方法,会在freemarker里的parameters里加入一个key value <br>
  * 这里要注意findString,还有相关的findxxxx方法,它们是已经封装好了
  * 的解释ognl语法的工具,具体是怎么样的,大家可以查看一下UIBean的api doc。
  */
 @Override 
    protected void evaluateExtraParams() {  
        super.evaluateExtraParams();  
        if (null != content) {  
            addParameter("content", findString(content));
        }
       
        if(null != murl){
         addParameter("murl", findString(murl));
        }
       
        if(null != mtarget){
         addParameter("mtarget", mtarget);
        }
       
    }

 

 /**
  * 设置UIBean的属性 <br>
  * 注解type="String"说明该属性是字符串(也可以是其它)
  * @param content
  */
    @StrutsTagAttribute(description="set content", type="String", defaultValue="true")  
    public void setContent(String content) {
  this.content = content;
 }

 

 @StrutsTagAttribute(description="set murl", type="String", defaultValue="true")  
    public void setMurl(String murl) {
  this.murl = murl;
 }


 
 @StrutsTagAttribute(description="set mtarget", type="String", defaultValue="true")
 public void setMtarget(String mtarget) {
  this.mtarget = mtarget;
 }

 

 

========================--  end  --=============================

 

3、同样src下建立template.simple包,也就是template包下面建立simple包,然后新建文件alink.ftl

========================--  start--=============================

<a href="${parameters.murl}" target="${parameters.mtarget}">${parameters.content}</a>

以上就是ftl文件的内容,注意不能有空格

========================--  end  --=============================

 

4、在WEB-INF下新建tld文件RSun-tags.tld,内部实现如下:

========================--  start  --===========================

<?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"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">

<description>struts2_tags_test</description>

<tlib-version>2.0</tlib-version>

<short-name>RSun</short-name>

<uri>/RSun-tags</uri>  <!-- 页面引用tld名称 -->


<!--  关联tag类相关配置 -->

 <tag>
  <description><![CDATA[struts2结合freemarker自定义标签]]></description>
        <name>alink</name>
        <tag-class>com.tag.ATag</tag-class>  
        <body-content>JSP</body-content>  
        <attribute>  
            <name>content</name>  
            <required>false</required>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
         <attribute>  
            <name>murl</name>  
            <required>false</required>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
         <attribute>  
            <name>mtarget</name>  
            <required>false</required>
            <rtexprvalue>false</rtexprvalue>
        </attribute>
        <dynamic-attributes>false</dynamic-attributes>
 </tag>


</taglib>

==========================--  end--============================

 

4、相关配置已实现,下面看jsp页面引用示例

同样需要引入:<%@ taglib uri="/RSun-tags" prefix="st" %>

然后页面调用:<st:alink content="点击看看效果" murl="http://write.blog.csdn.net/postedit/8176633" mtarget="_blank" />

结果示例:页面显示 <a href="http://write.blog.csdn.net/postedit/8176633" target="_blank">点击看看效果</a>

 

下面介绍执行流程:

整个标签包含4个部分,tag类、tag的uibean、ftl文件和tld定义文件

页面使用标签时,会根据tld文件,找到<name>alink</name>

然后<name>alink</name>声明找到对应的类ATag.java

在ATag初始化参数方法执行时,会给Auibean赋值
Auibean执行过程中会调用关联的ftl文件解析显示

 

提示:对于WEB下面中比较常用的显示模块,可以使用xml传数据到自定义标签解析后统一显示,这样可以简化前端的繁杂操作,同时也可以加快访问速度。可以再ftl文件里面控制显示样式 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值