首页 > 技术文章 > 工作的时候用到spring返回xml view查到此文章亲测可用

mrcharles 2015-12-10 12:49 原文

   spring mvc就是好,特别是rest风格的话,一个
org.springframework.web.servlet.view.ContentNegotiatingViewResolver就可以根据不同的场景返回不同的view了,比如返回json,xml,pdf等.马上看代码实现

先是一个简单的pojo

Java代码  收藏代码
  1. package com.hmkcode.vo;  
  2.    
  3. import javax.xml.bind.annotation.XmlRootElement;  
  4.    
  5. @XmlRootElement(name = "person")  
  6. public class Person {  
  7.    
  8.     private int id;  
  9.     private String name;  
  10.     public int getId() {  
  11.         return id;  
  12.     }  
  13.     public void setId(int id) {  
  14.         this.id = id;  
  15.     }  
  16.     public String getName() {  
  17.         return name;  
  18.     }  
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.     public String toString(){  
  23.         return "ID: "+id+" - Name: "+name;  
  24.     }  
  25.    
  26. }  


   注意使用@XmlRootElement标签之。

然后是controller:
  

Java代码  收藏代码
  1. @Controller  
  2. public class MyController {  
  3.    
  4.     @RequestMapping("/view")  
  5.     public Person getPerson(Model model){  
  6.         Person person = new Person();  
  7.         person.setId(1);  
  8.         person.setName("test");  
  9.         model.addAttribute("person",person);  
  10.         return person;  
  11.     }  



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

Java代码  收藏代码
  1. public class PdfView extends AbstractPdfView {  
  2.    
  3.     protected void buildPdfDocument(  
  4.         Map model,  
  5.         Document doc,  
  6.         PdfWriter writer,  
  7.         HttpServletRequest req,  
  8.         HttpServletResponse resp)  
  9.         throws Exception {  
  10.    
  11.        
  12.         Person person = (Person) model.get("person");  
  13.         doc.add( new Paragraph(person.toString()));  
  14.    
  15.     }  


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

然后是web.xml:

Java代码  收藏代码
  1. <servlet>  
  2.         <servlet-name>springmvc</servlet-name>  
  3.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4.         <load-on-startup>1</load-on-startup>  
  5.     </servlet>  
  6.    
  7.     <servlet-mapping>  
  8.         <servlet-name>springmvc</servlet-name>  
  9.         <url-pattern>/rest/*</url-pattern>  
  10.     </servlet-mapping>  


  最核心的配置来了:

Java代码  收藏代码
  1.    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">  
  2. <property name="order" value="1" />  
  3. <property name="mediaTypes">  
  4.   <map>  
  5.      <entry key="json" value="application/json" />  
  6.      <entry key="xml" value="application/xml" />  
  7.      <entry key="pdf" value="application/pdf" />  
  8.   
  9.   </map>  
  10. </property>  
  11.   
  12. <property name="defaultViews">  
  13.   <list>  
  14.     <!-- JSON View -->  
  15.     <bean  
  16.       class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">  
  17.     </bean>  
  18.     <!--  XML view -->  
  19.       <bean class="org.springframework.web.servlet.view.xml.MarshallingView">  
  20.       <constructor-arg>  
  21.           <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">  
  22.              <property name="classesToBeBound">  
  23.               <list>  
  24.                  <value>com.test.Person</value>  
  25.               </list>  
  26.              </property>  
  27.           </bean>  
  28.       </constructor-arg>  
  29.     </bean>  
  30.     <!--  PDF view -->  
  31.     <bean class="com.test.PdfView">  
  32.   
  33.       </bean>  
  34.    </list>  
  35. </property>  
  36. <property name="ignoreAcceptHeader" value="true" />  
  37.   
  38. 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了,真的十分方便呀

推荐阅读