问题 子目录中的JSP标记文件,使用单个taglib前缀。那可能吗?


我目前用我的.tag文件声明:

<%@taglib prefix="t" tagdir="/WEB-INF/tags" %>

标记文件路径的示例:

/WEB-INF/tags/test.tag

我这样使用它们:

<t:test oneAttributeKey="oneAttributeValue">
   some content...
</t:test>

我的问题 :我不想把我的所有标签文件都放进去 一个单一的 文件夹,“/ WEB-INF / tags”。

我宁愿把它们放在不同的子目录中:

/ WEB-INF /标签/用户/

/ WEB-INF /标签/ widgetsA /

/ WEB-INF /标签/ widgetsB /

(......)

这可能吗, 不为每个人和每个人创建不同的taglib前缀

我想避免的例子:

<%@taglib prefix="t_users" tagdir="/WEB-INF/tags/users" %>
<%@taglib prefix="t_widgetsA" tagdir="/WEB-INF/tags/widgetsA" %>
<%@taglib prefix="t_widgetsB" tagdir="/WEB-INF/tags/widgetsB" %>

我想要的示例,使用单个“t”前缀:

<t:users/onetag oneAttributeKey="oneAttributeValue">
   some content...
</t:users/onetag>

是否存在类似的解决方案?

UPDATE :BalusC表明,通过在单个.tld中定义所有标记文件,可以只使用一个前缀。我想我的问题还不够明确:我想知道是否可以在多个子目录中使用标记文件,而无需指定每个子目录的路径 随地 除了在使用它们的元素中(例如:“<t:users / onetag”)!

我不喜欢JSP标签的是它们的行为与普通的JSP文件非常不同,即使它们实际上共享非常相似的内容。事实上,我甚至决定将所有的jsp文件放在/ WEB-INF / tags /文件夹中,因此它们与标记文件并排(我必须选择/ WEB-INF / tags /,因为这文件夹对于标记文件是必需的,由于某种原因)!我不明白为什么我的一些包含HTML的文件会进入/ WEB-INF / jsp /和其他一些/ WEB-INF / tags / !!

我希望能够  将jsp和标记文件放入目录中,具体取决于它们的相关内容!示例:

 /WEB-INF/tags/users/userProfileLayout.tag
 /WEB-INF/tags/users/employeeProfile.jsp
 /WEB-INF/tags/users/employerProfile.jsp

 /WEB-INF/tags/widgetsA/widgetALayout.tag
 /WEB-INF/tags/widgetsA/oldWidgetA.jsp
 /WEB-INF/tags/widgetsA/newWidgetA.jsp

但这迫使我在多个@tablib或.tld中声明每个子目录的路径,我觉得这有点不方便。我会忍受它,但我认为它可以改进。


1619
2018-05-14 23:43


起源

我很确定这样的事情是不可能的,而且它似乎与taglibs的预期相违背。您希望能够快速找到您正在使用的标记的标记文件,如果它可能位于多个目录中的一个,则不太理想。 - roguenet
您不明白为什么标记文件会放在一个目录中而JSP文件放在另一个目录中?您拥有包,子目录等的相同原因 - 关注点分离。同样的原因,你对不同的标签有不同的前缀 - 使它们更加清晰。将JSP文件放在taglib目录中完全违反了最少的惊喜原则。 - Dave Newton
戴夫牛顿,难道你不同意那些标签文件几乎是jsp文件,但有一些差异吗?两者都有HTML。两者都有像<c:if>这样的视图逻辑。两者都可以使用父标记文件。我的视图逻辑在两者中,为什么它们会处于不同的层次结构中呢? - electrotype


答案:


将它们定义为 <tag-file> 在一个单一的 .tld 你输入的文件 /WEB-INF 夹。

例如。 /WEB-INF/my-tags.tld

<?xml version="1.0" encoding="UTF-8" ?>
<taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1"
>    
    <display-name>My custom tags</display-name>    
    <tlib-version>1.0</tlib-version>
    <short-name>my</short-name>
    <uri>http://example.com/tags</uri>

    <tag-file>
        <name>foo</name>
        <path>/WEB-INF/tags/users/foo.tag</path>
    </tag-file>

    <tag-file>
        <name>bar</name>
        <path>/WEB-INF/tags/widgetsA/bar.tag</path>
    </tag-file>

    <tag-file>
        <name>baz</name>
        <path>/WEB-INF/tags/widgetsB/baz.tag</path>
    </tag-file>
</taglib>

在JSP中使用它如下所示

<%@taglib prefix="my" uri="http://example.com/tags" %>
...
<my:foo />
<my:bar />
<my:baz />

16
2018-05-15 02:38



这回答了我问的问题,但我意识到我的问题并不明确。谢谢你的意见。如果我没有收到编辑问题的答案,我会将您的答案标记为“已接受”! - electrotype


我遵循的模式,即使没有直接解决OP的问题,我发现它使整个情况不那么痛苦,这就是创建一个JSP片段,我定义了所有的taglib:

/WEB-INF/views/taglibs.jspf

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<%@ taglib prefix="layout" tagdir="/WEB-INF/tags/layout" %>
<%@ taglib prefix="t_users" tagdir="/WEB-INF/tags/users" %>
<%@ taglib prefix="t_widgetsA" tagdir="/WEB-INF/tags/widgetsA" %>
<%@ taglib prefix="t_widgetsB" tagdir="/WEB-INF/tags/widgetsB" %>

然后在每个JSP文件的顶部包含此JSP Fragment:

/WEB-INF/views/users/employeeProfile.jsp

<%@ include file="/WEB-INF/views/taglibs.jspf" %>

<layout:main>
    <h1>Employee Profile</h1>
    ...
</layout:main>

0
2018-03-16 15:56





应该管用。指定tag-dir值下的文件夹名称将成为您将使用的标记名称的连字符分隔部分。


-1
2018-05-25 06:49



对我不起作用。 - electrotype