在前台调用时,返回JSON情况一般是以下几种
1、返回success 或 fail,+ 提示信息,如::{returnCode:'success'}
2、返回1+ 提示信息中替换部分内容,显示个性提示,如:{returnCode:'fail',msg:'xxxx账户已登录'}
3、返回1+2+ 特殊对象,如: {returnCode:'fail',msg:'xxxx账户已登录',obj:{name:'张三',age:14}}
设计一个ReturnMsg公用类,实现以上返回对象的通用,在使用时直接将 new ReturnMsg 转换成Json输出即可。
本例中使用了Jfinal中定义的PropKit进行配置文件读取 ,以及renderJson将对象作为Json输出,脱离Jfinal环境可以使用其他方式实现以上两步:
1、配置文件定义,messageConfig.properties,内容如下:
(PS:将提示信息替换,即可适配多语言提示)
#自定义错误配置文件
err0000=操作失败
err0001=登录失败,用户名或密码错误
err0002=获取用户信息失败,请稍后再试
err0003=当前用户账号已登录,请先退出再登录
err0004=用户未登录或登录已过期,请重新登录
err0005=获取用户菜单失败
err0006=请输入登录账户ID
err0007=请输入登录密码
err0008=账号没有此操作权限
err0009=【[m1]】名称已存在,请重新输入
err0010=存在非法的请求数据,操作终止
err0011=传递参数错误,操作失败
err0012=用户编号【[m1]】已存在,请重新输入
err0013=登录账号【[m1]】已存在,请重新输入
err0014=登录账号【[m1]】已被停止使用,请与管理员联系
err0015=文件【[m1]】上传失败
err0016=请先删除该商品分类下面的所有商品
err0017=商品编号【[m1]】已存在,请重新输入
#自定义提示信息
msg0000=操作成功
ReturnMsg.java
/**
* 前台反馈消息Bean,用于renderJson返回给前台时使用
* @author 作者 左浩(James)E-mail: 25708164@qq.com
* @date 创建时间:2016年10月7日 下午11:03:48
* @version 1.0
* @since
*/
package com.vstation.common.pojo;
import java.io.Serializable;
import com.jfinal.kit.PropKit;
public class ReturnMsg implements Serializable {
private static final long serialVersionUID = 1L;
private String returnCode = ""; //返回值
private String msgCode = ""; //消息代码
private String msg = ""; //错误信息
private Object obj = null; //其他对象
protected final static Object NULL = null; //空Object对象
protected final static String[] NULLARRAY = {}; //空String数组
/**
* 简单返回对象
* @param returnCode
* @param msgCode
*/
public ReturnMsg(String returnCode,String msgCode){
this(returnCode,msgCode,null,NULL,"");
}
/**
* 简单对象,带扩展信息
* @param returnCode
* @param msgCode
* @param exceptionString
*/
public ReturnMsg(String returnCode,String msgCode,String exceptionString){
this(returnCode,msgCode,exceptionString,NULL,"");
}
/**
* 带扩展返回对象
* @param returnCode
* @param msgCode
* @param returnObject
*/
public ReturnMsg(String returnCode,String msgCode,Object returnObject){
this(returnCode,msgCode,null,returnObject,"");
}
/**
* 带替换字符或返回对象
* @param returnCode
* @param msgCode
* @param exceptionString
* @param returnObj
*/
public ReturnMsg(String returnCode,String msgCode,String exceptionString,String...replaceWord){
this(returnCode,msgCode,exceptionString,NULL,replaceWord);
}
/**
* 带替换字符串和附加对象
* @param returnCode 返回码 success or fail
* @param msgCode 消息code,与messageConfig.properties中匹配
* @param exceptionString java异常信息,可配置是否显示
* @param returnObj 需要附加返回的对象,没有则为null
* @param replaceWord 替换消息模板内容数组,分别替换 [m1],[m2],[m3]....
*/
public ReturnMsg(String returnCode,String msgCode,String exceptionString,Object returnObj,String...replaceWord){
String extendMsg = ""; //外部扩展信息
String returnMsg = PropKit
.use(PropKit.get("messageConfigFileName",
"messageConfig.properties")).get(msgCode);
//通过msgCode匹配信息配置文件的提示信息
if (PropKit.getBoolean("isShowExtMsg", false) && exceptionString!=null) { //前台是否显示java exception error 信息,默认false
extendMsg =",Java throws Error:" +exceptionString;
}
if(replaceWord.length>0){
for (int i = 0; i < replaceWord.length; i++) {
if(!"".equals(replaceWord[i]) && replaceWord[i]!=null){
String m = "[m"+(i+1)+"]";
returnMsg = returnMsg.replace(m, replaceWord[i]);
}
}
}
this.setMsgCode(msgCode);
this.setReturnCode(returnCode);
this.setMsg(returnMsg+extendMsg);
this.setObj(returnObj==null?NULLARRAY:returnObj);
}
public String getReturnCode() {
return returnCode;
}
public void setReturnCode(String returnCode) {
this.returnCode = returnCode;
}
public String getMsgCode() {
return msgCode;
}
public void setMsgCode(String msgCode) {
this.msgCode = msgCode;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
}
调用实例:
1、简单返回:
renderJson(new ReturnMsg("success","msg0000")); //成功
renderJson(new ReturnMsg("fail","err0002")); //失败
2、抛出错误信息:
try{
.........
} catch (Exception e) {
log.error(e.toString());
renderJson(new ReturnMsg("fail","err0000", StrExtendKit.stringToJson(e.toString(), true)));
}
其中: StrExtendKit.stringToJson 方法时自定义的将e.toString()中JSON敏感字符替换,代码如下:
public static String stringToJson(String s, boolean isJSjson) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '\'':
if (isJSjson) {
sb.append("\\\'");
} else {
sb.append("\'");
}
break;
case '\"':
if (!isJSjson) {
sb.append("\\\"");
} else {
sb.append("\"");
}
break;
case '\\':
sb.append("\\\\");
break; // 如果不处理单引号,可以释放此段代码,若结合StringDanYinToJSON()处理单引号就必须注释掉该段代码
case '/':
sb.append("\\/");
break;
case '\b':
sb.append("\\b");
break;// 退格
case '\f':
sb.append("\\f");
break;// 走纸换页
case '\n':
sb.append("\\n");
break;// 换行
case '\r':
sb.append("\\r");
break;// 回车
case '\t':
sb.append("\\t");
break;// 横向跳格
default:
sb.append(c);
}
}
return sb.toString();
}