gpt4 book ai didi

jsp - 如何在 Facelets 页面中包含 JSP 页面?

转载 作者:行者123 更新时间:2023-12-04 14:39:18 25 4
gpt4 key购买 nike

我在 Facelets 上使用 Myfaces 2。
我必须在 Facelet 页面中包含一个 JSP 页面。
我尝试使用 <ui:include>但它只需要 XHTML 页面。
我也尝试使用 <c:import><f:subview>但没有任何效果。
谷歌搜索了很多,但没有得到确切的答案。

我怎样才能达到要求?

最佳答案

这可以通过自定义 UIComponent 实现.我的同事在一年前写了一篇关于此的博客文章:Facelets and legacy JSP .

是一些代码,但是原理很简单,组件做了一个 RequestDispatcher#include() 带定制 HttpServletResponseWrapper 它捕获写入的输出,然后将其写入 JSF 组件的主体。以下是相关摘录:

创建类(class) com.example.component.JspIncludeComponent

public class JSPIncludeComponent extends UIComponentBase {

public String getFamily() {
return "components.jsp.include";
}

public void encodeBegin(FacesContext context) throws IOException {
try {
ExternalContext externalContext = context.getExternalContext();
HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();

// Create dispatcher for the resource given by the componen's page attribute.
RequestDispatcher requestDispatcher = request.getRequestDispatcher((String) getAttributes().get("page"));

// Catch the resource's output.
CharResponseWrapper responseWrapper = new CharResponseWrapper(response);
requestDispatcher.include(request, responseWrapper);

// Write the output from the resource to the JSF response writer.
context.getResponseWriter().write(responseWrapper.toString());
}
catch (ServletException e) {
throw new IOException();
}
}

}

创建类(class) com.example.CharResponseWrapper
public class CharResponseWrapper extends HttpServletResponseWrapper {

private CharArrayWriter output;

@Override
public String toString() {
return output.toString();
}

public CharResponseWrapper(HttpServletResponse response) {
super(response);
output = new CharArrayWriter();
}

public CharArrayWriter getCharWriter() {
return output;
}

@Override
public PrintWriter getWriter() {
return new PrintWriter(output);
}

@Override
public ServletOutputStream getOutputStream() {
return new CharOutputStream(output);
}

public InputStream getInputStream() {
return new ByteArrayInputStream( toString().getBytes() );
}
}

class CharOutputStream extends ServletOutputStream {

private Writer output;

public CharOutputStream( Writer writer ) {
output = writer;
}

@Override
public void write(int b) throws IOException {
output.write(b);
}
}

加入 faces-config.xml
<component>
<component-type>com.example.component.JSPIncludeComponent</component-type>
<component-class>com.example.component.JSPIncludeComponent</component-class>
</component>

创建文件 my.taglib.xml (Facelet taglib) 在 WEB-INF 文件夹中

<!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://example.com/jsf</namespace>

<tag>
<tag-name>include</tag-name>
<component>
<component-type>com.example.component.JSPIncludeComponent</component-type>
</component>
</tag>

</facelet-taglib>

添加到 web.xml (如 http://docs.oracle.com/javaee/6/tutorial/doc/bnawn.html 中所述)

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

这样你就可以将它用作

<ui:component 
xmlns:my="http://example.com/jsf"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<my:include page="page.jsp" />
</ui:composition>

最后但并非最不重要的,记下他的遗言

I wouldn’t recommend using this as a lasting solution, but it might ease a migration from legacy JSP with smelly scriptlets and all on them to a more sane and modern Facelets application.

关于jsp - 如何在 Facelets 页面中包含 JSP 页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6106703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com