标签: taglib

如何将TLD和Tag Lib文件添加到Maven的jar项目中

我有一个打包为的Maven项目jar.

我还有一个打包为的Maven项目war.这个war项目有一个tld文件和一些xhtml文件(标签libs).战争项目的结构(基本上):

pom.xml
src
    main
       java
           ...
       webapp
           WEB-INF
               my-facelets.taglib.xml
               facelets
                   aTag.xhtml
                   anotherTag.xhtml
           META-INF
               my-facelets.taglib.tld
Run Code Online (Sandbox Code Playgroud)

然后出现了从war项目中删除那些xml,xhtml和tld文件并将它们打包到jar项目中的要求.所以我的第一次尝试是添加jar项目的POM:

<resources>
  <resource>
    <directory>src/main/tld</directory>
    <targetPath>META-INF</targetPath>
  </resource>

  <resource>
    <directory>src/main/taglib</directory>
    <targetPath>WEB-INF</targetPath>
  </resource>
</resources> 
Run Code Online (Sandbox Code Playgroud)

当然,将文件放入src/main/tld(我想导出的文件META-INF)和src/main/taglib(我想导出的文件WEB-INF)中.罐子是按照我的意愿创建的:

myjar
    com
        my
            classes
    WEB-INF

    META-INF
        my-facelets.taglib.tld
    WEB-INF
        ...
Run Code Online (Sandbox Code Playgroud)

然后我将这个新jar添加到我的第一个war项目中,作为maven依赖.

问题是那些在jar的META-INF,WEB-INF(jar在war里面WEB-INF/lib)内的.tld,.xhtml,.xml文件无法识别.显然他们应该直接进入战争结构,除非执行其他一些配置.这是必须要求的,因为多个war项目将使用jar项目的功能(类和标记库).

dependencies war taglib maven jsf-2

11
推荐指数
2
解决办法
1万
查看次数

eclipse jsp函数fn:escapeXml是未定义的

我正在开始我的第一个谷歌应用引擎jsp项目.我从这里开始关注留言簿的教程:https://developers.google.com/appengine/docs/java/gettingstarted/introduction.我对数据存储步骤(https://developers.google.com/appengine/docs/java/gettingstarted/usingdatastore),并在该网页上的代码都直接粘贴到我的项目.代码编译和工作,但我得到fn:escapeXml调用下的红色波浪形下划线.我看到这些是来自taglib的函数,如下所述:http://www.tutorialspoint.com/jsp/jsp_standard_tag_library.htm.那么,我如何让eclipse知道发生了什么,而不是认为这是一个错误?

eclipse jsp taglib

11
推荐指数
2
解决办法
1万
查看次数

在客户端或服务器端拦截Grails GSP操作

Grails 2.4.5在这里.我正在尝试为我的GSP实现以下UX行为:

  • 如果用户有权点击按钮,那么他们可以这样做; 然而
  • 如果用户没有点击按钮的权限,那么当他们点击按钮时,屏幕顶部会出现横幅消息(闪烁?),玫瑰/粉红色/红色背景表示" 您没有权限"采取这个行动 '

要确定用户是否具有所需权限,我可以从Groovy和GSP/taglib层访问功能.

从Groovy/controller层:

SecurityUtils.hasPermission(String permission)
Ex: SecurityUtils.hasPermission('UPDATE_BUZZ')
Run Code Online (Sandbox Code Playgroud)

从GSP/taglib层:

<sec:hasPermission permission="<permission name>">???</sec:hasPermission>
Ex: <sec:hasPermission permission="UPDATE_BUZZ">???</sec:hasPermission>
Run Code Online (Sandbox Code Playgroud)

因此,给定这两种可用的访问检查机制,并给出以下控制器:

class FizzController {
    BuzzService BuzzService

    def buzz() {
        SomeData dataModel = buzzService.getModel(params)
        render(view: 'buzz', model: [ dataModel: dataModel ])
    }
}
Run Code Online (Sandbox Code Playgroud)

......在哪里buzz.gsp:

<!-- Lots of HTML/GSP here -->
<g:submitButton name="update" value="Update" />
<!-- Lots more HTML/GSP down here -->
Run Code Online (Sandbox Code Playgroud)

鉴于这一切,我的问题是:我应该如何/在哪里:(1)响应' update'按钮的点击处理程序,(2)执行访问检查,以及(3)呈现错误/横幅/ flash消息?代码示例(甚至伪代码)将是最棒的!

