首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring :理解视图绑定

Spring :理解视图绑定
EN

Stack Overflow用户
提问于 2016-07-17 17:14:30
回答 1查看 237关注 0票数 1

我尝试根据这个教程创建pdf视图

我有controller

代码语言:javascript
复制
@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());
    }
}

我有servlet configuration

代码语言:javascript
复制
    <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

代码语言:javascript
复制
@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中做了适当的web.xml

问题:

  1. 绑定是如何工作的?从教程中我看到现在有从ControllerPDF view的链接
  2. 请帮我看看怎么修正我的代码。我现在看到了404 error code,当我删除headers = "Accept=application/pdf"时,我看到它试图用FreeMarkerViewResolver来解决它
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-17 18:01:37

Accept头应该由客户端(即浏览器)指定。@RequestMapping注释应该指定相应的produces属性来匹配请求。基本上,注释应该如下所示,以便将请求与Accept=application/pdf匹配

代码语言:javascript
复制
    @RequestMapping(value = "/user_pdf", method = RequestMethod.GET, produces = "application/pdf")

要测试该方法,请使用类似于邮递员指定Accept头的内容。

为了解决您的pdf视图,您需要配置一个视图解析器。在本教程中,它是这个部分(在您的片段中缺失):

代码语言:javascript
复制
<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文件,其中包含负责视图的bean的配置。但是,您可以配置BeanNameViewResolver以避免创建额外的文件(不太灵活的解决方案,但选择是您的):

代码语言:javascript
复制
<bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/>

注意,在控制器方法中返回与视图-bean id完全相同的视图名(现在它们不一致)。因为

代码语言:javascript
复制
<bean id="PdfRevenueSummary" class="ua.epam.spring.hometask.view.UserPdfView"/>

你应该回来

代码语言:javascript
复制
return new ModelAndView("PdfRevenueSummary", "listBooks", userDao.getAll());

示例中的另一个问题是,UserPdfView类的bean可能会被实例化两次:它是在xml中声明的,并且可能由于@Component注释而被组件扫描所获取。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38423856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档