2012-02-22 7 views
6

私はSpring MVCを初心者にしていますが、機能にはかなり感銘を受けたです。新しいウィンドウに表示される(Spring MVCコントローラメソッドから提供される)PDFコンテンツを取得する方法

私は3.1.0-RELEASEを使用しています。私はフォームに応じてPDFを表示する必要があります:フォームの提出。ここで

は、私は、コントローラに書いた(小)コードです:

@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); 
} 

このコードは、元のウィンドウに[] PDFのバイトを送信します。

PDFを別のウィンドウで表示するにはどうすれば元のブラウザウィンドウに他のコンテンツを表示させることができますか?ベストは、クライアントのPDFビュープログラム(Adobe Reader、FoxItなど)を使用してPDFを表示することですが、別のブラウザウィンドウにPDFが表示されても問題ありません。私はブラウザは、ユーザーが(メインブラウザのページを失うと)のAdobeを開くことができます保存/オープンボックスが表示されますようにContent-処分を設定することを決め

EDIT

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

みんなありがとう!

答えて

5

フォームを提出するform:formタグにtarget="_blank"を指定してください。

+0

target = "_ blank"はPDFを別のウィンドウに表示します(うまくいけば)。コントローラメソッドでStringを返すようにすれば、元のウィンドウに新しいページ(新しいウィンドウにPDFと共に)をレンダリングできますか? –

+1

ダーン...フォームに複数のtype = "submit"ボタンがあり、このボタンだけが別のウィンドウでレスポンス(PDF)を必要とするため、target = "__ blank"を使用できません。 私は、ユーザーがAdobeを開くことができるセーブ/オープンボックスをもたらすようにContent-Dispositionを設定することを決めました。(メインブラウザページを失って) httpServletResponse.setHeader( "Content-Disposition"、 "attachment; filename = product.pdf "); –

0

あなたは、メインウィンドウで発生する他の何かをしたい場合は、単にないいくつかのjavascript例えば,:

<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> 

(必要に応じて、かなりのjQueryネスで代用)とクライアント側でそれを行うだろうonClickイベントからfalseを返し、メインウィンドウで何をしたいのかを定期的にクリックさせます。

ブラウザウィンドウまたはAdobeでPDFを開くと、あなたに任されません。ユーザのコンピュータ。

-

また、ちょうど春の事として、void法上の@ResponseBodyはどんな意味がありません。 @ResponseBodyは、メソッドの戻り値の型を応答として使用するようSpringに指示しています。つまり、メソッドからbyte[]を返し、それをサーブレットレスポンスに変換することでSpringを処理します。

1

@RequestMapping produceを使用して応答タイプを定義します。

@RequestMapping(value = doc/{docId}, method = RequestMethod.GET, produces = "application/pdf") 
@ResponseBody 
public byte[] getDocument(@PathVariable("docId") String docId) throws Exception 
{ 
    return service.getDocument(docId); 
} 
関連する問題