如何将属性(多个属性)传递给struts 2中的自定义标记?

时间:2015-12-30 09:23:17

标签: java jsp struts2 custom-tags

我目前正致力于struts升级(从struts 1.x迁移到2.x)

我的项目有一个自定义标记处理程序类,用于格式化应用程序中的数字

TLD文件

<taglib>
    <tlibversion>1.0</tlibversion>
    <jspversion>1.1</jspversion>
    <shortname>f</shortname>
    <uri>http://jakarta.apache.org/struts/tags-html</uri>   
   <tag>
        <name>formatNumber</name>
        <tagclass>com.taghandler.FormatNumberTag</tagclass>
        <bodycontent>empty</bodycontent>
        <attribute>
            <name>name</name>
            <required>true</required>
        <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>property</name>
            <required>false</required>
        <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>scope</name>
            <required>false</required>
        <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>format</name>
            <required>false</required>
        <rtexprvalue>true</rtexprvalue>
        </attribute>       
    </tag>
   </taglib>

FormatNumberTag类

public class FormatNumberTag extends TagSupport
   {

    protected String name = null;

    protected String property = null;

    protected String scope = null;

    protected String format = null;

    //getters and setters of above member variables

    public int doStartTag() throws JspException
    {
        // Look up the requested bean (if necessary)
        Object bean = null;

        if (RequestUtils.lookup(pageContext, name, scope) == null)
        {
            return (SKIP_BODY); // Nothing to output
        }

        // Look up the requested property value
        Object value = RequestUtils.lookup(pageContext, name, property, scope);
        if (value == null)
        {
            return (SKIP_BODY); // Nothing to output
        }

        String output = null;

        if (format.equalsIgnoreCase(MyConstants.PRICE_FORMAT))
        {
            output = CustomConverter.priceFormat(value); //custom class which formats number
        }
        else if (format.equalsIgnoreCase(MyConstants.PERCENTAGE_FORMAT))
        {
            output = CustomConverter.positionFormat(value); //custom class which formats number
        }


        ResponseUtils.write(pageContext, output);

        // Continue processing this page
        return (SKIP_BODY);

    }
  }

JSP

<f:formatNumber name="AccountBean" property="floatingRate" format="percentage" />

这里,AccountBean是bean,floatingRate是属性&amp;百分比是格式。

1)在上面的标签处理程序类中,     ( org.apache.struts.util.RequestUtils )RequestUtils.lookup&amp;     ( org.apache.struts.util.ResponseUtils )ResponseUtils.write方法     使用的是struts1库的一部分。

  • 有哪些相应的方法&amp; struts 2中使用的类?

2)在JSP中,3个值/属性(accountBean,floatingRate,percentage)在自定义标记中传递。

  • 如何将属性传递给struts 2中的自定义标记?

  • 如何传递bean,property&amp;格式到struts 2中的自定义标记?         请提供一个示例

1 个答案:

答案 0 :(得分:0)

在Struts2应用程序中,您可以轻松地将国际化支持与s:text标记结合使用,以呈现格式化文本。

将以下消息添加到与操作关联的国际化属性文件中,或者通过struts.custom.i18n.resources定义全局消息文件:

format.price={0,number,#,###,##0.00}
format.price.with.currency={0,number,#,###,##0.00} {1}
format.percentage={0,number,#,##0.00}%

然后,为了呈现它们,您的JSP代码可能类似于以下内容:

<!-- Render listItemPrice using the format.price layout -->
<s:text name="format.price"><s:param value="accountBean.listItemPrice"/>  

<!-- Render listItemPrice with currency code -->
<s:text name="format.price">
  <s:param value="accountBean.listItemPrice"/>
  <s:param value="accountBean.currencyCode"/>
</s:text>

<!-- Render percentage -->
<s:text name="format.percentage">
  <s:param value="accountBean.floatingRate"/>
</s:text>

<强>更新

如果您需要自定义格式,您还可以使用s:component标记。

<s:component template="/components/numeric-format.ftl">
  <s:param name="type" value="%{'price'}" />
  <s:param name="value" value="%{accountBean.floatingRate}"/>
</s:component>

然后,您可以定义/components/numeric-format.ftl freemarker模板并添加您需要的任何特定逻辑

<span class="<#if parameters.value < 0>negative</#if><#else>positive</#else>">
  <@s.if test="${parameters.type?default('')} eq 'price'">
    <@s.text name="format.price">
      <@s.param value="${parameters.value}"/>
    </@s.text/>
  </@s.if>
  <#-- add other if blocks for various types and formats -->
</span>