2010-10-24 1 views
1

У меня есть ситуация, когда мне нужно сгенерировать много HTML, а затем вернуть его в виде стиля JSONP. Таким образом, в конечном итоге ответ HTTP на самом деле будет Javascript текста так:Как связать ответ JSP с запросом сервлета

myglobaljavascriptcallbackfunction(' < HTML здесь > ');

Поскольку HTML является сложным, единственным разумным способом построить это с JSP. Поэтому я хотел бы сделать вывод HTML из JSP и передать его сервлету, который затем может обернуть HTML с необходимым javascript.

Ниже приведена моя лучшая догадка. Не повезло - HTTP-ответ от сервлета - myglobaljavascriptcallbackfunction(''); без какого-либо HTML-кода JSP.

JSP


<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<jsp:forward page="/MyServlet" /> 
<div> 
    <span>Imagine some really complicated stuff here</span> 
<div>

Servlet

protected void doGet(...) { 

    String pre = "myglobaljavascriptcallbackfunction('"; 
    String post = "');"; 

    OutputStream out = response.getOutputStream(); 
    out.write(pre.getBytes()); 

    // transfer request to response 
    InputStream in = request.getInputStream(); 
    byte[] buf = new byte[1024]; 
    int count = 0; 
    while ((count = in.read(buf)) > 0) { 
     out.write(buf, 0, count); 
     // TODO: escape single quote chars 
    } 

    out.write(post.getBytes()); 
}

ответ

3

Используйте <jsp:include>, если вы хотите, чтобы включают ответ сервлета в JSP.

Используйте RequestDispatcher#include(), если вы хотите Включите Ответ JSP в Servlet. Это то, что вы хотите. Однако вам нужно изменить URL-адрес запроса XHR, чтобы указать на Servlet вместо JSP.


Примечание: у вас есть потенциальная проблема кодировки символов с getBytes() вызова, который неявно с использованием кодировки символов платформы по умолчанию.

+0

Это ближе, но сразу же выгружает HTML в ServletResponse. Мне нужно иметь возможность обрабатывать выходные данные JSP до того, как он будет записан в ответ, чтобы удалить пустое пространство и избежать определенных символов, поскольку HTML будет помещен в строку javascript (кстати, я использую JSONP здесь не XHR) – Lightbeard

+1

Используйте «Фильтр» с промежуточным тримером или «Файл» или «URLConnection» в сервлет, чтобы открыть JSP локально. Прочтите «XHR» как «Клиент». На самом деле источник запроса не имеет значения. Я просто ожидал JS/ajax (XHR). – BalusC