zoukankan      html  css  js  c++  java
  • Java Web返回JSON

    Web项目中经常涉及到AJAX请求返回JSONJSONP数据。JSON数据在server端和浏览器端传输,本质上就是传输字符串,只是这个字符串符合JSON语法格式。浏览器端会依照普通文本的格式接收JSON字符串。终于JSON字符串转成JSON对象通过JavaScript实现。眼下部分浏览器(IE9下面浏览器没有提供)和经常使用的JS都提供了JSON序列化和反序列化的方法。如jQueryAJAX请求能够指定返回的数据格式,包含textjsonjsonpxmlhtml等。

    Webserver端仅仅要把Java对象数据转成JSON字符串。并把JSON字符串以文本的形式通过response输出就可以。

    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.http.HttpServletResponse;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.serializer.SerializerFeature;
    
    /**
     * 
     * Web服务端返回JSON工具类
     * 工具类依赖FastJSON
     * 工具类支持返回JSON和JSONP格式数据
     * @author accountwcx@qq.com
     * 
     */
    public class ResponseJsonUtils {
    	/**
    	 * 默认字符编码
    	 */
    	private static String encoding = "UTF-8";
    	
    	/**
    	 * JSONP默认的回调函数
    	 */
    	private static String callback = "callback";
    	
    	/**
    	 * FastJSON的序列化设置
    	 */
    	private static SerializerFeature[] features =  new SerializerFeature[]{
    		//输出Map中为Null的值
    		SerializerFeature.WriteMapNullValue,
    		
    		//假设Boolean对象为Null。则输出为false
    		SerializerFeature.WriteNullBooleanAsFalse,
    		
    		//假设List为Null。则输出为[]
    		SerializerFeature.WriteNullListAsEmpty,
    		
    		//假设Number为Null。则输出为0
    		SerializerFeature.WriteNullNumberAsZero,
    		
    		//输出Null字符串
    		SerializerFeature.WriteNullStringAsEmpty,
    		
    		//格式化输出日期
    		SerializerFeature.WriteDateUseDateFormat
    	};
    	
    	/**
    	 * 把Java对象JSON序列化
    	 * @param obj 须要JSON序列化的Java对象
    	 * @return JSON字符串
    	 */
    	private static String toJSONString(Object obj){
    		return JSON.toJSONString(obj, features);
    	}
    	
    	/**
    	 * 返回JSON格式数据
    	 * @param response
    	 * @param data 待返回的Java对象
    	 * @param encoding 返回JSON字符串的编码格式
    	 */
    	public static void json(HttpServletResponse response, Object data, String encoding){
    		//设置编码格式
    		response.setContentType("text/plain;charset=" + encoding);
    		response.setCharacterEncoding(encoding);
    		
    		PrintWriter out = null;
    		try{
    			out = response.getWriter();
    			out.write(toJSONString(data));
    			out.flush();
    		}catch(IOException e){
    			e.printStackTrace();
    		}
    	}
    	
    	/**
    	 * 返回JSON格式数据,使用默认编码
    	 * @param response
    	 * @param data 待返回的Java对象
    	 */
    	public static void json(HttpServletResponse response, Object data){
    		json(response, data, encoding);
    	}
    	
    	/**
    	 * 返回JSONP数据,使用默认编码和默认回调函数
    	 * @param response
    	 * @param data JSONP数据
    	 */
    	public static void jsonp(HttpServletResponse response, Object data){
    		jsonp(response, callback, data, encoding);
    	}
    	
    	/**
    	 * 返回JSONP数据,使用默认编码
    	 * @param response
    	 * @param callback JSONP回调函数名称
    	 * @param data JSONP数据
    	 */
    	public static void jsonp(HttpServletResponse response, String callback, Object data){
    		jsonp(response, callback, data, encoding);
    	}
    	
    	/**
    	 * 返回JSONP数据
    	 * @param response
    	 * @param callback JSONP回调函数名称
    	 * @param data JSONP数据
    	 * @param encoding JSONP数据编码
    	 */
    	public static void jsonp(HttpServletResponse response, String callback, Object data, String encoding){
    		StringBuffer sb = new StringBuffer(callback);
    		sb.append("(");
    		sb.append(toJSONString(data));
    		sb.append(");");
    
    		// 设置编码格式
    		response.setContentType("text/plain;charset=" + encoding);
    		response.setCharacterEncoding(encoding);
    
    		PrintWriter out = null;
    		try {
    			out = response.getWriter();
    			out.write(sb.toString());
    			out.flush();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public static String getEncoding() {
    		return encoding;
    	}
    
    	public static void setEncoding(String encoding) {
    		ResponseJsonUtils.encoding = encoding;
    	}
    
    	public static String getCallback() {
    		return callback;
    	}
    
    	public static void setCallback(String callback) {
    		ResponseJsonUtils.callback = callback;
    	}
    }

    /**
     * 在Servlet返回JSON数据
     */
    @WebServlet("/json.do")
    public class JsonServlet extends HttpServlet {
    	private static final long serialVersionUID = 7500835936131982864L;
    
    	/**
    	 * 返回json格式数据
    	 */
    	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		Map<String, Object> data = new HashMap<String, Object>();
    		
    		data.put("date", new Date());
    		data.put("email", "accountwcx@qq.com");
    		data.put("age", 30);
    		data.put("name", "csdn");
    		data.put("array", new int[]{1,2,3,4});
    		
    		ResponseJsonUtils.json(response, data);
    	}
    }

    /**
     * Servlet返回JSONP格式数据
     */
    @WebServlet("/jsonp.do")
    public class JsonpServlet extends HttpServlet {
    	private static final long serialVersionUID = -8343408864035108293L;
    
    	/**
    	 * 请求会发送callback參数作为回调函数,假设没有发送callback參数则使用默认回调函数
    	 */
    	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//client发送的回调函数
    		String callback = request.getParameter("callback");
    		
    		Map<String, Object> data = new HashMap<String, Object>();
    		
    		data.put("date", new Date());
    		data.put("email", "accountwcx@qq.com");
    		data.put("age", 30);
    		data.put("name", "csdn");
    		data.put("array", new int[]{1,2,3,4});
    		
    		if(callback == null || callback.length() == 0){
    			//假设client没有发送回调函数。则使用默认的回调函数
    			ResponseJsonUtils.jsonp(response, data);
    		}else{
    			//使用client的回调函数
    			ResponseJsonUtils.jsonp(response, callback, data);
    		}
    	}
    }

    /**
     * 在Struts2中返回JSON和JSONP
     */
    public class JsonAction extends ActionSupport {
    	private static final long serialVersionUID = 5391000845385666048L;
    	
    	/**
    	 * JSONP的回调函数
    	 */
    	private String callback;
    	
    	/**
    	 * 返回JSON
    	 */
    	public void json(){
    		HttpServletResponse response = ServletActionContext.getResponse();
    		
    		Map<String, Object> data = new HashMap<String, Object>();
    		
    		data.put("date", new Date());
    		data.put("email", "accountwcx@qq.com");
    		data.put("age", 30);
    		data.put("name", "csdn");
    		data.put("array", new int[]{1,2,3,4});
    		
    		ResponseJsonUtils.json(response, data);
    	}
    	
    	/**
    	 * 返回JSONP
    	 */
    	public void jsonp(){
    		HttpServletResponse response = ServletActionContext.getResponse();
    		
    		Map<String, Object> data = new HashMap<String, Object>();
    		
    		data.put("date", new Date());
    		data.put("email", "accountwcx@qq.com");
    		data.put("age", 30);
    		data.put("name", "csdn");
    		data.put("array", new int[]{1,2,3,4});
    		
    		if(callback == null || callback.length() == 0){
    			//假设client没有发送回调函数,则使用默认的回调函数
    			ResponseJsonUtils.jsonp(response, data);
    		}else{
    			//使用client的回调函数
    			ResponseJsonUtils.jsonp(response, callback, data);
    		}
    	}
    
    	public String getCallback() {
    		return callback;
    	}
    
    	public void setCallback(String callback) {
    		this.callback = callback;
    	}
    }

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * Spring MVC返回JSON和JSONP数据
     */
    @Controller
    @RequestMapping("/json")
    public class JsonController {
    	
    	/**
    	 * 返回JSON数据
    	 * @param request
    	 * @param response
    	 */
    	@RequestMapping("/json.do")
    	public void json(HttpServletRequest request, HttpServletResponse response){
    		Map<String, Object> data = new HashMap<String, Object>();
    		
    		data.put("date", new Date());
    		data.put("email", "accountwcx@qq.com");
    		data.put("age", 30);
    		data.put("name", "csdn");
    		data.put("array", new int[]{1,2,3,4});
    		
    		ResponseJsonUtils.json(response, data);
    	}
    	
    	/**
    	 * 返回JSONP数据
    	 * @param callback JSONP的回调函数
    	 * @param request
    	 * @param response
    	 */
    	@RequestMapping("/jsonp.do")
    	public void json(String callback, HttpServletRequest request, HttpServletResponse response){
    		Map<String, Object> data = new HashMap<String, Object>();
    		
    		data.put("date", new Date());
    		data.put("email", "accountwcx@qq.com");
    		data.put("age", 30);
    		data.put("name", "csdn");
    		data.put("array", new int[]{1,2,3,4});
    		
    		if(callback == null || callback.length() == 0){
    			//假设client没有发送回调函数,则使用默认的回调函数
    			ResponseJsonUtils.jsonp(response, data);
    		}else{
    			//使用client的回调函数
    			ResponseJsonUtils.jsonp(response, callback, data);
    		}
    	}
    }



  • 相关阅读:
    Java框架spring学习笔记(十七):事务操作
    Java框架spring 学习笔记(十六):c3p0连接池的配置以及dao使用jdbcTemplate
    Java框架spring 学习笔记(十五):操作MySQL数据库
    Java框架spring 学习笔记(十四):注解aop操作
    Java框架spring 学习笔记(十三):log4j介绍
    Java框架spring 学习笔记(十二):aop实例操作
    Java框架spring 学习笔记(十一):aop相关概念
    Java框架spring 学习笔记(十):bean管理(注解和配置文件混合使用)
    Java框架spring 学习笔记(九):Spring的bean管理(@Required、@Component、@Autowired、@Resource注解)
    Java框架spring 学习笔记(八):注入对象类型属性
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7271979.html
Copyright © 2011-2022 走看看