天天看點

bboss mvc 對象自動轉換為json響應請求淺析

bbossgroups mvc 對象自動轉換為json響應請求功能淺析

bbossgroups mvc 對象自動轉換為json響應請求有兩種使用方式

方式一 服務端指定響應datatype為json,将傳回對象直接轉換為json資料傳回到用戶端

方式二 用戶端請求中的datatype為json,則将傳回對象直接轉換為json資料傳回到用戶端

如果要使用對象轉json資料功能,必須在bboss-mvc.xml檔案中的httpMessageConverters節點中配置以下jackson轉換器:

<property class="org.frameworkset.http.converter.json.MappingJacksonHttpMessageConverter"/>      

下面分别講述兩種方法的使用方法。

自bbossgroups 3.2版本以來,我們可以直接在服務端的控制方法的ResponseBody注解指定傳回資料類型(目前支援兩種方式:json和String),我們來看服務端控制器方法的編寫方式:

public @ResponseBody(datatype = "json")
	AjaxResponseBean deleteRequester(
			@RequestParam(name = "service_requester_id") String service_requester_id,
			HttpServletResponse response) throws Exception {
		AjaxResponseBean ajaxResponseBean = new AjaxResponseBean();
		try {
			requesterService.deleteRequester(service_requester_id);
			ajaxResponseBean.setStatus("success");

		} catch (Exception e) {
						ajaxResponseBean.setStatus("error");
			if (e.getMessage() != null
					&& e.getMessage().indexOf("constraint") > 0) {
								ajaxResponseBean.setData("存在關聯資料,不能删除!");
			} else {
				ajaxResponseBean.setE(e.getMessage());
			}
		}
		return ajaxResponseBean;
	}      

我們再看一下用戶端如果通過請求與該控制器方法相對應的url來得到相對應的json對象:

var service_requester_id = cks.eq(0).val();								
							$.post(
								'deleteRequester.page',
								{
									"service_requester_id" : service_requester_id
								},	
								function(responseText, textStatus) {	
									alert(responseText.data);					alert(responseText.status);												});
      

我們在看一下将被轉換為json資料的java對象AjaxResponseBean :

package org.ffameworkset.mvc;

import java.io.Serializable;

public class AjaxResponseBean implements Serializable {
	//狀态,success表示成功,error表示失敗
	private String status;
	
	//資訊
	private String data;
	
	private String e;
	
	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	public String getData() {
		return data;
	}
	public void setData(String data) {
		this.data = data;
	}
	public String getE() {
		return e;
	}
	public void setE(String e) {
		this.e = e;
	}
}
      

這種方式是由客服端送出請求時,指定資料類型dataType為json,先看用戶端代碼:

//緩存二級菜單
var moduleItems = new Array();
$.ajax({
			type : "post",
			dataType : "json",
			data : {
				"moduleId" : moduleId
			},
			url : "menu/queryMenu.page",
			cache : false,
			async : false,// ajax同步标志修改
			error : function() {
				window.parent.locaction="logout.jsp";				
			},
			success : function(data) {
				//将傳回的資料放入js緩存
				moduleItems[moduleId] = data;				
			}
		});
      

周遊json list對象及通路對象屬性:

//從js緩存中讀取二級菜單資訊
	var data = moduleItems[moduleId];
	if (data.length > 0) {
		$.each(data, function(i) {
			
			var span = $("<span style=\"cursor:pointer;\" class=\"func\" id=\""
					+ this.id
					+ "Node"
					+ "\" title=\""
					+ this.name
					+ "\" dataType='iframe' dataLink='"
					+ this.pathU
					+ "' iconImg='images/msn.gif'>"
					+ this.name
					+ "</span>").click(function() {		
											
						//如果二級菜單項被點選,則觸發主體内容視窗的addTab函數				
						var name = $(this).attr('title');
						var dataLink = $(this).attr('dataLink');
						addTab(name, dataLink);
					});
				
					var currentdiv = $("<div style=\"width:100px;float:left;margin-left:5px;\"><div style=\"text-align:center;\"><img src=\""
							+ this.imageUrl
							+ "\" width=\"25\" height=\"25\" style=\"cursor:pointer;\" on></div><div style=\"margin-top:1px;text-align:center;color:#000;\" id=\""
							+ this.id + "\"></div></div>");
					currentdiv.find("img").click(function() {
						currentdiv.find("span").click();							
					});
					$(".bj").append(currentdiv);
					$("#" + this.id).append(span);
					
		});
	}	      

url : "menu/queryMenu.page"指定了要請求的控制器方法,下面我們就看一下該控制器方法的實作代碼:

public @ResponseBody
	List<MenuItemU> queryMenu(@RequestParam(name = "moduleId") String moduleId,
			HttpServletRequest request) {
				try {
			AccessControl control = AccessControl.getAccessControl();
			
			String modulePath = control.getCurrentSystemID()
					+ "::menu://sysmenu$root/" + moduleId + "$module";
			MenuHelper menuHelper = new MenuHelper(
					control.getCurrentSystemID(), control);
			ItemQueue itemQueue = menuHelper.getSubItems(modulePath);
						List<MenuItemU> list = new ArrayList<MenuItemU>();
			for (int i = 0; itemQueue != null && i < itemQueue.size(); i++) {
				Item item = itemQueue.getItem(i);
				if (!item.isUsed()) {
					continue;
				}
				String contextPath = request.getContextPath();
				String url = MenuHelper.getMainUrl(contextPath, item,
						(java.util.Map) null);
				MenuItemU menuItemU = new MenuItemU();
				menuItemU.setId(item.getId());
				menuItemU.setName(item.getName());
				menuItemU.setImageUrl(item.getMouseclickimg());
				menuItemU.setPathU(url);
				menuItemU.setType("item");
				list.add(menuItemU);
			}

				return list;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}      

該方法通過@ResponseBody注解聲明告訴mvc架構直接将類型為 List<MenuItemU>的傳回值轉換為json資料(因為用戶端指定響應資料類型為json)響應到用戶端。

MenuItemU對象的結構如下:

public class MenuItemU {
	private String id;
	private String name;
	private String imageUrl;
	private String pathU;
	private String type;
	
	private boolean hasSon;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getImageUrl() {
		return imageUrl;
	}
	public void setImageUrl(String imageUrl) {
		this.imageUrl = imageUrl;
	}
	public String getPathU() {
		return pathU;
	}
	public void setPathU(String pathU) {
		this.pathU = pathU;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public boolean getHasSon() {
		return hasSon;
	}
	public void setHasSon(boolean hasSon) {
		this.hasSon = hasSon;
	}
}      

到此bboss mvc中的控制器對對象轉換為json資料的自動處理功能就介紹完了,如有疑問還請留言讨論。