Преобразование тега JSP в компонент JSF
Вопрос
У меня есть тег JSP, который я хотел бы использовать в своем приложении JSF/Seam.Может ли кто-нибудь дать мне несколько советов, как заставить мою среду принять тег.Могу ли я просто указать файл faclets *.taglib.xml на мой старый тег или, возможно, мне нужно написать компонент, расширяющий предыдущий тег?
Приветствия за любую информацию, Ли
Решение
Я бы очень не хотел пытаться напрямую вызвать тег JSP вне контекста JSP.Как документация указывает, сходство между JSP и Facelets довольно поверхностно.
Одним из хаков (я подозреваю, что любое решение будет хаком) может быть включение JSP путем приведения к API сервлета.
Эта функция включает данный ресурс с помощью Диспетчер запросов:
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);
}
}
}
Эта функция определена в файле taglib Facelet. 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>
Это указано как библиотека в ВЕБ-INF/web.xml использование параметра контекста:
<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>
Facelet, включающий JSP:
<!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://демо".Переменная области запроса фу привязан к текстовому полю и подхватывается JSP.
Все, что я могу сказать по этому поводу, это то, что у меня это сработало, и, вероятно, есть дюжина причин, по которым это не будет работать с определенной комбинацией тегов или с определенными комбинациями библиотек JSF.Пусть покупатель будет бдителен.