`
gzwfdy
  • 浏览: 84544 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

dhtmlxgrid 2.0 标准版 dwr实现增、删、改、查

阅读更多
dhtmlxgrid 2.0支持四种类型的数据:

- xml;- csv;- json;- javascript array.

下面只介绍xml,json类型的数据。

一、xml类型

dhtmlxgrid要求的xml格式如下:
<rows>
  <head>
    <beforeInit>
      <call command="methodName"><param>string value</param></call>
    </beforeInit>
    <afterInit>
      <call command="methodName"><param>string value</param></call>
    </afterInit>
    <column width="50" type="ed" align="right" color="white"   sort="str">Sales</column>
    <column width="80" type="co" align="left" sort="str">Shipping
      <option value="1">1 Day</option>
      <option value="7">1 Week</option>
      ...
    </column>
    ...
    <settings>
      <colwidth>%</colwidth>
    </settings>
  </head>
  <row id="1">
    <cell>text</cell>
  ...
  </row>
  ...
</rows>


<column>标签之间的文字是就是列标题

column 可用的属性有:
  • width - 宽,单位是像素
  • type - 列的类型
  • align - 单元格文本对齐方式
  • color - 列背景颜色
  • sort - 排序类型
  • id - 列id,可选
  • hidden -这个是专业版的属性,标准版不能使用。
  • 设置列宽的单位是%,不设置默认是像素px。

    <row>表格中的每一行,要有唯一的id值属性。
    <cell>一行中的一个单元格。
    xml中常用的字符串常量
    package com.javaeye.gzwfdy.util;
    public class Constants {
    	public static final String XML_VERSION 
                             = "<?xml version=\"1.0\" encoding=\"GBK\"?>";
    
    	public static final String XML_ROWS_BEGIN = "<rows>";
    
    	public static final String XML_ROWS_END = "</rows>";
    
    	public static final String XML_HEAD_BEGIN = "<head>";
    
    	public static final String XML_HEAD_END = "</head>";
    
    	public static final String XML_AFTERINIT_BEGIN = "<afterInit>";
    
    	public static final String XML_AFTERINIT_END = "</afterInit>";
    	
    	public static final String XML_BEFOREINIT_BEGIN = "<beforeInit>";
    	
    	public static final String XML_BEFOREINIT_END = "</beforeInit>";
    	
    	public static final String XML_CELL_BEGIN = "<cell>";
    
    	public static final String XML_CELL_END = "</cell>";
    }


    下面这个类构造列,单元格,设置皮肤
    package com.javaeye.gzwfdy.util;
    public class GridXmlBuilder {
    
    	public static StringBuffer createColumnXML(String width, String type,
    			String align, String sort, String text){
    		StringBuffer xml = new StringBuffer();
    		if(width == null)
    			width = "0";
    		if(text == null)
    			text = "";
    		xml.append("<column ");
    		xml.append("width=\"").append(width).append("\" ");
    		xml.append("type=\"").append(type).append("\" ");
    		xml.append("align=\"").append(align).append("\" ");
    		xml.append("sort=\"").append(sort).append("\"");
    		xml.append(">");
    		xml.append(text);
    		xml.append("</column>");
    		return xml;
    	}
    	
    	public static StringBuffer setGridSkin(String skin){
    		StringBuffer xml = new StringBuffer();
    		xml.append(Constants.XML_BEFOREINIT_BEGIN);
    		xml.append("<call command=\"setSkin\">").append("<param>").append(skin).append("</param></call>");
    		xml.append(Constants.XML_BEFOREINIT_END);
    		return xml;
    		
    	}
    	
    	public static StringBuffer createGridCellXml(Object value) {
    		if (value == null)
    			value = "";
    		StringBuffer xml = new StringBuffer();
    		xml.append(Constants.XML_CELL_BEGIN);
    		xml.append(value);
    		xml.append(Constants.XML_CELL_END);
    		return xml;
    	}
    }
    


    下面这个类包含查询,删除,保存方法。里面有返回json数据的方法
    package com.javaeye.gzwfdy.service.manager;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import net.sf.json.JSONObject;
    
    import org.apache.log4j.Logger;
    
    import com.javaeye.gzwfdy.dao.hibernate.IDhtmlxGridDAO;
    import com.javaeye.gzwfdy.dao.hibernate.po.Dhtmlxgrid;
    import com.javaeye.gzwfdy.exception.DAOException;
    import com.javaeye.gzwfdy.exception.HandleException;
    import com.javaeye.gzwfdy.service.interfaceManager.IDhtmlxGridManager;
    import com.javaeye.gzwfdy.util.Constants;
    import com.javaeye.gzwfdy.util.GridXmlBuilder;
    import com.javaeye.gzwfdy.vo.GridData;
    import com.javaeye.gzwfdy.vo.Rows;
    
    public class DhtmlxGridManagerImpl implements IDhtmlxGridManager {
    	/**
    	 * Logger for this class
    	 */
    	private static final Logger logger = Logger
    			.getLogger(DhtmlxGridManagerImpl.class);
    	
    	private IDhtmlxGridDAO dhtmlxGridDAO;
    	
    	/**
    	 * @param dhtmlxGridDAO the dhtmlxGridDAO to set
    	 */
    	public void setDhtmlxGridDAO(IDhtmlxGridDAO dhtmlxGridDAO) {
    		this.dhtmlxGridDAO = dhtmlxGridDAO;
    	}
    
    	public String getInitGridXML() throws HandleException {
    		return this.BuildGridXML();
    	}
    
    	private String BuildGridXML()
    	{
    		StringBuffer xml = new StringBuffer();
    		xml.append(Constants.XML_VERSION);
    		xml.append(Constants.XML_ROWS_BEGIN);
    		xml.append(createHeadXML());
    		xml.append(Constants.XML_ROWS_END);
    		logger.info("构造表格XML为:" + xml);
    		return xml.toString();
    	}
    	
    	private StringBuffer createHeadXML(){
    		StringBuffer xml = new StringBuffer();
    		xml.append(Constants.XML_HEAD_BEGIN);
    		//xml.append(GridXmlBuilder.setGridSkin("modern"));
    		//xml.append(GridXmlBuilder.setGridSkin("gray "));
    		//xml.append(GridXmlBuilder.setGridSkin("xp"));
    		//xml.append(GridXmlBuilder.setGridSkin("mt"));
    		xml.append(GridXmlBuilder.setGridSkin("light"));
    		//xml.append(GridXmlBuilder.setGridSkin("clear"));
    		xml.append(GridXmlBuilder.createColumnXML("20", "ch", "left", "int", ""));
    		xml.append(GridXmlBuilder.createColumnXML("730", "ed", "left", "str", "消息"));
    		xml.append(GridXmlBuilder.createColumnXML("90", "ed", "left", "str", "来源"));
    		xml.append(GridXmlBuilder.createColumnXML("0", "ro", "left", "str", ""));
    		xml.append(Constants.XML_HEAD_END);
    		return xml;
    	}
    
    	public String getJsonData() throws HandleException {
    		List<Dhtmlxgrid> list = null;
    		List<GridData> gridDataList = new ArrayList<GridData>();
    		Rows rows = new Rows();
    		try {
    			 list = this.dhtmlxGridDAO.getData();
    		} catch (DAOException e) {
    			// TODO: handle exception
    		}
    		for (Dhtmlxgrid dhtmlxgrid : list) {
    			gridDataList.add(this.BuildeJsonData(dhtmlxgrid));
    		}
    		rows.setRows(gridDataList);
                       /**
                       * 需要json-lib-2.2.2-jdk15.jar、ezmorph-1.0.5.jar
                      */
    		JSONObject object = JSONObject.fromObject(rows);
    		return object.toString();
    	}
    	
    	private GridData BuildeJsonData(Dhtmlxgrid dhtmlxgrid){
    		GridData griddata = new GridData();
    		String id = dhtmlxgrid.getId().toString();
    		String[] data = {"0",dhtmlxgrid.getMessage(),dhtmlxgrid.getInfosrc(),dhtmlxgrid.getId().toString()};
    		griddata.setId(id);
    		griddata.setData(data);
    		return griddata;
    	}
    
    	public String getXMLData() throws HandleException {
    		StringBuffer xml = new StringBuffer();
    		xml.append(Constants.XML_VERSION);
    		xml.append(Constants.XML_ROWS_BEGIN);
    		List<Dhtmlxgrid> list = null;
    		try {
    			 list = this.dhtmlxGridDAO.getData();
    		} catch (DAOException e) {
    			e.printStackTrace();
    			throw new HandleException("getXMLData错误");
    		}
    		for (Dhtmlxgrid dhtmlxgrid2 : list) {
    			xml.append(this.buildXMLData(dhtmlxgrid2));
    		}
    		xml.append(Constants.XML_ROWS_END);
    		logger.info("XML为:" + xml);
    		return xml.toString();
    	}
    	
    	private StringBuffer buildXMLData(Dhtmlxgrid dhtmlxgrid){
    		StringBuffer xml = new StringBuffer();
    		xml.append("<row id=\"" + dhtmlxgrid.getId().intValue() + "\">");
    		xml.append(GridXmlBuilder.createGridCellXml("0"));
    		xml.append(GridXmlBuilder.createGridCellXml(dhtmlxgrid.getMessage()));
    		xml.append(GridXmlBuilder.createGridCellXml(dhtmlxgrid.getInfosrc()));
    		xml.append(GridXmlBuilder.createGridCellXml(dhtmlxgrid.getId()));
    		xml.append("</row>");
    		return xml;
    	}
    
    	public boolean saveData(List<Dhtmlxgrid> dhtmlxgrid) throws HandleException {
    		try {
    			for (Dhtmlxgrid dhtmlxgrid2 : dhtmlxgrid) {
    				if (dhtmlxgrid2.getId() == null) {
    					//dhtmlxgrid2.setId(null);
    					this.dhtmlxGridDAO.saveData(dhtmlxgrid2);
    				} else
    					this.dhtmlxGridDAO.updateData(dhtmlxgrid2);
    			}
    		} catch (DAOException e) {
    			e.printStackTrace();
    			throw new HandleException("保存错误");
    		}
    		return true;
    	}
    
    	public boolean deleteData(List<Dhtmlxgrid> dhtmlxgrid) throws HandleException {
    		try {
    			for (Dhtmlxgrid dhtmlxgrid2 : dhtmlxgrid) {
    				this.dhtmlxGridDAO.deleteData(dhtmlxgrid2);
    			}
    		} catch (DAOException e) {
    			e.printStackTrace();
    			throw new HandleException("删除失败");
    		}
    		return true;
    	}
    }
    

    Dhtmlxgrid是hibernate的数据库映射文件,再次为了方便直接在Service层使用,在实际项目中不推进这样做。Dhtmlxgrid代码如下
    package com.javaeye.gzwfdy.dao.hibernate.po;
    
    
    
    /**
     * Dhtmlxgrid entity. @author MyEclipse Persistence Tools
     */
    
    public class Dhtmlxgrid  implements java.io.Serializable {
    
    
        // Fields    
    
         private Integer id;
         private String message;
         private String infosrc;
    
    
        // Constructors
    
        /** default constructor */
        public Dhtmlxgrid() {
        }
    
        
        /** full constructor */
        public Dhtmlxgrid(String message, String infosrc) {
            this.message = message;
            this.infosrc = infosrc;
        }
    
       
        // Property accessors
    
        public Integer getId() {
            return this.id;
        }
        
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getMessage() {
            return this.message;
        }
        
        public void setMessage(String message) {
            this.message = message;
        }
    
        public String getInfosrc() {
            return this.infosrc;
        }
        
        public void setInfosrc(String infosrc) {
            this.infosrc = infosrc;
        }
    }
    

    GridData、Rows都是构造json字符串用到的。这里返回字符串到前台,但是不能直接使用,还要转成json对象。我没想到更好的办法做这件事情
    GridData代码:
    package com.javaeye.gzwfdy.vo;
    
    
    public class GridData {
    
    	private String id;
    	private String[] data;
    	/**
    	 * @return the id
    	 */
    	public String getId() {
    		return id;
    	}
    	/**
    	 * @param id the id to set
    	 */
    	public void setId(String id) {
    		this.id = id;
    	}
    	/**
    	 * @return the data
    	 */
    	/**
    	 * @return the data
    	 */
    	public String[] getData() {
    		return data;
    	}
    	/**
    	 * @param data the data to set
    	 */
    	public void setData(String[] data) {
    		this.data = data;
    	}
    }
    

    Rows代码:
    package com.javaeye.gzwfdy.vo;
    
    import java.util.List;
    
    public class Rows {
    
    	private List rows;
    
    	/**
    	 * @return the rows
    	 */
    	public List getRows() {
    		return rows;
    	}
    
    	/**
    	 * @param rows the rows to set
    	 */
    	public void setRows(List rows) {
    		this.rows = rows;
    	}
    }
    

    服务层接口代码IDhtmlxGridManager:
    package com.javaeye.gzwfdy.service.interfaceManager;
    
    import java.util.List;
    
    import com.javaeye.gzwfdy.dao.hibernate.po.Dhtmlxgrid;
    import com.javaeye.gzwfdy.exception.HandleException;
    
    public interface IDhtmlxGridManager {
    
    	/**
    	 * 初始化表头
    	 * @return
    	 * @throws HandleException
    	 */
    	public String getInitGridXML() throws HandleException;
    	
    	/**
    	 * json数据
    	 * @return
    	 * @throws HandleException
    	 */
    	public String getJsonData() throws HandleException;
    	
    	/**
    	 * XML数据
    	 * @return
    	 * @throws HandleException
    	 */
    	public String getXMLData() throws HandleException;
    	/**
    	 * 
    	 * <p>
    	 * Discription: 
    	 * </p>
    	 * @author guozhw 	
    	 * @param dhtmlxgrid
    	 * @return
    	 * @throws HandleException
    	 * @since
    	 * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
    	 */
    	public boolean saveData(List<Dhtmlxgrid> dhtmlxgrid) throws HandleException;
    	/**
    	 * 
    	 * <p>
    	 * Discription: 
    	 * </p>
    	 * @author guozhw 	
    	 * @return
    	 * @throws HandleException
    	 * @since
    	 * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
    	 */
    	public boolean deleteData(List<Dhtmlxgrid> dhtmlxgrid) throws HandleException;
    }
    

    HandleException代码:
    package com.javaeye.gzwfdy.exception;
    
    public class HandleException extends Exception {
    	
    	public HandleException() {
    		super();
    	}
    
    	public HandleException(String message) {
    		super(message);
    	}
    }
    
    

    dao层接口代码:
    package com.javaeye.gzwfdy.dao.hibernate;
    
    import java.util.List;
    
    import com.javaeye.gzwfdy.dao.hibernate.po.Dhtmlxgrid;
    import com.javaeye.gzwfdy.exception.DAOException;
    
    public interface IDhtmlxGridDAO {
    
    	/**
    	 * 
    	 * <p>
    	 * Discription: 查询方法
    	 * </p>
    	 * @author guozhw 	
    	 * @return
    	 * @throws DAOException
    	 * @since
    	 * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
    	 */
    	public List<Dhtmlxgrid> getData() throws DAOException;
    	/**
    	 * 
    	 * <p>
    	 * Discription: 保存
    	 * </p>
    	 * @author guozhw 	
    	 * @param grid
    	 * @throws DAOException
    	 * @since
    	 * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
    	 */
    	public void saveData(Dhtmlxgrid grid) throws DAOException;
    	
    	/**
    	 * 
    	 * <p>
    	 * Discription: 更新
    	 * </p>
    	 * @author guozhw 	
    	 * @param grid
    	 * @throws DAOException
    	 * @since
    	 * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
    	 */
    	public void updateData(Dhtmlxgrid grid) throws DAOException;
    	/**
    	 * 
    	 * <p>
    	 * Discription: 删除
    	 * </p>
    	 * @author guozhw 	
    	 * @param grid
    	 * @throws DAOException
    	 * @since
    	 * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
    	 */
    	public void deleteData(Dhtmlxgrid grid) throws DAOException;
    	
    
    }
    

    dao接口实现类:
    package com.javaeye.gzwfdy.dao.hibernate;
    
    import java.util.List;
    
    import org.springframework.dao.DataAccessException;
    
    import com.javaeye.gzwfdy.dao.hibernate.po.Dhtmlxgrid;
    import com.javaeye.gzwfdy.exception.DAOException;
    import com.javaeye.gzwfdy.util.AbstractHbmBaseDao;
    
    public class DhtmlxGridDAOImpl extends AbstractHbmBaseDao implements IDhtmlxGridDAO {
    
    	
    	@SuppressWarnings("unchecked")
    	public List<Dhtmlxgrid> getData() throws DAOException {
    		return this.findAll(Dhtmlxgrid.class);
    	}
    
    	public void saveData(Dhtmlxgrid grid) throws DAOException {
    		try {
    			this.save(grid);
    		} catch (DataAccessException e) {
    			e.printStackTrace();
    			throw new DAOException(e.getMessage());
    		}
    		
    	}
    	
    	public void updateData(Dhtmlxgrid grid) throws DAOException {
    		try {
    			this.update(grid);
    		} catch (DataAccessException e) {
    			e.printStackTrace();
    			throw new DAOException(e.getMessage());
    		}
    		
    	}
    
    	public void deleteData(Dhtmlxgrid grid) throws DAOException {
    		try {
    			this.delete(grid);
    		} catch (DataAccessException e) {
    			e.printStackTrace();
    			throw new DAOException(e.getMessage());
    		}
    		
    	}
    
    }
    
    

    dao异常类:
    package com.javaeye.gzwfdy.exception;
    
    public class DAOException extends Exception {
    	
    	public DAOException(String message) {
    		super(message);
    	}
    
    	public DAOException() {
    		super();
    	}
    }
    
    

    到此后台代码都已经完成了。前台使用dwr远程调用这些方法。spring就不写出来。dwr.xml如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
    <dwr>
    	<allow>
    <create creator="spring" javascript="dhtmlxGridManager"
    			scope="request">
    			<param name="beanName" value="dhtmlxGridManager" />
    			<include method="getXMLData"/>
    			<include method="saveData"/>
    			<include method="getInitGridXML"/>
    			<include method="deleteData"/>
    	  </create>
    <convert converter="bean" 
    			match="com.javaeye.gzwfdy.dao.hibernate.po.Dhtmlxgrid" >
    		</convert>
    </allow>
    
    	<signatures>
    		<![CDATA[
    		import java.util.List;
    		import java.util.Map;
    		import com.javaeye.gzwfdy.dao.hibernate.po.Dhtmlxgrid;
    		dhtmlxGridManager.saveData(List<Dhtmlxgrid>);
    		dhtmlxGridManager.deleteData(List<Dhtmlxgrid>);
    	  ]]>
    	</signatures>
    
    </dwr>
    

    jsp代码也不列出来了,增加操作对应的js方法为add(),删除操作对应js方法del(),保存save();jsp页面中body中加入onload="initGrid('<%=contextPath %>');"
    String contextPath = request.getContextPath();
    js代码如下:
    /**
     * 页面初始化
     */
    //window.onload = initGrid;
    
    var mygrid;
    var path;
    // 初始化表格
    function initGrid(contextPath)
    {
      path = contextPath;
      dhtmlxGridManager.getInitGridXML(function(xml)
      {
        mygrid = new dhtmlXGridObject('gridbox');
        mygrid.setImagePath(contextPath + "/dhtmlxSuite/dhtmlxGrid/codebase/imgs/");
        mygrid.init();
        mygrid.parse(xml, loadData, "xml");
    	//mygrid.attachHeader("A,B,C",["text-align:right;","text-align:left;","text-align:center"],"ewrtwertrt"); 
    	//mygrid.adjustColumnSize(1);
        //mygrid.enableLightMouseNavigation(true);
        //mygrid.enableKeyboardSupport(true);
        //mygrid.lockRow(1, false);
      });
    }
    
    function loadData()
    {
      dhtmlxGridManager.getXMLData(function(data)
      {
        mygrid.clearAll();
        mygrid.parse(data);
      });
      /**
      
       * dhtmlxGridManager.getJsonData(function(data)
      
       {
      
       mygrid.parse(eval('(' + data + ')'), "json");
      
       });
      
       */
      
    }
    
    /**
     * 新增按钮处理
     */
    function add()
    {
      mygrid.addRow(mygrid.uid(), getAddRowString(), getRowIndex());
    }
    
    function getRowIndex()
    {
      var selectedId = mygrid.getSelectedId();
      var rowIndex;
      if (selectedId) 
      {
        rowIndex = mygrid.getRowIndex(selectedId) + 1;
      }
      else 
      {
        rowIndex = mygrid.getRowsNum();
      }
      return rowIndex;
    }
    
    function getAddRowString()
    {
      return "0,,";
    }
    
    /**
     * 保存按钮处理
     */
    function save()
    {
      var changedRowIds = getChangedRowIds();
      if (changedRowIds && changedRowIds.length == 0) 
        return;
      var dhtmlxgrid = buildObjects(changedRowIds);
      dhtmlxGridManager.saveData(dhtmlxgrid, function callback(data)
      {
        if (data) 
        {
          alert("保存成功!");
        }
        else 
        {
          alert("保存失败!");
        }
        loadData();
        changedRowIds = new Array();
      });
    }
    
    /**
     * 获取表格所有改变过的行编号
     */
    function getChangedRowIds()
    {
      var changedRowIds = new Array();
      var allRowIds = mygrid.getAllItemIds().split(",");
      for (var i = 0; i < mygrid.getRowsNum(); i++) 
      {
        for (var j = 0; j < mygrid.getColumnCount(); j++) 
        {
          if (mygrid.cells(allRowIds[i], j).wasChanged() &&
          !changedRowIds.IsInclude(allRowIds[i])) 
          {
            changedRowIds[changedRowIds.length] = allRowIds[i];
            break;
          }
        }
      }
      return changedRowIds;
    }
    
    function buildObjects(changedRowIds)
    {
      var dhtmlxgrid = new Array();
      for (var i = 0; i < changedRowIds.length; i++) 
      {
        var rowId = changedRowIds[i];
        dhtmlxgrid[dhtmlxgrid.length] = buildObject(rowId);
      }
      return dhtmlxgrid;
    }
    
    function buildObject(rowId)
    {
      return {
        id: mygrid.cells(rowId, mygrid.getColumnCount() - 1).getValue(),
        message: mygrid.cells(rowId, 1).getValue(),
        infosrc: mygrid.cells(rowId, 2).getValue()
      };
    }
    
    
    //-----------------------
    function getValue(value)
    {
      return value == null || value == 'null' ? "" : value;
    }
    
    Array.prototype.IsInclude = function(value)
    {
      for (var i = 0; i < this.length; i++) 
      {
        var element = this[i];
        if (element == value) 
        {
          return true;
        }
      }
      return false;
    }
    //---------------
    /**
     * 删除按钮处理
     */
    function del()
    {
      var checkedRowIds = getCheckedRowIds();
      if (checkedRowIds && checkedRowIds.length > 0) 
      {
        if (confirm("请确认是否删除所选记录?")) 
        {
          var deletegrid = buildObjects(checkedRowIds);
          dhtmlxGridManager.deleteData(deletegrid, function callback(data)
          {
            if (data) 
            {
              alert("删除成功!");
            }
            else 
            {
              alert("删除失败!");
            }
            loadData();
    		checkedRowIds = new Array();
          });
        }
      }
      else 
      {
        alert("请选中删除记录!");
      }
    }
    
    function getCheckedRowIds()
    {
      var checkedRowIds = new Array();
      var allRowIds = mygrid.getAllItemIds().split(",");
      if (allRowIds) 
      {
        for (var i = 0; i < allRowIds.length; i++) 
        {
          if (mygrid.cells(allRowIds[i], 0).getValue() == 1) 
          {
            checkedRowIds[checkedRowIds.length] = allRowIds[i];
          }
        }
      }
      return checkedRowIds;
    }
    
    
    

    分享到:
    评论
    3 楼 fxiaozj 2012-08-31  
    不知道能不能把JSON写一个通用的,要不然每个entity都得写一个JSON进行转换。
    2 楼 mfkwfc 2012-05-28  
    为什么没看到json数据的格式呢?
    1 楼 exindedan 2011-07-22  
    非常不错的教程,写得也很详细!
    希望能附上源代码!
    赞一个!

    相关推荐

    Global site tag (gtag.js) - Google Analytics