2010-10-24 8 views
1

J'ai une situation où je dois générer beaucoup de HTML et ensuite le renvoyer sous la forme d'un style JSONP. Donc, la réponse éventuelle HTTP sera effectivement texte javascript comme ceci:Comment enchaîner une réponse JSP à une requête Servlet

myglobaljavascriptcallbackfunction(' < HTML ici > ');

Depuis le HTML est complexe, la seule façon saine de construire est avec une JSP. Donc, ce que je voudrais faire est de prendre la sortie HTML de la JSP et de la rediriger vers une servlet qui peut ensuite envelopper le code HTML avec le javascript nécessaire.

Voici ma meilleure estimation. Pas de chance - la réponse HTTP du Servlet est myglobaljavascriptcallbackfunction(''); sans le HTML de la 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()); 
}

Répondre

3

Utilisez <jsp:include> si vous voulez inclure réponse Servlet JSP.

Utilisez RequestDispatcher#include() si vous souhaitez inclure réponse JSP dans Servlet. Celui-ci est ce que tu veux. Vous devez cependant seulement modifier l'URL de requête XHR pour qu'elle pointe vers la servlet au lieu de la JSP.


Note: vous avez un caractère potentiel problème d'encodage à l'appel getBytes() qui utilise implicitement le caractère par défaut de la plate-forme de codage.

+0

Ceci est plus proche, mais il renvoie immédiatement le code HTML à ServletResponse. Je dois être capable de traiter la sortie de la JSP avant qu'elle ne soit écrite dans la réponse pour supprimer les espaces et échapper certains caractères puisque le HTML sera mis dans une chaîne javascript (btw j'utilise JSONP ici pas XHR) – Lightbeard

+1

Utilisez un 'Filter' avec un espace blanc ou un fichier' ou' URLConnection' dans le servlet pour ouvrir JSP localement. Lire "XHR" en tant que "Client". La source de la requête n'a pas d'importance. Je m'attendais juste à JS/ajax (XHR). – BalusC

Questions connexes