سؤال

لدي علامة JSP أرغب في استخدامها في تطبيق JSF/Seam الخاص بي.هل يمكن لأي شخص أن يقدم لي بعض الإرشادات لجعل بيئتي تقبل العلامة.هل يمكنني فقط توجيه ملف faclets *.taglib.xml إلى علامتي القديمة أو ربما أحتاج إلى كتابة مكون يمتد إلى العلامة السابقة؟

هتاف لأي معلومات ، لي

هل كانت مفيدة؟

المحلول

سأكون مترددًا جدًا في محاولة استدعاء علامة JSP مباشرة خارج سياق JSP.كما يشير التوثيق, فإن أوجه التشابه بين JSP وFacelets سطحية جدًا.

قد يكون أحد الاختراقات (أظن أن أي حل سيكون اختراقًا) هو تضمين JSP عن طريق الانتقال إلى واجهة برمجة تطبيقات servlet.

تتضمن هذه الوظيفة موردًا محددًا باستخدام ملف مرسل الطلب:

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 باستخدام معلمة السياق:

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

<!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:عرض = "http://demo".متغير نطاق الطلب foo يرتبط بحقل النص ويتم التقاطه بواسطة JSP.


كل ما يمكنني قوله عن هذا هو أنه نجح بالنسبة لي وربما يكون هناك عشرات الأسباب لعدم نجاحه مع مجموعة معينة من العلامات، أو مع مجموعات معينة من مكتبات JSF.مسؤولية المشتري.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top