*Struts2 提供了 JSON Plugin,以方便的返回json数据,使用这个插件我们不再需要使用json依赖包自己创建josn对象。主要步骤:
序列化为json需要在对应的getter方法上加@JSON
要求包必须继承 json-default
2.可以在struts配置文件中通过
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;
}
}
序列化为json需要在对应的getter方法上加@JSON
其中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>
要求包必须继承 json-default
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();
}
2.可以在struts配置文件中通过
<param name=""></param>相关属性配置(我没有配置成功,但是肯定有相应的方法,因为我在配置的过程中总会起作用,但是达不到想要的效果,所以果断采取了第一种方式。)
6.jquary-ajax回调错误函数:
当使用ajax异步操作数据库,如更新、查询对象的时候,当出现异常时,需要手动指定状态码以使返回的status为错误,从而调用error回调函数,否则会调用success回调函数
<result name="error" type="httpheader"><param name="status">404</param></result>