À l'aide de PrintWriter et OutputStream
Je suis entrain de créer un projet avec struts et j'ai un problème à l'aide de Jasper IReports. Je veux exporter des informations dans un fichier pdf et je reçois le java.lang.IllegalStateException: getOutputStream() a déjà été appeler... Exception due à l'ouverture d'un ServletOutputStream dans mon code lorsque la page ouvre déjà un PrintWriter.
Le code est dans le modèle (donc il n'est pas dans la page jsp, c'est dans un fichier java), comme il suit:
public void handle(HttpServletResponse res, Connection connection, String path)throws Exception{
ServletOutputStream out = null;
try {
JasperDesign jasperDesign = JRXmlLoader.load(path);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
byte[] bytes = JasperRunManager.runReportToPdf(jasperReport, null, connection);
res.setContentType("application/pdf");
res.setContentLength(bytes.length);
out = res.getOutputStream();
out.write(bytes, 0, bytes.length);
} catch (Exception e) {
e.printStackTrace();
} finally {
out.flush();
out.close();
}
J'ai vérifié la connexion, le chemin d'accès et le HttpServletResponse et sont tous fonctionne bien.
Je suis très débutant avec Jasper Reports, ainsi qu'avec le codage des trucs dans des PDF de sorte que vous peut -correctement - suposse que j'ai un minimum d'idée de ce que je fais ici et que, de toute évidence mon code est à copier/coller à partir de quelque part sur le net.
J'ai essayé d'utiliser PrintWriter au lieu de OutputStream, transformant les octets en une Chaîne de caractères et à l'aide de la PrintWriter.append(String) méthode (allthought n'est pas de Chaîne est CharSequence), mais il n'a pas d'extraire les données dans le fichier PDF.
J'ai essayé aussi d'obtenir le PrintWriter, fermez-la pour ouvrir la OutputStream (ne fonctionne pas) ou la couleur (ni).
Tout d'aider avec une solution d'utiliser tout que peut afficher les données dans un fichier pdf.
Merci beaucoup!
Le fichier JSP tente d'ouvrir PrintWriter lorsqu'il démarre. Alors, quand j'envoie la commande au fichier jsp via ActionMapping.findforward la JSP ouvre le PrintWriter et commence à montrer le JSP. J'ai résolu ce problème en n'allant pas n'importe où avec mon findforward. Donc, il n'existe pas de fichier JSP à charger (il n'y a rien à charger) et le code PDF (via OutputStream) va à la page sans avoir à charger un fichier jsp et parce que, sans chargement PrintWriter.
OriginalL'auteur Random | 2010-01-15
Vous devez vous connecter pour publier un commentaire.
Serait utile de voir la trace de la pile.
Vous pouvez essayer d'exécuter un test de cohérence mais d'abord: Modifier le code de simplement écrire une chaîne statique (hello world) pour la ServletOutputStream et définir type de contenu text/html. Que les qui devrait fonctionner:
HTH
Non, je pense que l'on peut être ouvert:
http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletResponse.html#getOutputStream()
Sont que vous essayez d'appeler getWriter() après avoir écrit à l'outputstream? Si vous êtes, alors c'est pourquoi vous obtenez la illegalstateexception.Je crois que je comprends maintenant, Que l'outputStream écrit le pdf, le programme reste des finitions d'aller à la actionmapping.findforward (à ma jsp). Et le jsp écrit avec le PrintWriter. Je pense que là est le problème et pourquoi maintenant, je peux voir mon pdf et avoir de l'Exception levée de toute façon. Je pourrais essayer de ne pas aller n'importe où avec le actionmapping donc il n'y a pas d'Exception pour l'utilisation de PrintWriter.
Et ça y est, c'est mon lat stacktrace: 15-ène-2010 14:09:48 org.apache.jambes de force.d'action.ActionMapping findForward ADVERTENCIA: Impossible de trouver le " en avant. Il n'y a pas d'Exception; mais je me demande comment cette programmation s'inscrit dans les bonnes pratiques... (comme je suposse qu'il n'a tout simplement pas)
OriginalL'auteur simonlord
Quelques idées:
OriginalL'auteur Jim Rush
Comment exactement est le code invoquée? À en juger par la stacktrace ressembler à celle de l'exécution de la classe Java avec le
handle
méthode à l'aide de scriptlets à l'intérieur d'un fichier JSP (leinicio2.jsp
pour être précis). Après que la classe Java a écrit le rapport à laOutputStream
, le fichier JSP continuer avec le reste de la sortie du fichier lui-même (y compris les espaces!), ce qui revient implicitement à invoquer lagetWriter()
de l'écrire à la réaction. Exactement ce que serait la cause d'unIllegalStateException
que vous êtes confronté à maintenant, quand legetOutputStream()
déjà été appelé avant dans la classe Java.Il est bon que le code Java a été placé dans une classe Java, mais cela ne signifie pas que vous pouvez toujours utiliser JSP pour l'appeler. La JSP ne doit pas contenir une seule ligne de code Java. JSP est lui-même comme étant une technologie d'affichage de la sortie. Pour résoudre ce tous, juste un Struts classe de l'action (ou un
HttpServlet
) que vous pouvez appeler par un HTML<form>
ou<a>
.OriginalL'auteur BalusC