2012-02-22 15 views
6

Jestem początkującym z Spring MVC, ale jestem pod wrażeniem możliwości.Jak uzyskać zawartość PDF (obsługiwaną przez metodę sterownika Spring MVC) pojawiać się w nowym oknie

Używam wersji 3.1.0-RELEASE i muszę wyświetlić plik PDF w odpowiedzi na formularz: przesłanie formularza.

Oto (mały) kod pisałem w kontrolerze:

@RequestMapping(value = "new_product", method = RequestMethod.POST, params = "print") 
@ResponseBody 
public void saveAndShowPDF(ModelMap map, ShippingRequestInfo requestInfo, HttpServletRequest request, HttpServletResponse httpServletResponse) throws IOException { 
    saveProductChanges(map, requestInfo, request, httpServletResponse); 
    httpServletResponse.setContentType("application/pdf"); 
    byte[] pdfImage = productService.getPDFImage(requestInfo.getRequestId()); 
    httpServletResponse.getOutputStream().write(pdfImage); 
} 

Ten kod wysyła bajt PDF [] powrót do pierwotnego okna.

Jak wyświetlić plik PDF w oddzielnym oknie, aby nadal wyświetlać w innym oknie pierwotne okno przeglądarki? Najlepiej byłoby, gdyby plik PDF był wyświetlany za pomocą programu do przeglądania plików PDF (Adobe Reader, FoxIt itp.), Ale dobrze byłoby, gdyby plik PDF pojawił się w oddzielnym oknie przeglądarki.

EDIT postanowiłem ustawić Content-Dyspozycja taka, że ​​przeglądarka Pojawi się zapisać/otwarte okno, w którym użytkownik może otworzyć Adobe (z utratą stronę główną przeglądarki)

httpServletResponse.setHeader("Content-Disposition","attachment;filename=cool.pdf"); 

Dzięki wszystkim !

Odpowiedz

5

Podaj target="_blank" w tagu form:form, który przesyła formularz.

+0

Target = "_ blank" (mam nadzieję) wyświetli plik PDF w osobnym oknie. Jeśli zwrócę do metody kontrolera ciąg znaków, czy mogę mieć oryginalne okno renderować nową stronę (wraz z plikiem PDF w nowym oknie)? –

+1

Skarbie ... Nie mogę użyć target = "__ puste", ponieważ formularz ma wiele przycisków type = "submit", a ja tylko ten przycisk potrzebuje odpowiedzi (PDF) w osobnym oknie. Postanowiłem ustawić Content-Disposition, aby otworzyć okno zapisu, w którym użytkownik może otworzyć Adobe (z utratą głównej strony przeglądarki). httpServletResponse.setHeader ("Content-Disposition", "attachment; filename = product.pdf "); –

0

byłoby to zrobić po stronie klienta z niektórych javascript np ,:

<a href="http://www.myWebApp.com/somePdf.pdf" onclick="window.open('http://www.myWebApp.com/somePdf.pdf'); return false;" target="_blank">My Super Awesome Docment</a> 

(substytut z ładnej jQuery Ness jako pożądanej) Jeśli chcesz coś jeszcze się wydarzy w głównym oknie po prostu nie zwracaj wartość false ze zdarzenia onClick i pozwól, aby zwykłe kliknięcie zrobiło cokolwiek, co chcesz, aby stało się w głównym oknie. Nie musisz decydować, czy pliki PDF będą otwierane w oknie przeglądarki, czy w Adobe, to konfiguracja komputer użytkownika.

-

Również po prostu jako rzecz Wiosna, @ResponseBody na metodzie void nie ma żadnego sensu. @ResponseBody mówi sprężyście, aby jako typ odpowiedzi użył typu powrotu metody. Oznacza to, że zwrócisz byte[] z metody i pozwolisz wiosną na przekształcenie jej w odpowiedź serwletu. Zamiast bezpośrednio pisać odpowiedź wewnątrz metody

1

Skorzystaj z @RequestMapping produ, aby zdefiniować typ odpowiedzi.

@RequestMapping(value = doc/{docId}, method = RequestMethod.GET, produces = "application/pdf") 
@ResponseBody 
public byte[] getDocument(@PathVariable("docId") String docId) throws Exception 
{ 
    return service.getDocument(docId); 
} 
Powiązane problemy