gpt4 book ai didi

java - 将 JSP 标记转换为 JSF 组件

转载 作者:搜寻专家 更新时间:2023-11-01 03:15:00 24 4
gpt4 key购买 nike

我有一个 JSP 标记,我想在我的 JSF/Seam 应用程序中使用它。有人可以给我一些指导,让我的环境接受标签。我可以只将 faclets *.taglib.xml 文件指向我的旧标签,还是我需要编写一个组件来扩展以前的标签?

为任何信息干杯,李

最佳答案

我非常不愿意尝试在 JSP 上下文之外直接调用 JSP 标记。作为documentation points out ,JSP 和 Facelets 之间的相似之处非常肤浅。

一个 hack(我怀疑任何解决方案都将是 hack)可能是通过强制转换为 servlet API 来包含 JSP。

此函数使用 RequestDispatcher 包含给定资源:

public class Includer {

public static String include(String resource) {
FacesContext context = FacesContext
.getCurrentInstance();
ExternalContext ext = context.getExternalContext();
include(ext.getContext(), ext.getRequest(), ext
.getResponse(), resource);
return "";
}

private static void include(Object context,
Object request, Object response, String resource) {
ServletContext servletContext = (ServletContext) context;
ServletRequest servletRequest = (ServletRequest) request;
ServletResponse servletResponse = (ServletResponse) response;
RequestDispatcher dispatcher = servletContext
.getRequestDispatcher(resource);
try {
dispatcher.include(servletRequest, servletResponse);
} catch (IOException e) {
throw new FacesException(e);
} catch (ServletException e) {
throw new FacesException(e);
}
}

}

这个函数在 Facelet taglib 文件 WEB-INF/facelets/include.taglib.xml 中定义:

<?xml version="1.0" encoding="UTF-8"?>
<!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 xmlns="http://java.sun.com/JSF/Facelet">
<namespace>http://demo</namespace>
<function>
<function-name>include</function-name>
<function-class>inc.Includer</function-class>
<function-signature>
java.lang.String include(java.lang.String)
</function-signature>
</function>
</facelet-taglib>

这在 WEB-INF/web.xml 中被指定为一个库 using a context parameter :

  <context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/WEB-INF/facelets/include.taglib.xml</param-value>
</context-param>

示例用法

要包含的 JSP,includeme.jsp:

<?xml version="1.0" encoding="UTF-8" ?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
<jsp:directive.page language="java"
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" />
<b>Some data: ${foo}</b>
</jsp:root>

包含 JSP 的 Facelet:

<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:demo="http://demo">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>JSP include hack</title>
</head>
<body>
<h:form>
<p> ${demo:include('/includeme.jsp')} </p>
<h:inputText type="text" value="#{foo}" />
<h:commandButton type="submit" />
</h:form>
</body>
</html>

请注意使用 ${demo:include('/includeme.jsp')} 来调用请求调度程序(该函数返回一个空字符串)。该函数包含在 xmlns:demo="http://demo" 属性中。请求范围变量 foo 绑定(bind)到文本字段并由 JSP 获取。


关于这个我只能说它对我有用,可能有很多原因导致它不能与特定的标记组合或特定的 JSF 库组合一起使用。买者自负。

关于java - 将 JSP 标记转换为 JSF 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/858451/

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