2016-07-17 12 views
1

私は応じPDFビューを作成しようとする結合ビューの理解、この私が持っているtutorial春MVC:

controller

@Controller 
public class UserController { 

    @Autowired 
    UserDao userDao; 

    @RequestMapping(value = "/user_pdf", method = RequestMethod.GET, headers = "Accept=application/pdf") 
    public ModelAndView usersPdf(@ModelAttribute("model") ModelMap model) { 
     return new ModelAndView("pdfView", "listBooks", userDao.getAll()); 
    } 
} 

I持ってservlet configuration

<context:component-scan base-package="ua.epam.spring.hometask" /> 
<context:annotation-config/> 

<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 
    <property name="cache" value="true"/> 
    <!--<property name="prefix" value="/WEB-INF/ftl"/>--> 
    <property name="suffix" value=".ftl"/> 
</bean> 

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 
    <property name="templateLoaderPath" value="/WEB-INF/ftl/"/> 
</bean> 

<bean id="PdfRevenueSummary" 
     class="ua.epam.spring.hometask.view.UserPdfView"> 
</bean> 

そして、私はpdf builderを持っています:どのように仕事を結合ん

  1. @Component 
    public class UserPdfView extends AbstractPdfView { 
    
        protected void buildPdfDocument(Map model, 
                Document document, PdfWriter writer, HttpServletRequest req, 
                HttpServletResponse resp) throws Exception { 
    
         User user = (User) model.get("command"); 
    
         Paragraph header = new Paragraph(new Chunk("Generate Pdf USing Spring Mvc",FontFactory.getFont(FontFactory.HELVETICA, 30))); 
         Paragraph by = new Paragraph(new Chunk("Author " + user.getFirstName() + " " + user.getLastName(),FontFactory.getFont(FontFactory.HELVETICA, 20))); 
    
         document.add(header); 
         document.add(by); 
    
        } 
    
    } 
    
    は確かに私はweb.xml

    質問に適切な<servlet-mapping>を作ったのですか?チュートリアルから私は今、ControllerからPDF view

  2. のリンケージがあることがわかります。私のコードを修正する方法を教えてください。今404 error codeを見て、私はheaders = "Accept=application/pdf"を削除するとき、私はそれがFreeMarkerViewResolver

+0

'ModelAndView'はModelオブジェクトをテンプレートビューに挿入するため、テンプレート内でモデルデータにバインドするアクセスを許可します。あなたはそれについて何を理解していないのですか? –

+0

私は 'FreeMarkerViewResolver'も持っています。私は '' Spring'がどの '' viewresolver''をどのように選択するかを理解していません –

+0

FTL拡張で終わるものは最初のviewResolverに移動しますサーブレットの設定で –

答えて

1

Acceptヘッダは、クライアント(つまりブラウザ)によって指定されるべきでそれを解決しようと見ます。 @RequestMappingアノテーションでは、要求に一致する対応するproduces属性を指定する必要があります。基本的に、注釈はpostmanAcceptヘッダを指定するようなものを使用し、そのメソッドをテストするにはAccept=application/pdf

@RequestMapping(value = "/user_pdf", method = RequestMethod.GET, produces = "application/pdf") 

で要求を一致させるために、次のようになります。

pdfビューを解決するには、ビューリゾルバを設定する必要があります。チュートリアルでは、それは(あなたのスニペットに欠けている)この部分です:

<bean class="org.springframework.web.servlet.view.XmlViewResolver"> 
    <property name="location"> 
     <value>/WEB-INF/spring-pdf-views.xml</value> 
    </property> 
</bean> 

このBeanは、あなたが望むの責任豆のための設定が含まれている/WEB-INF/spring-pdf-views.xmlファイルを持っていることを宣言します。しかし、あなたは追加のファイルを作成しないようにBeanNameViewResolverを設定することができます(以下の柔軟なソリューションが、選択はあなたです):

<bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/> 

を(今、彼らは矛盾している)ビュー豆IDとしてコントローラメソッドでまったく同じビュー名を返すように注意してください。

<bean id="PdfRevenueSummary" class="ua.epam.spring.hometask.view.UserPdfView"/> 

ので、あなたはあなたの例で

return new ModelAndView("PdfRevenueSummary", "listBooks", userDao.getAll()); 

もう一つの問題を返すことになっているUserPdfViewクラスのおそらくBeanを2回インスタンス化されることを示します。これは、XML構成で宣言され、多分コンポーネントスキャンによってピックアップされます@Componentのアノテーションのためです

+0

お返事ありがとうございます!それは事を明らかにする。しかし、とにかく私は例外 'javax.servlet.ServletException:サーブレットの名前' user_pdf 'でビューを解決できませんでした –

+0

そして、私が 'FreeMakerView'に接続しているすべてのものをコメントアウトすると、404エラーコードが表示されます何らかの理由で私を '/ pdfView'にリダイレクトします。何が起こっていますか? –

+0

ビューリゾルバの設定に関する情報を回答に追加しました。 –