欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring 3 mvc中返回pdf,json,xml等不同的view

程序员文章站 2022-03-08 20:15:58
...
源:http://jackyrong.iteye.com/blog/1874918
评:
  spring mvc就是好,特别是rest风格的话,一个
org.springframework.web.servlet.view.ContentNegotiatingViewResolver就可以根据不同的场景返回不同的view了,比如返回json,xml,pdf等.马上看代码实现

先是一个简单的pojo
Java代码  收藏代码

    package com.hmkcode.vo; 
      
    import javax.xml.bind.annotation.XmlRootElement; 
      
    @XmlRootElement(name = "person") 
    public class Person { 
      
        private int id; 
        private String name; 
        public int getId() { 
            return id; 
        } 
        public void setId(int id) { 
            this.id = id; 
        } 
        public String getName() { 
            return name; 
        } 
        public void setName(String name) { 
            this.name = name; 
        } 
        public String toString(){ 
            return "ID: "+id+" - Name: "+name; 
        } 
      
    } 


   注意使用@XmlRootElement标签之。

然后是controller:
 
Java代码  收藏代码

    @Controller 
    public class MyController { 
      
        @RequestMapping("/view") 
        public Person getPerson(Model model){ 
            Person person = new Person(); 
            person.setId(1); 
            person.setName("test"); 
            model.addAttribute("person",person); 
            return person; 
        } 



  然后分别假设要导出为PDF的view,引入著名的itext了;
Java代码  收藏代码

    public class PdfView extends AbstractPdfView { 
      
        protected void buildPdfDocument( 
            Map model, 
            Document doc, 
            PdfWriter writer, 
            HttpServletRequest req, 
            HttpServletResponse resp) 
            throws Exception { 
      
          
            Person person = (Person) model.get("person"); 
            doc.add( new Paragraph(person.toString())); 
      
        } 


   这里演示简单往itext中写入一个输出而已;

然后是web.xml:

Java代码  收藏代码

    <servlet> 
            <servlet-name>springmvc</servlet-name> 
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
            <load-on-startup>1</load-on-startup> 
        </servlet> 
      
        <servlet-mapping> 
            <servlet-name>springmvc</servlet-name> 
            <url-pattern>/rest/*</url-pattern> 
        </servlet-mapping> 


  最核心的配置来了:

Java代码  收藏代码

       <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
    <property name="order" value="1" /> 
    <property name="mediaTypes"> 
      <map> 
         <entry key="json" value="application/json" /> 
         <entry key="xml" value="application/xml" /> 
         <entry key="pdf" value="application/pdf" /> 
     
      </map> 
    </property> 
     
    <property name="defaultViews"> 
      <list> 
        <!-- JSON View --> 
        <bean 
          class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"> 
        </bean> 
        <!--  XML view --> 
          <bean class="org.springframework.web.servlet.view.xml.MarshallingView"> 
          <constructor-arg> 
              <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"> 
                 <property name="classesToBeBound"> 
                  <list> 
                     <value>com.test.Person</value> 
                  </list> 
                 </property> 
              </bean> 
          </constructor-arg> 
        </bean> 
        <!--  PDF view --> 
        <bean class="com.test.PdfView"> 
     
          </bean> 
       </list> 
    </property> 
    <property name="ignoreAcceptHeader" value="true" /> 
     
    t;/bean> 


 
   可以看到,其中使用的是:
org.springframework.web.servlet.view.ContentNegotiatingViewResolver,对其pdf,xml.json进行分别的view设置,JSON用的是著名的jackyson去解析了;

最后,通过rest风格的地址,比如http://localhost/view/view.json,返回json;
http://localhost/view/view.pdf,则导出到pdf,http://localhost/view/view.xml,
返回前端就xml了,真的十分方便呀