Как включить страницу JSP в страницу Facelets? - PullRequest
4 голосов
/ 24 мая 2011

Я использую Myfaces 2 на Facelets. Я должен включить страницу JSP в страницу Facelet. Я пытался использовать <ui:include>, но он занимает только страницы XHTML. Я также пытался использовать <c:import> и <f:subview>, но ничего не получалось. Много гуглил, но не получил точного ответа.

Как мне выполнить требование?

Ответы [ 2 ]

4 голосов
/ 24 мая 2011

Это возможно с пользовательским UIComponent.Мой коллега написал статью об этом в блоге год назад: Facelets и устаревшая JSP .

Это некоторый код, но принцип прост, компонент делает RequestDispatcher#include() с пользовательским HttpServletResponseWrapper, который захватывает записанный вывод и затем записывает его в тело компонента JSF.Вот выдержки из уместности:

Создать класс 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();
       }
    }

}

Создать класс 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>

И последнее, но не менее важное, отметить его последние слова

Я бы не рекомендовал использовать это как долговременное решение, но это может упростить переход от устаревшей JSP с вонючими скриптлетами и всем остальным на более разумное и современное приложение Facelets.

1 голос
/ 24 мая 2011

Вы не можете.JSP и facelets не могут быть оценены вместе - у вас есть только один обработчик представления, и он обрабатывает facelets, а не JSP.

<c:import> будет работать, если jsp доступен через http, и, следовательно, его выводв комплекте, а не код.

...