Facelets自定义标签未渲染。

4

我正在尝试使用Facelets创建自定义标签,但它没有被呈现(即在响应中未替换标签)。

标签(/WEB-INF/facelets/tags/inputThumbnailSelector.xhtml):

<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:t="http://myfaces.apache.org/tomahawk">

<ui:composition>
 <div style="position: relative;">
  <img style="position: absolute; left: 0; top: 0;" src="#{image}"/>
  <div class="thumbnail-selector" style="position: absolute; left: #{backingBean.thumbnailLeft}; top: #{backingBean.thumbnailTop};"/>
 </div>
</ui:composition>

</html>

/WEB-INF/facelets/tags/panayk.taglib.xml:

<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">

<facelet-taglib>
 <namespace>http://panayk.endofinternet.org/jsf</namespace>
 <tag>
  <tag-name>inputThumbnailSelector</tag-name>
  <source>inputThumbnailSelector.xhtml</source>
 </tag>
</facelet-taglib>

我的web.xml文件包含:

<context-param>
 <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
 <param-value>/WEB-INF/facelets/tags/panayk.taglib.xml</param-value>
</context-param>

这个标签的名称是:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:t="http://myfaces.apache.org/tomahawk"
   xmlns:my="http://panayk.endofinternet.org/jsf">

<ui:composition template="/layout/layout.xhtml">
...  
   <my:inputThumbnailSelector image="${facesContext.externalContext.requestContextPath}/image/get.servlet?id=1" 
            backingBean="#{entryHandler}"/>
...
</ui:composition>

</html>

非常感谢您的提前帮助!


有人吗?这还是不起作用。 - Panayiotis Karabassis
3个回答

7
我在这里找到了答案:https://community.oracle.com/thread/1719525

我认为我找到了问题和解决方案(这并不是100%正确的)。上下文参数应该是facelets.LIBRARIES而不是javax.faces.FACELETS_LIBRARIES

上下文参数javax.faces.FACELETS_LIBRARIES应该替换已弃用(根据JSF规范)的上下文参数facelets.LIBRARIES。当使用后者时,在服务器启动期间日志中会有一个警告,指出facelets.LIBRARIES已被弃用,应改用javax.faces.FACELETS_LIBRARIES。但我认为这仅用于记录警告,即仍然使用名称facelets.LIBRARIES来构建自定义标签库组件。我之所以说这不是100%正确的,是因为它应该可以使用新的参数名称。还有其他参数更名了,但我还没有测试它们。


1
@Panyiotis Karabassis:谢谢,这个救了我的一天。我的问题是使用facelet而不是facelets。 - Bertie
欢迎!如果这仍然是一个问题,那么呢?我已经有一段时间没有编写JSF了,但我刚刚购买了《Core JavaServer Faces》书籍(非常有前途),它介绍了JSF2.0和facelets作为默认视图层。现在应该可以“开箱即用”了吧? - Panayiotis Karabassis
在《Core Javaserver Faces》一书中,作者同时使用了javax.faces.FACELETS_LIBRARIES和acelets.LIBRARIES,这真的很令人困惑。 - Tarik

0

确保你的*.taglib.xml配置正确。我曾经遇到过命名空间错误导致无法工作的情况。当我更正后,它立即开始工作,并且我可以使用自动完成(又称代码补全)功能。

<facelet-taglib version="2.2"
            xmlns="http://xmlns.jcp.org/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd">
</facelet-taglib>

相关链接:

JSF 2.2:新命名空间

将Facelets文件(模板、包含、组合)打包到JAR中


0

我建议您这样编写标签:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:t="http://myfaces.apache.org/tomahawk">

 <div style="position: relative;">
  <img style="position: absolute; left: 0; top: 0;" src="#{image}"/>
  <div class="thumbnail-selector" style="position: absolute; left: #{backingBean.thumbnailLeft}; top: #{backingBean.thumbnailTop};"/>
 </div>
</ui:composition>

但是一切似乎都很好,因为您使用了布局,您是否像这样将自定义标签包装在ui:define中?

<ui:define name="body">
<my:inputThumbnailSelector image="${facesContext.externalContext.requestContextPath}/image/get.servlet?id=1" 
            backingBean="#{entryHandler}"/>
</ui:define>

是的,我将它包装在了一个“ui:define”中。谢谢! - Panayiotis Karabassis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接