【问题标题】:Defining your own JSP tag body定义自己的 JSP 标记体
【发布时间】:2011-11-11 16:00:27
【问题描述】:

最近我决定了解一些关于编写自定义标签的知识。还有一个问题。

在我的网络应用程序中,我使用了一些 JSTL 标记,并且在每个 JSP 页面中,我都有一段相同的代码:

<c:if test="${sessionScope.locale == 'locale_ru_RU' or empty sessionScope.locale}" >
    <fmt:setBundle basename="locale_ru_RU" />
</c:if>
<c:if test="${sessionScope.locale == 'locale_en_US'}">
    <fmt:setBundle basename="locale_en_US" />
</c:if>

如您所见,此构造设置了正确的资源包。

所以我想知道是否有可能包装这段代码并使用单个标签代替它(我知道还有另一种方法 - 只需将此代码放在单独的 JSP 页面中并使用 指令,但我想尝试一个标签)?

据我了解,我应该以某种方式设置正文内容(在标记类中,而不是来自 JSP)并制作容器来执行它,但我找不到任何关于它的示例。

我现在得到了什么:

域名:

<?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">
<tlib-version>1.0</tlib-version>
<tag>
    <name>setLocale</name>
    <tag-class>com.test.tags.LocaleBundleTag</tag-class>
    <body-content>empty</body-content>
</tag>
</taglib>

还有我的标签:

public class LocaleBundleTag extends BodyTagSupport {

@Override
public void setBodyContent(BodyContent b) {

    try {
        b.clear();
        b.append("<c:if test=\"${sessionScope.locale == 'locale_ru_RU' or empty sessionScope.locale}\" >");
        b.append("<fmt:setBundle basename=\"locale_ru_RU\" />");
        b.append("</c:if>");
        b.append("<c:if test=\"${sessionScope.locale == 'locale_en_US'}\">");
        b.append("<fmt:setBundle basename=\"locale_en_US\" />");
        b.append("</c:if>");
    } catch (IOException e) {
    }

    super.setBodyContent(b);
}
}

它编译,但没有正确执行。

【问题讨论】:

    标签: java jsp jstl custom-tag custom-tags


    【解决方案1】:

    不,这是行不通的,因为不期望正文内容也将由 JSP 编译器处理。相反,您需要在标签中自己实现 fmt:setBundle。

    JSP 标记文件会更容易。从操作上讲,它与您提到的包含相差不远,但它使这样的重构非常简单。

    我在这里有一个扩展示例:JSP tricks to make templating easier?

    【讨论】:

    • 非常感谢。我在考虑使用 JSP 标记文件,你说服了我)
    【解决方案2】:

    您不能在这样的自定义标记(即在 Java 类中创建的标记)中使用其他 JSP 标记。但是,您可以创建一个“标签文件”,它允许您定义自定义标签,就像定义 JSP 页面一样。这是一个帮助您入门的链接:http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPTags5.html

    但是,您尝试做的事情看起来像是其他东西应该能够为您做的事情。你在你的应用程序中使用 Spring 吗?如果是这样,请考虑查看 Spring 的 MessageSource 和 LocaleResolver。

    【讨论】:

    • 谢谢。我不使用 Spring 或其他任何框架,它有点像从头开始的应用程序)
    【解决方案3】:

    解决此问题的最佳方法是使用servlet filter。过滤器可以拦截每个请求并在请求范围内设置属性。 fmt:bundle 标签的 java 等价物类似于:

    Config.set(request, Config.FMT_LOCALE, "ru_RU")
    

    【讨论】:

      猜你喜欢
      • 2011-07-16
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多