2009-07-24 3 views
3

Ich versuche, Jasper Reports (v3.5.2) zu verwenden, um Berichte in PDF/HTML für eine Webanwendung im Browser zu generieren und zu drucken. Diese Webanwendung verwendet bereits JSF (Woodstock) für das Frontend und EJB 3 (mit JPA und Hibernate als Persistenzanbieter für eine MySQL-Datenbank).Wo passt in Jasper Reports - Frontend oder Geschäft?

Meine Frage ist - wo sollte der Code für die Generierung der Jasper-basierten Berichte sein? Ich bin total verwirrt darüber. Soll ich es in das JSF-Frontend legen? Oder sollte es ein "Bericht" -Modul in der Geschäftslogik als Session-Beans sein?

Ich würde denken, dass der richtige Ort dafür die Business Tier als separates Modul ist. Ich würde eine Geschäftsmethode mit dem Namen des Berichts, der Eingabeparameterzuordnung und dem Berichtsformat als Parameter der Geschäftsmethode aufrufen und die erzeugte pdf/html als Gegenleistung erhalten, die ich dann an den Browser senden könnte. Bin ich damit richtig?

Können Sie ein Muster vorschlagen, wie Sie dies tun können?

Außerdem möchte ich EJBQL verwenden, da ich JPA bereits verwende.

Danke.

Antwort

3

Wenn Sie den Jaspis als Teil Ihres Ohrs einbetten möchten, dann würde ich sagen, dass es in einer Klasse abstrahiert werden sollte, wie Sie vorschlagen. Ich bin mir nicht sicher, ob ich ein separates EJB dafür erstellen würde, es sei denn, Sie führen Clustering durch oder laden die Berichtsgenerierung anderweitig auf eine andere JVM um, oder Sie haben spezielle Transaktionsanforderungen.

Eine weitere gebräuchliche Option besteht darin, einen vollständig separaten Berichtsserver zu verwenden, den Sie remote aufrufen würden, und der die Interaktion mit dem Benutzer übernimmt.

1

Ich gehe hier davon aus, dass 'Code zum Generieren' = 'API, um den Bericht aufzurufen'.

Sie werden meistens wollen dies über die Präsentationsebene tun - wo Bibliotheken in der Kontaktpräsentationsebene die Ressourcen im Bericht Tiere nur den Bericht bis auf den Benutzer zu streamen.

Auf diese Weise werden vermeiden Sie die Daten der Hand zu halten und halten sie über Stufen vorbei, bevor Sie es tatsächlich an den Anforderer (Client) senden

0

Es gibt ein paar Möglichkeiten, um dies zu realisieren. Sie könnten den Bericht von einer verwalteten Bean generieren, beachten Sie, dass Sie den JSF-Lebenszyklus dafür möglicherweise durch Aufrufen von facesContext.responseComplete() unterbrechen müssen, bevor Sie den Bericht in Ihrem Browser rendern.

Eine andere Lösung könnte darin bestehen, über ein Berichtsservlet zu verfügen, das Sie über eine JSF-Ausgabeverknüpfung aufrufen können, wenn Sie einen Bericht generieren müssen.

Verwandte Themen