1.引入jar包(我这里使用的是 struts2-json-plugin-2.3.16.1.jar , 我的struts2为2.3.16.1,配合正常)
2.创建返回Json数据的Actionpublic class JsonTestAction extends BaseAction { private ClassesManager classesManagerImpl; private String message; private int a; private List<Classes> classes; private List<String> classesNames; private List<String> classesNamesAndIds; @JSON(serialize=false) public ClassesManager getClassesManagerImpl() { return classesManagerImpl; } public void setClassesManagerImpl(ClassesManager classesManagerImpl) { this.classesManagerImpl = classesManagerImpl; } @JSON(serialize=true") public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } @JSON(serialize=true, name="intNum") public int getA() { return a; } public void setA(int a) { this.a = a; } @JSON(serialize=true) public List<Classes> getClasses() { return classes; } public void setClasses(List<Classes> classes) { this.classes = classes; } @JSON(serialize=true) public List<String> getClassesNames() { return classesNames; } public void setClassesNames(List<String> classesNames) { this.classesNames = classesNames; } @JSON(serialize=true) public List<String> getClassesNamesAndIds() { return classesNamesAndIds; } public void setClassesNamesAndIds(List<String> classesNamesAndIds) { this.classesNamesAndIds = classesNamesAndIds; } }
其中name:表示自定义序列化json的名字(不指定的话默认为Field的名字); serialize: 这个属性是否需要序列化为json,默认为true, 不需要的要指定为false
还有一个属性时format ,用于格式化Date类型,默认值为:"yyyy-MM-dd'T'HH:mm:ss"
3.配置struts.xml
<!-- Struts2 Json 测试类 --> <package name="jsonTest" namespace="/" extends="json-default"> <action name="jsonTestAction" class="com.hebeu.web.action.JsonTestAction"> <result name="success" type="json"> <!-- 上标签用于对json的一些定义,name属性可取:excludeProperties代表排除Action中的哪些属性,排除多个属性时,使用逗号进行分隔(即不需要序列化的属性) --> <!-- includeProperties 代表排除Action中的哪些属性,排除多个属性时,使用逗号进行分隔(即不需要序列化的属性) --> <!-- excludeProperties和includeProperties ,那么excludeProperties的优先级要高 --> <!-- root //代表从哪里开始序列化<param name="root">person</param> person对应的可以是一个属性,也可以是一个对象,也可以是一个集合 --> <!-- 当在这里定义后,只会将person进行序列化,如果person是一个对象,则会将person对象中所有的getter方法都进行序列化 --> </result> </action> </package>
4.前端jquary请求
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script> <script type="text/javascript"> $(function(){ $("#basic").click(function(){ $.ajax({ type:"POST", url:"jsonTest/jsonTestAction!basic", dataType:"json", success:function(data){ alert("" + data.meaage + "---" + data.intNum); } }); })
5.注意事项:
在使用SSH架构中,若使用了open session in view 模式,当序列化Object对象为json的时候,会获取Object中所有getter方法的域,可能会发出大量的sql语句,解决办法:
1.创建一个DTO对象(仅包含前端所需内容),然后使用hql的new语句查询
public List<Json_Classes> selectJsonClassesByTutorId(String tutorId) { Session session = sessionFactory.getCurrentSession(); return session.createQuery("select new com.hebeu.dto.Json_Classes(c.id, c.name) from Classes c, Tutors_classes tc where c.id = tc.cla.id and tc.tutor.id = '" + tutorId + "'").list(); }
<param name=""></param>相关属性配置(我没有配置成功,但是肯定有相应的方法,因为我在配置的过程中总会起作用,但是达不到想要的效果,所以果断采取了第一种方式。)
6.jquary-ajax回调错误函数:
当使用ajax异步操作数据库,如更新、查询对象的时候,当出现异常时,需要手动指定状态码以使返回的status为错误,从而调用error回调函数,否则会调用success回调函数
<result name="error" type="httpheader"><param name="status">404</param></result>