2010-06-25 124 views
3

我想创建一个自定义标记与Facelets但它不呈现(即标记出现在响应中)。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> 

非常感谢提前!

+0

有人吗?这仍然不起作用。 – 2010-06-25 16:28:13

回答

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来构建自定义taglib组件。我说这不是100%正确,因为它应该与新的参数名称一起使用。还有其他一些有新名字的参数,但我还没有测试过它们。

+1

@Panyiotis Karabassis:谢谢,这节省了我的一天。我的问题是使用facelet而不是facelets – bertie 2011-06-23 07:29:37

+0

不客气!那么这仍然是一个问题?我暂时还没有编写JSF,但我刚刚购买了“Face JavaServer Faces”一书(非常有希望),这本书讲述的是JSF2.0,facelets作为默认视图层。它现在不应该“开箱即用”吗? – 2011-06-23 18:43:48

+0

在我即将放弃时拯救了我..... – 2014-06-09 03:54:01

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 name="body"> 
<my:inputThumbnailSelector image="${facesContext.externalContext.requestContextPath}/image/get.servlet?id=1" 
      backingBean="#{entryHandler}"/> 
</ui:define> 
+0

是的,我用ui:define来包装它。谢谢! – 2010-06-25 13:54:26