我有一个打包为的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项目的功能(类和标记库).
我正在开始我的第一个谷歌应用引擎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知道发生了什么,而不是认为这是一个错误?
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消息?代码示例(甚至伪代码)将是最棒的!
是否可以将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)
而其他人似乎没什么用.
我有一个自定义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)
我相信必须有更好的方法来做到这一点.请帮忙.
我正在尝试从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) 我想java.time.LocalDate在我的JSP中显示格式化.你知道用于此的任何taglib吗?
因为java.util.Date我们正在使用<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>.java.time.LocalDate存在类似的东西吗?
我使用带有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) 此主题类似于:在谷歌应用引擎(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秒,我们需要做任何事情来减少它.
首先是一些背景.
我正在开发一个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)