Struts2+jquary ajax方式返回json并解析

*Struts2 提供了 JSON Plugin,以方便的返回json数据,使用这个插件我们不再需要使用json依赖包自己创建josn对象。主要步骤:

1.引入jar包(我这里使用的是 struts2-json-plugin-2.3.16.1.jar   ,  我的struts2为2.3.16.1,配合正常)

2.创建返回Json数据的Action
public 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>





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值