2012-07-18 61 views
0

我想使用ui:include在小工具中包含servlet生成的内容。到目前为止,我只有错误。Facelet包含servlet生成的内容

请注意,该servlet工作正常,来自浏览器的GET请求可以。

请注意,我可以成功地包含来自另一个facelet文件的内容,但不能在内容为servlet生成时包含内容。

我GOOGLE和stackoverflowed我的问题,但无法找到匹配的答复。

myfacelet.xhtml(在web应用程序的根,即,通过达成的 “http://本地主机:8080/mywebapp/myfacelet.xhtml”):

<?xml version="1.0" encoding="UTF-8"?> 
<!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:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 
<h:head> 
    <title>JSF Dynamic Content</title> 
</h:head><h:body> 
    <h3>Dynamic content:</h3> 
    <ui:include src="dynamic-content"/> 
</h:body> 
</html> 

MyServlet.java(可通过到达的 “http://本地主机:8080/mywebapp /动态内容”):

@WebServlet(name = "DynamicContentServlet", urlPatterns = {"/dynamic-content"}) 
public class DynamicContentServlet extends HttpServlet { 
    @Override 
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    PrintWriter writer = response.getWriter(); 
    writer.println("<p>Dynamic stuff</p>"); 
    } 
} 

的web.xml(JSF相关的东西只):

<context-param> 
    <param-name>javax.faces.PROJECT_STAGE</param-name> 
    <param-value>Development</param-value> 
</context-param> 
<servlet> 
    <servlet-name>FacesServlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>FacesServlet</servlet-name> 
    <url-pattern>/faces/*</url-pattern> 
    <url-pattern>*.jsf</url-pattern> 
    <url-pattern>*.faces</url-pattern> 
    <url-pattern>*.xhtml</url-pattern> 
</servlet-mapping> 

对于ui:include =“/ dynamic-content”和urlPatterns =“/ dynamic-content” (或ui:include =“/ mywebapp/dynamic-content”和urlPatterns =“/ dynamic-content”) 错误是:

javax.faces.view.facelets.TagAttributeException: /myfacelet.xhtml @12,48 <ui:include src="/dynamic-content"> Invalid path : /dynamic-content 
at com.sun.faces.facelets.tag.ui.IncludeHandler.apply(IncludeHandler.java:152) 
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:195) 
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93) 
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:86) 
at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:152) 
at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:774) 
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) 
(...) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) 
at java.lang.Thread.run(Thread.java:662) 

对于UI:包括= “动态内容” 和URL模式= “/动态内容” 或UI:包括= “动态content.bla” 和URL模式= “* BLA。”, 的错误是:

java.io.FileNotFoundException 
at org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection.java:369) 
at com.sun.faces.facelets.impl.DefaultFaceletCache._getLastModified(DefaultFaceletCache.java:172) 
at com.sun.faces.facelets.impl.DefaultFaceletCache.access$000(DefaultFaceletCache.java:62) 
at com.sun.faces.facelets.impl.DefaultFaceletCache$1.newInstance(DefaultFaceletCache.java:82) 
at com.sun.faces.facelets.impl.DefaultFaceletCache$1.newInstance(DefaultFaceletCache.java:78) 
at com.sun.faces.util.ExpiringConcurrentCache$1.call(ExpiringConcurrentCache.java:99) 
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
at com.sun.faces.util.ExpiringConcurrentCache.get(ExpiringConcurrentCache.java:114) 
at com.sun.faces.facelets.impl.DefaultFaceletCache.getFacelet(DefaultFaceletCache.java:121) 
at com.sun.faces.facelets.impl.DefaultFaceletCache.getFacelet(DefaultFaceletCache.java:62) 
at com.sun.faces.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:256) 
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:366) 
at com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:346) 
at com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:199) 
at com.sun.faces.facelets.tag.ui.IncludeHandler.apply(IncludeHandler.java:147) 
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:195) 
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
at com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93) 
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
at com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:86) 
at com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:152) 
at com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:774) 
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:100) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) 
(...) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) 
at java.lang.Thread.run(Thread.java:662) 

另请注意,servlet永远不会被执行。

我的代码有什么问题?

包括可能吗?

我该如何实现它?

问候

回答

1

<ui:include>只能包括另一Facelets的文件,一个JSP/Servlet的不输出。

您可能需要用一个完整的Facelets文件替换Servlet,或者使用Facelets标记文件或Facelets复合组件,其中HTML也可以使用JSTL标记或rendered属性动态生成(如有必要)辅助bean或后备组件的帮助。

如果由于某种原因绝对需要使用Servlet,例如因为您正在从传统的JSP/Servlet迁移到JSF/Facelets,并且没有足够的时间来正确转换为Servlet到一个理智的Facelets的方法,那么你也可以考虑使用的OmniFaces<o:resourceInclude>组件:

<o:resourceInclude path="/dynamic-content" /> 

但正如所说,这是不正确的设计方法。对于一个适当的长期解决方案,您应该考虑用Facelets文件/标记/复合替换Servlet。

+0

谢谢你的回答。我可能会打开一个专门的问题来获取正确的设计信息。现在我关注“包含servlet生成的内容”问题。 :)我无法找到关于此“ui:include”限制的技术信息。我甚至发现有消息称这是可能的。 :/你有关于限制的资料/解释/规格吗? – 2012-07-18 15:34:05

+0

只需检查标记文档:http://docs.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/ui/include.html – BalusC 2012-07-18 15:34:48

+0

这就是我所指的来源之一。从这个文档中我明白任何XHTML文件都可以被包含,而不仅仅是facelets。 :'( – 2012-07-18 15:40:03

0

我也在开发一个应用程序,该应用程序必须执行动态页面生成,包括嵌入式图像,<map><area>标签和相关联的<div>标签,这些标签在翻转时突出显示。

我天真的第一个测试方法是从StringBuffer写出整个html:response.getWriter().println(sb.toString());。这工作,但它是一个黑客攻击,并没有利用我的JSF模板。即使我写出整个<ui:composition>元素,也不会使用该模板。

在Java EE 6教程中,详细介绍了如何创建自定义组件。在这里看到:http://docs.oracle.com/javaee/6/tutorial/doc/glpcb.html

这似乎支持上述BalusC的评论, ” ......使用Facelets标记文件或其中,也可以使用JSTL标签或呈现属性动态生成的HTML一个Facelets的复合材料部件,如果需要的话在后台bean或后台组件的帮助下。“

您的里程可能会有所不同!