문제

JSF/Seam 애플리케이션에서 사용하려는 JSP 태그가 있습니다. 누군가 내 환경이 태그를 받아들이도록하는 데 도움이 될 수 있습니까? 기존 태그에 FACLETS *.TAGLIB.XML 파일을 가리키거나 이전 태그를 확장하는 구성 요소를 작성해야합니까?

모든 정보에 대한 건배, Lee

도움이 되었습니까?

해결책

JSP 컨텍스트 외부에서 JSP 태그를 직접 호출하는 것을 매우 꺼려합니다. 로서 문서가 지적합니다, JSP와 얼굴의 유사성은 매우 피상적입니다.

한 해킹 (모든 솔루션이 해킹이 될 것으로 의심됩니다)은 서블릿 API에 캐스트하여 JSP를 포함시키는 것일 수 있습니다.

이 기능은 a를 사용하는 주어진 리소스를 포함합니다 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/includ.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 컨텍스트 매개 변수를 사용합니다:

  <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>

사용에 유의하십시오 $ {데모 : 포함 ( '/includeme.jsp')} 요청 디스패처를 호출하려면 (함수는 빈 문자열을 반환). 함수는 속성에 의해 포함됩니다 xmlns : demo = "http : // demo". 요청 범위 변수 foo 텍스트 필드에 묶여 JSP에 의해 픽업됩니다.


내가 이것에 대해 말할 수있는 것은 그것이 나에게 효과가 있었고 아마도 특정 태그 조합이나 JSF 라이브러리의 조합과 작동하지 않는 이유가 12 가지가있을 것입니다. 경고 emptor.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top