现在的位置: 首页 > 综合 > 正文

SpringMVC 中整合JSON、XML视图二

2012年08月13日 ⁄ 综合 ⁄ 共 3663字 ⁄ 字号 评论关闭

上篇文章介绍了程序整合的准备工作、结合MarshallingView视图完成jaxb2转换XML、xStream转换XML工作,这次将介绍castor、jibx转换XML。

还有MappingJacksonView用Jackson转换JSON,自己拓展AbstractView定义Jsonlib的视图完成JSON-lib转换JSON。

上一篇文章:http://www.cnblogs.com/hoojo/archive/2011/04/29/2032571.html

 

四、 Castor转换XML

1、 castor可以通过一个mapping.xml文件对即将转换的Java对象进行描述,然后可以将Java对象按照描述的情况输出XML内容。利用castor转换xml需要添加如下jar包:

clip_image002

如果你还不清楚castor,可以阅读:

for csblogs:http://www.cnblogs.com/hoojo/archive/2011/04/25/2026819.html

for csdn:http://blog.csdn.net/IBM_hoojo/archive/2011/04/25/6360916.aspx

2、 你需要在dispatcher.xml中添加castor的相关视图,配置如下:

<-- 

    继承MarshallingView重写locateToBeMarshalled方法

         解决对象添加到ModelAndView中转换后的xml是BindingResult信息的bug 

-->

<bean name="castorMarshallingView" class="com.hoo.veiw.xml.OverrideMarshallingView">

    <property name="marshaller">

        <bean class="org.springframework.oxm.castor.CastorMarshaller">  

            <property name="mappingLocations">

                <array>

                    <value>classpath:mapping.xml</value>

                </array>

            </property>

            <property name="encoding" value="UTF-8"/>

           </bean>  

    </property>

</bean>

mapping.xml配置

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN" "http://castor.org/mapping.dtd">

<mapping>

    <class name="com.hoo.entity.Account" auto-complete="true">   

        <map-to xml="Account"/>

 

        <field name="id" type="integer">

            <bind-xml name="id" node="attribute" />

        </field>

 

        <field name="name" type="string">

            <bind-xml name="name" node="element" />

        </field>

 

        <field name="email" type="string">

            <bind-xml name="email" node="element" />

        </field>

 

        <field name="address" type="string">

            <bind-xml name="address" node="element" />

        </field>

 

        <field name="brithday" type="com.hoo.entity.Brithday">

            <bind-xml name="生日" node="element" />

        </field>

    </class>

 

    <class name="com.hoo.entity.Brithday" auto-complete="true">

        <map-to xml="brithday" />

 

        <field name="brithday" type="string">

            <bind-xml name="brithday" node="attribute" />

        </field>

    </class>

    

    <class name="com.hoo.entity.MapBean" auto-complete="true">

        <field name="map" collection="map">

            <bind-xml name="map">

                <class name="org.exolab.castor.mapping.MapItem">

                    <field name="key" type="java.lang.String">

                        <bind-xml name="key" node="attribute" />

                    </field>

                    <field name="value" type="com.hoo.entity.Account">

                        <bind-xml name="value" auto-naming="deriveByClass"/>

                    </field>

                </class>

            </bind-xml>

        </field>

    </class>

    

    <class name="com.hoo.entity.ListBean" auto-complete="true">

        <map-to xml="listBean"/>

        <field name="list" collection="arraylist" type="com.hoo.entity.Account">

            <bind-xml name="beans" auto-naming="deriveByClass"/>

        </field>

        <field name="name" type="string"/>

    </class>

    

    <class name="com.hoo.entity.AccountArray" auto-complete="true">

        <map-to xml="account-array"/>

        <field name="size" type="int" />

        <field name="accounts" collection="array" type="com.hoo.entity.Account">

            <bind-xml name="accounts" auto-naming="deriveByClass"/>

        </field>

    </class>

</mapping>

关于mapping.xml配置的介绍,你可以参考http://www.cnblogs.com/hoojo/archive/2011/04/25/2026819.html

这篇文章的第三栏目。

3、 在使用Spring的MarshallingView的时候,转换的xml结果有时候会带有BindingResult对象的信息。所以解决办法是重写MarshallingView里面的locateToBeMarshalled方法,这样就可以解决了。下面是重新MarshallingView的class代码:

package com.hoo.veiw.xml;

 

import java.util.Map;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.BeansException;

import org.springframework.oxm.Marshaller;

import org.springframework.validation.BindingResult;

import org.springframework.web.servlet.view.xml.MarshallingView;

 

/**

 * <b>function:</b>继承MarshallingView,重写locateToBeMarshalled方法;

 * 解决对象添加到ModelAndView中,转换后的xml是BindingResult信息的bug

 * @author hoojo

 * @createDate 2010-11-29 下午05:58:45

 * @file OverrideMarshallingView.java

 * @package com.hoo.veiw.xml

 * @project Spring3

 * @blog http://blog.csdn.net/IBM_hoojo

 * @email hoojo_@126.com

 * @version 1.0

 */

public class OverrideMarshallingView extends MarshallingView {

抱歉!评论已关闭.