gpt4 book ai didi

JSP:做一个可重用的代码(标签、宏)并在同一页面上使用

转载 作者:行者123 更新时间:2023-12-05 03:15:06 24 4
gpt4 key购买 nike

有没有办法在一个 JSP 页面上制作某种参数化的宏,并在同一页面上重复使用它几次。可以使用 JSP 标签,但我必须为每个标签创建一个文件。

最佳答案

多年来我一直想要这个功能,在再次谷歌搜索后,我自己写了一个。我认为标记/jsp 文件和自定义标记类很棒,但对于像您描述的那样简单的一次性操作来说往往有点矫枉过正。

这就是我的新“宏”标签现在的工作方式(此处用于可排序表格标题的简单 html 呈现):

<%@ taglib prefix="tt" uri="/WEB-INF/tld/tags.tld" %>

<!-- define a macro to render a sortable header -->
<tt:macro id="sortable">
<th class="sortable">${headerName}
<span class="asc" >&uarr;</span>
<span class="desc">&darr;</span>
</th>
</tt:macro>

<table><thead><tr>
<!-- use the macro for named headers -->
<tt:macro id="sortable" headerName="Name (this is sortable)" />
<tt:macro id="sortable" headerName="Age (this is sortable)" />
<th>Sex (not sortable)</th>
<!-- etc, etc -->

在/WEB-INF/tld/tags.tld 中,我添加了:

<tag>
<name>macro</name>
<tag-class>com.acme.web.taglib.MacroTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<description>ID of macro to call or define</description>
<name>id</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<dynamic-attributes>true</dynamic-attributes>
</tag>

最后是 Java 标记类:

public class MacroTag
extends SimpleTagSupport implements DynamicAttributes
{
public static final String PREFIX = "MacroTag_";
private boolean bodyless = true;
private String id;
private Map<String, Object> attributes = new HashMap<String, Object>();

@Override public void setJspBody(JspFragment jspFragment) {
super.setJspBody(jspFragment);
getJspContext().setAttribute(PREFIX + id, jspFragment, PageContext.REQUEST_SCOPE);
bodyless = false;
}

@Override public void doTag() throws JspException, IOException {
if (bodyless) {
JspFragment jspFragment = (JspFragment) getJspContext().getAttribute(PREFIX + id, PageContext.REQUEST_SCOPE);
JspContext ctx = jspFragment.getJspContext();
for (String key : attributes.keySet())
ctx.setAttribute(key, attributes.get(key));
jspFragment.invoke(getJspContext().getOut());
for (String key : attributes.keySet()) {
ctx.removeAttribute(key);
}
}
}

public void setId(String id) {
this.id = id;
}
@Override public void setDynamicAttribute(String uri, String key, Object val) throws JspException {
attributes.put(key, val);
}
}

实现非常基础。如果标签有一个主体,我们假设我们正在定义一个宏,并且我们存储那个 JspFragment。否则,我们假设我们正在调用一个宏,所以我们查找它,并将任何动态属性复制到它的上下文中,以便它被正确地参数化,并将它渲染到调用输出流中。

太疯狂了,这不是内置在 JSP 中的。

关于JSP:做一个可重用的代码(标签、宏)并在同一页面上使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20817230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com