grails groovy taglib gsp

11
推荐指数
1
解决办法
467
查看次数

在标记库描述符中使用varargs

是否可以将TLD映射到以下函数:

public static <T> T[] toArray(T... stuff) {
    return stuff;
}
Run Code Online (Sandbox Code Playgroud)

所以我可以这样做:

<c:forEach items="${my:toArray('a', 'b', 'c')}"...
Run Code Online (Sandbox Code Playgroud)

我试过以下<function-signature>

java.lang.Object toArray( java.lang.Object... )
java.lang.Object[] toArray( java.lang.Object[] )
Run Code Online (Sandbox Code Playgroud)

而其他人似乎没什么用.

java jsp el taglib variadic-functions

10
推荐指数
1
解决办法
4032
查看次数

在JSP中将枚举值作为标记属性传递

我有一个自定义JSP标记,它使用的参数是枚举.这种方法是使用需要此枚举的其他类的结果.关键是我不知道如何在EL中分配枚举值:

<mytaglib:mytag enumParam="${now what do I type here?}" />
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现的唯一解决方法是使enumParam成为一个整数并将其转换为所需的值:

<mytaglib:mytag enumParam="3" />
Run Code Online (Sandbox Code Playgroud)

我相信必须有更好的方法来做到这一点.请帮忙.

enums jsp taglib

10
推荐指数
1
解决办法
6490
查看次数

Grails:将taglib中的模板呈现为HTML

我正在尝试从taglib渲染我的模板:

out << g.render(template: "/menu/sidebar")
Run Code Online (Sandbox Code Playgroud)

这就是我的侧边栏模板的样子:

<ul>
    <li>TEST1</li>
    <li>TEST2</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中检查我的页面时,整个模板代码出现在这样的撇号中......

"<ul>
    <li>TEST1</li>
    <li>TEST2</li>
</ul>"
Run Code Online (Sandbox Code Playgroud)

...并打印我的HTML代码就像纯文本一样.知道如何让它将内容识别为正确的HTML代码吗?

编辑: Taglib代码:

