如何将属性(多个属性)传递给 struts 2 中的自定义标签?
How to pass attributes(multiple attributes) to custom tags in struts 2?
我目前正在 struts 升级(从 struts 1.x 迁移到 2.x)
我的项目有一个自定义标签处理程序 class 用于在应用程序中格式化数字
顶级域名文件
<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 class
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 是 属性 & percentage 是格式。
1) 在上面的标签处理程序 class 中,
(org.apache.struts.util.RequestUtils)RequestUtils.lookup&
(org.apache.struts.util.ResponseUtils)ResponseUtils.write 方法
使用的是 struts1 库的一部分。
- struts 2 中使用的相应方法和 classes 是什么?
2) 在JSP中,自定义标签中传入了3个values/attributes(accountBean, floatingRate, percentage)。
如何在 struts 2 中将属性传递给自定义标签?
如何将 bean、属性 和格式传递给 struts 2 中的自定义标签?
请举例说明
在 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>
我目前正在 struts 升级(从 struts 1.x 迁移到 2.x)
我的项目有一个自定义标签处理程序 class 用于在应用程序中格式化数字
顶级域名文件
<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 class
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 是 属性 & percentage 是格式。
1) 在上面的标签处理程序 class 中, (org.apache.struts.util.RequestUtils)RequestUtils.lookup& (org.apache.struts.util.ResponseUtils)ResponseUtils.write 方法 使用的是 struts1 库的一部分。
- struts 2 中使用的相应方法和 classes 是什么?
2) 在JSP中,自定义标签中传入了3个values/attributes(accountBean, floatingRate, percentage)。
如何在 struts 2 中将属性传递给自定义标签?
如何将 bean、属性 和格式传递给 struts 2 中的自定义标签? 请举例说明
在 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>