【问题标题】:Facelet include of a servlet generated contentFacelet 包含一个 servlet 生成的内容
【发布时间】:2012-07-17 15:55:21
【问题描述】:

我想使用 ui:include 在 facelet 中包含一个 servlet 生成的内容。到目前为止,我只得到了错误。

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

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

我用谷歌搜索并stackoverflow了我的问题,但找不到匹配的响应。

myfacelet.xhtml(位于 webapp 的根目录,即通过“http://localhost: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://localhost:8080/mywebapp/dynamic-content”访问):

@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:include="dynamic-content" 和 urlPatterns="/dynamic-content" 或 ui:include="dynamic-content.bla" 和 urlPatterns="*.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 永远不会被执行。

我的代码有什么问题?

是否可以包含?

我怎样才能实现它?

最好的问候

【问题讨论】:

    标签: jsf servlets facelets


    【解决方案1】:

    问题发布已经有一段时间了,但有人可能会觉得它很有用,如果我做了一些愚蠢的事情,我欢迎您的指正! 我遇到了同样的问题,我通过javascript通过锻炼解决了它,我使用的线索来自这个链接https://www.w3schools.com/howto/howto_html_include.asp,我的servlet是动态生成一个地图标签,它是用servlet在(web.xml)文件上设置的过滤器(轮廓),所以我使用上面提到的链接中的javascript应用了xhtml中的链接,(注意:rtutil.appUrl返回我的JSF应用程序的上下文路径),我应用它如下:

    <div w3-include-html="#{rtutil.appUrl}/contours/map"></div>
            <script type="text/javascript" src="resources/js/rtscript.js"></script>
            <script type="text/javascript">
                includeHTML();
                $(document).ready(function () {
                    cityplanmap();
                });
            </script>
    

    【讨论】:

      【解决方案2】:

      &lt;ui:include&gt; 只能包含另一个 Facelets 文件,而不是 JSP/Servlet 的输出。

      您要么需要将 Servlet 替换为完整的 Facelets 文件,要么使用 Facelets 标记文件或 Facelets 复合组件,其中 HTML 也可以使用 JSTL 标记或rendered 属性动态生成,如有必要在 backing bean 或 backing 组件的帮助下。

      如果您出于某种原因绝对需要使用 Servlet,例如因为您正处于从旧版 JSP/Servlet 到 JSF/Facelets 的迁移过程中,并且没有太多时间来正确地将 Servlet 转换为理智的 Facelets 方法,那么你也可以考虑使用OmniFaces 的&lt;o:resourceInclude&gt; 组件:

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

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

      【讨论】:

      • 感谢您的回答。我可能会打开一个专门的问题来获取正确的设计信息。现在我专注于“包含 servlet 生成的内容”问题。 :) 我找不到有关此“ui:include”限制的技术信息。我什至找到了表明这是可能的消息来源。 :/ 你有关于限制的来源/解释/规范吗?
      • 这是我参考的来源之一。从这个文档中,我了解到可以包含任何 XHTML 文件,而不仅仅是 facelets。 :'(
      • “这个标签可以包含三样东西:普通的 XHTML 和具有组合标签或组件标签的 XHTML 页面。” servlet 不在其中。
      • 我使用了'ui:include src="localhost:8080/mywebapp/dynamic-content"'。现在它起作用了,包含已执行! “ui:include”中有一些非常可疑的东西。我怀疑对于相对(例如“bla/bli.xhtml”)或绝对(例如“/bla/bli.xhtml”)URL,JSF 检查目标 URL 是否是现有的 facelet(如果不是,则错误)。另一方面,对于“完整” URL(例如“host:port/app/bla/bli"”),它没有,并且包含只是有效。你怎么看?最好的问候。
      【解决方案3】:

      我也在开发一个必须执行动态页面生成的应用程序,包括嵌入图像、&lt;map&gt; 和&lt;area&gt; 标签以及关联的&lt;div&gt; 标签,这些标签会在翻转时突出显示。

      我天真的第一个测试方法是从 StringBuffer 中写出整个 html:response.getWriter().println(sb.toString());。这行得通,但它是一个 hack,并且没有利用我的 JSF 模板。即使我写出整个&lt;ui:composition&gt; 元素,它也不使用模板。

      在 Java EE 6 教程中,有关于如何创建自定义组件的详细信息。见这里:http://docs.oracle.com/javaee/6/tutorial/doc/glpcb.html

      这似乎支持BalusC上面的评论, "...使用 Facelets 标记文件或 Facelets 复合组件,其中 HTML 也可以使用 JSTL 标记或渲染属性动态生成,如有必要,可借助支持 bean 或支持组件。"

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

      【讨论】:

        猜你喜欢
        • 2010-12-02
        • 1970-01-01
        • 2011-06-26
        • 2016-04-15
        • 1970-01-01
        • 1970-01-01
        • 2016-05-30
        • 1970-01-01
        • 2011-11-08
        相关资源
        最近更新 更多