class MenuTagLib {
    static defaultEncodeAs = 'html'
    def renderIfExists = { attrs,body->
        GrailsConventionGroovyPageLocator groovyPageLocator
        println attrs.template
        if(groovyPageLocator.findTemplateByPath(attrs.template))
        {
            g.render(template:attrs.template)
        }
        else{   


            out << g.render(template: "/menu/sidebar")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

调用它的方式:

<g:renderIfExists template="/${params.controller}/sidebar" plugin="untitled1" />
Run Code Online (Sandbox Code Playgroud)

grails groovy templates taglib

10
推荐指数
2
解决办法
7780
查看次数

Taglib显示java.time.LocalDate格式

我想java.time.LocalDate在我的JSP中显示格式化.你知道用于此的任何taglib吗?

因为java.util.Date我们正在使用<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>.java.time.LocalDate存在类似的东西吗?

java jsp date taglib java-8

10
推荐指数
2
解决办法
6154
查看次数

在Freemarker中添加Spring库以使用JSP Taglibs以确保安全性

我使用带有freemarker的spring作为模板引擎.Freemarker允许使用Jsp Taglibs,例如,通过添加安全性

    <#assign security=JspTaglibs["http://www.springframework.org/security/tags"] />
Run Code Online (Sandbox Code Playgroud)

到模板,允许我使用的例子

    <@security.authorize ifNotGranted="ROLE_ADMIN">
        whatever
    </@security.authorize>
Run Code Online (Sandbox Code Playgroud)

但是,Spring/Freemarker找不到taglib,除非它们被添加到类路径中,所以我补充说

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
        <version>${spring.version}</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

到我项目中的pom.xml.

但无论如何,无法找到标签!我必须将spring-security-taglibs.jar添加到WEB-INF/lib文件夹中,以便找到标签.

有人知道为什么必须将jar显式添加到lib文件夹中吗?在我看来,tomcat为什么不找到它们?

编辑@ddekany

谢谢.如果未将spring-security-taglibs.jar复制到WEB-INF/lib目录中,则堆栈跟踪如下所示

    No mapping defined for http://www.springframework.org/security/tags 
    The problematic instruction: ---------- ==> assignment: 
            security=JspTaglibs["http://www.springframework.org/security/tags"] 
            [on line 12, column 1 in home.ftl] in user-directive content.main 
            [on line 8, column 9 in home.ftl] in user-directive layout.global 
            [on line 2, column 1 in home.ftl] 
    ---------- Java backtrace for programmers: ----------      
    freemarker.template.TemplateModelException: 
            No mapping defined for http://www.springframework.org/security/tags at         
    freemarker.ext.jsp.TaglibFactory.get(TaglibFactory.java:180) at 
    ...
Run Code Online (Sandbox Code Playgroud)

security spring jsp freemarker taglib

9
推荐指数
2
解决办法
1万
查看次数

在appengine初始化时禁用TLD扫描

此主题类似于:在谷歌应用引擎(Jetty)中禁用taglib扫描

该线程的作者接受了错误的答案.

我们试图通过taglib TLD类路径扫描减少我的实例的appengine启动时间.

我的申请有50mb的罐子.扫描tld需要20%的启动时间:

在此输入图像描述

(图片来自Yourkit捕获的启动时间).您还可以将logger.properties级别设置为ALL,您将看到正在进行类路径扫描问题.

有没有办法在appengine上禁用它?上帝禁止我们与taglibs,JSP或类似的东西有任何关系!我们有一个非常光滑的速度+ spring-mvc容器.

同样,问题非常明确:appengine不尊重web.xml中的"org.mortbay.jetty.webapp.NoTLDJarPattern"配置

这件事正在扼杀我们的服务!我们的启动时间超过60秒,我们需要做任何事情来减少它.

java google-app-engine jetty taglib appengine-maven-plugin

9
推荐指数
1
解决办法
1122
查看次数

从较旧的Tomcat版本运行标记库

首先是一些背景.

我正在开发一个Web应用程序.此应用程序作为第三方商业Web应用程序的扩展安装.第三方为我们的应用程序提供了一个SDK,以便与主Web应用程序进行交互.因此,我们无法控制运行应用程序的环境.我们受第三方申请的支配.

现在为了这个问题.

我们的应用程序打包了JSP使用的自定义标记库.第三方应用程序的一个要求是我们只发布预编译的JSP.编译JSP以及必要的.tag文件没有问题.

第三方推出了他们软件的新版本.我们将支持从旧版本的软件到新版本的平滑升级.

旧版本的第三方软件运行在Tomcat 5.5之上.我们的JSP是使用tomcat 5.5 JSP编译器构建的.新版本在Tomcat 7上运行.升级后,我们的扩展程序仍然运行,但标记未正确评估.

标签会发出正确的HTML,但传递给标签的任何属性似乎都会丢失.

作为一个例子,我创建了一个简单的测试标记:

<%@ attribute name="testValue" required="true" %>

<div name="${testValue}" >
    ${testValue}
</div>
Run Code Online (Sandbox Code Playgroud)

这在JSP中使用如下:

<my:testDiv testValue="myNewTestValue" />
Run Code Online (Sandbox Code Playgroud)

在Tomcat 5.5上,它被评估并产生以下内容:

<div name="myNewTestValue" >
    myNewTestValue
</div>
Run Code Online (Sandbox Code Playgroud)

但是,运行Tomcat 7时的代码相同,HTML是输出,但属性不是.请注意,${testValue}已处理但替换为空值,而不是给定的值.

<div name="" >

</div>
Run Code Online (Sandbox Code Playgroud)

如果我使用Tomcat 7编译器编译相同的代码,它会再次工作.

<div name="myNewTestValue" >
    myNewTestValue
</div>
Run Code Online (Sandbox Code Playgroud)

显然,使用Tomcat 7 JSP编译器构建的版本不会在旧版本上运行.鉴于Tomcat 5.5版本不会在新版本上运行,我们没有平滑过渡.

我一直在网上闲逛几周试图找到这个问题,甚至是类似的东西,并且提出的很少.至少没有任何东西能让我找到解决方案.

在Tomcat 7上运行使用Tomcat 5.5编译器编译的标签是否存在已知问题?我需要吟唱一些神奇的咒语吗?

一些额外的信息:

我们正在和Maven一起建设.pom的相关部分:

        <!-- Precompile JSPs -->
<!--    <dependency> -->
<!--        <groupId>org.apache.tomcat</groupId> -->
<!--        <artifactId>tomcat-jasper</artifactId> -->
<!--        <version>7.0.21</version> -->
<!--        <scope>compile</scope> -->
<!--    </dependency> --> …
Run Code Online (Sandbox Code Playgroud)

java jsp taglib tomcat5.5 tomcat7

8
推荐指数
1
解决办法
345
查看次数