2013-04-11 6 views
2

Я работаю над устаревшим кодом, поэтому, пожалуйста, не начинайте «почему вы так делаете», я знаю, что это ужасная реализация, поэтому давайте пропустим это.Как вставить jsp из javacode в другой jsp

В высоком уровне у меня есть JSP

<html:form action="/myAction" method="POST" onsubmit="beforeSubmit()"> 
... 
     <table class="dialog"> 
      <% render.myhtml(out); %> 
     </table> 
... 
</html> 

render.myhtml (уходит) находится в коде Java следующим образом (я пробовал и с JSP: включать и @ включают:

public void myhtml(Writer w) throws IOException { 
.... 
     String include = "<jsp:include page=" +"\"" +myobject.getPage() +"\"" + " />"; 
     //String include = "<%@ include file=" +"\"" +myobject.getPage() +"\"" + " %>"; 
     println(w, include); 
... 
} 

, но когда я открываю страницу, я не могу видеть, включаемые .. исходный код показывает, что это печать включаемых тегов, но не его оценки:

<table class="dialog"> 
    ... 
    <jsp:include page="/path/test.jsp" /> 
</table> 

Так что мне кажется, что эта вставка происходит ПОСЛЕ того, что включения оцениваются .. так что вопрос в том, .. что я могу сделать, чтобы сделать эту работу? Я думал о том, чтобы читать JSP как строку и передавать ее, но это довольно тяжело для памяти, поэтому я хочу этого избежать.

+0

* Я работаю над устаревшим кодом, поэтому, пожалуйста, не начинайте «почему вы так делаете», я знаю, что это ужасная реализация, поэтому давайте пропустим, что * рад узнать, что вы знаете, что это неправильно, но вы должны принять Это. –

ответ

6

Использовать RequestDispatcher.include() в myhtml().

Вам нужно будет пройти в application из вашей JSP, как RequestDispatcher доступен через ServletContext.getRequestDispatcher()

Применение является JSP неявный объект: http://www.tutorialspoint.com/jsp/jsp_implicit_objects.htm

EDIT

JSP:

<html:form action="/myAction" method="POST" onsubmit="beforeSubmit()"> 
... 
     <table class="dialog"> 
      <% render.myhtml(application, request, response); %> 
     </table> 
... 
</html> 

Java:

public void myhtml(ServletContext sc, ServletRequest req, ServletResponse res) throws IOException { 
.... 
     RequestDispatcher rd = sc.getRequestDispatcher(myobject.getPage()); 
     rd.include(req, res); 
... 
} 

Мне также нравится ответ @ Luiggi, и у вас есть выбор действительно в зависимости от того, как вы хотите написать свой код.

+0

Благодарим Пола, но не могли бы вы быть более конкретными в отношении использования RequestDispatcher.include() для рендеринга include и способа его получения в jsp? – Klam

+2

Обратите внимание, что прохождение запроса и ответа достаточно, так как контекст сервлета доступен с помощью 'request.getServletContext()' –

+0

@JB - Да, хорошая точка. Я оставлю как есть, чтобы показать 3 неявных vars, доступных JSP, но вы совершенно правы. –

0

Объяснение ошибки подробно описано в JB Nizet answer.

Если вы хотите динамически включать jsp, используя <jsp:include>, вам следует просто динамически установить имя страницы, которую вы хотите включить. Простой пример:

<table class="dialog"> 
    <jsp:include page="<%= render.myhtml() %>" /> 
</table> 

Имея

public String myhtml() { 
    return "/path/test.jsp"; 
} 
+0

Да, я тоже думал об этом, но проблема в том, что render.myhtml(), поскольку «...» указывает, что у него есть больше вещей, полей и т. Д., Он также может содержать более 1 include. – Klam

+0

@ user1994202 если это ситуация (не указано нигде в вашем вопросе) использование [ответ PaulGrime] (http://stackoverflow.com/a/15959387/1065197) –

1

писатель, который передается в ваш метод render.myhtml() является писатель ответе НТТР в. Все, что вы пишете этому писателю, поступает в браузер, как есть.

JSP - это серверная технология. Он компилируется и выполняется на стороне сервера. Браузер ничего не знает о включении JSP. Поэтому писать JSP-код для автора ответа HTTP не имеет смысла.

Чтобы сделать то, что вы хотите сделать, см. Paul Grime's answer.

Смежные вопросы