1

ui:include を使用して、サーブレットで生成されたコンテンツを facelet に含めたいと思います。これまでのところ、エラーしかありませんでした。

サーブレットは正常に動作することに注意してください。ブラウザからの GET リクエストは問題ありません。

別の facelet ファイルからコンテンツを正常に含めることはできますが、コンテンツがサーブレットで生成された場合は含められないことに注意してください。

問題をグーグルでスタックオーバーフローしましたが、一致する応答が見つかりませんでした。

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)

また、サーブレットは実行されないことに注意してください。

コードの何が問題になっていますか?

インクルードは可能ですか?

どうすれば達成できますか?

よろしくお願いします

4

3 に答える 3

2

JSP/サーブレットの出力ではなく、別の<ui:include>Facelets ファイルのみを含めることができます。

サーブレットを完全な Facelets ファイルに置き換えるか、rendered必要に応じてバッキング Bean の助けを借りて、JSTL タグまたは属性を使用して HTML を動的に生成できる Facelets タグ ファイルまたは Facelets 複合コンポーネントを使用する必要があります。またはバッキング コンポーネント。

何らかの理由で絶対にサーブレットを使用する必要がある場合。たとえば、レガシー JSP/サーブレットから JSF/Facelets への移行プロセスにあり、サーブレットから適切な Facelets アプローチに適切に変換する時間があまりないためです。の場合、 OmniFaces<o:resourceInclude>のコンポーネントを使用することも検討できます。

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

しかし、前述のとおり、これは正しい設計アプローチではありません。適切な長期的な解決策として、サーブレットを Facelets ファイル/タグ/コンポジットに置き換えることを検討する必要があります。

于 2012-07-18T15:16:35.573 に答える
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 のコメントをサポートしているように思われ ます。 ."

あなたのマイレージは異なる場合があります!

于 2012-11-21T02:45:36.580 に答える