java - 定义您自己的 JSP 标记主体

标签 java jsp jstl custom-tag custom-tags

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

在我的网络应用程序中,我使用一些 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 页面中并使用 <% @include %> 指令,但我想尝试一个标签)?

据我了解,我应该以某种方式设置正文内容(在标签类内,而不是来自 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);
}
}

它可以编译,但没有正确执行任何操作。

最佳答案

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

JSP 标记文件会更容易。从操作上来说,它与您提到的包含内容并没有那么远,但它使得像这样的重构变得非常微不足道。

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

关于java - 定义您自己的 JSP 标记主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7326043/

相关文章:

java - 使用机器人类截取屏幕截图 - 希望减少文件大小

java - 如何在 jSTL 中使用三元运算符编写 if else 条件?

jsp - 如何获取 foreach jSTL 标签中的项目数?

mysql - jsp中如何保持新段落的存在?

XML 文件中的 Java 替换

java - 如何在循环中将数组插入数据库

java - 使用代理连接数据源

java - 在基于表单的身份验证(tomcat 领域)的情况下,如何强制 tomcat 始终将第一个请求重定向到登录页面

jsp - Tomcat:程序未从 webapps 运行

java - 在 Oracle DB 中插入字符串值在 sql Developer 中显示空值