2016-07-17 11 views
1

Ich versuche nach pdf-Ansicht erstellen diese tutorialSpring MVC: Verständnis Sicht Bindung

Ich habe 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()); 
    } 
} 

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

Und Ich habe pdf builder:

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

    } 

} 

Sicherlich habe ich entsprechende <servlet-mapping> in web.xml

Fragen:

  1. Wie Arbeit nicht bindend? Aus dem Tutorial sehe ich, dass es jetzt eine Verknüpfung von Controller zu PDF view

  2. Bitte helfen Sie mir, um zu sehen, wie Sie meinen Code beheben. Ich sehe 404 error code jetzt, und wenn ich headers = "Accept=application/pdf" entferne ich sehe es sollte es zu lösen versucht, mit FreeMarkerViewResolver

+0

'ModelAndView' fügt ein Model-Objekt in eine Vorlagenansicht ein und ermöglicht somit den Zugriff in der Vorlage auf die Modelldaten. Was verstehst du da nicht? –

+0

Ich habe auch 'FreeMarkerViewResolver'. Ich verstehe nicht, wie "Spring" entscheidet, welche 'Viewresolver' zu wählen –

+0

Alles, was in der FTL-Erweiterung endet, geht an die erste ViewResolver, die in Übereinstimmungen in der Servlet-Konfiguration –

Antwort

1

Accept Header vom Kunden angegeben werden (das heißt Browser). @RequestMapping Annotation sollte entsprechende produces Attribut angeben, um die Anfrage zu entsprechen. Grundsätzlich sollte die Anmerkung wie folgt aussehen eine Anforderung entsprechen mit Accept=application/pdf

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

Um dieses Verfahren die Verwendung so etwas wie postman zu testen Angabe Accept Header.

Um Ihre PDF-Ansicht zu lösen, möchten Sie einen View Resolver konfigurieren. Im Tutorial ist es dieser Teil (in Ihrem Schnipsel fehlt):

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

Diese Bohne erklärt, dass Sie eine /WEB-INF/spring-pdf-views.xml-Datei, die eine Konfiguration für Bohnen verantwortlich für Ansichten enthält. Sie können jedoch BeanNameViewResolver konfigurieren zusätzliche Datei zu vermeiden, Erstellen von (weniger flexible Lösung, aber Wahl ist Ihre):

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

Achten Sie genau die gleiche Ansicht Name in Controller-Methode als View-bean id zurückzukehren (jetzt sind sie inkonsequent) . Da

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

Sie

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

Ein weiteres Problem mit Ihrem Beispiel zurückkehren sollen, ist, dass wahrscheinlich die Bohne von UserPdfView Klasse wird zweimal instanziiert: es wird im XML-Konfiguration erklärt und nahm vielleicht durch die Komponente Scan nach oben wegen @Component Annotation.

+0

Danke für die Antwort! Es macht die Dinge klar. Aber irgendwie bekomme ich die Ausnahme 'javax.servlet.ServletException: Konnte die Sicht mit dem Namen 'pdfView' im Servlet mit dem Namen 'user_pdf' nicht auflösen. –

+0

Und wenn ich alle mit' FreeMakerView 'verbundenen Dinge auskommentiere, zeige es mir 404 Fehlercode und für Irgendein Grund leitet mich zu '/ pdfView' weiter. Was passiert? –

+0

Ich habe in der Antwort Informationen zur Konfiguration des View-Resolvers hinzugefügt. –