最近做一个项目遇到一个比较棘手的问题,项目后台采用struts2+Hibernate3+Spring3,前台采用ExtJs4。笔者目前仍是一名大二学生吗,后台框架完全是毫无任何基础,从零学,现学现用。
由此贴出在前后台用JSON字符串进行前后台交互中所出现的问题。前台ExtJs不用多说直接在proxy代理里面写上Action的url即可。最为关键的则是在struts.xml配置文件中。由于再开完全不明白完全不懂,所以在struts.xml的配置中没有单独将json-default和struts-default写入两个package中,而是直接写在了同一个package中,和同伴百度无数仍然没有人给出详细的办法,最终才发现了应该这样写:原因就是命令空间不能相同,因为是不同的estends,否则写入同一个package中则会出现连登陆界面都会出现Not Found 404。(在此class给出的是一个别名,由此采用spring,具体则在applicationContext.xml配置)
<package name="hr" namespace="/" extends="struts-default"> <action name="login" class="loginAction"> <result name="success">index.jsp</result> </action> </package> <package name="json" namespace="/json" extends="json-default"> <action name="titleAction" class="titleAction" method="allTitleJson"> <result type="json"> <param name="root">title</param> </result> </action> </package>
进行到此算是解决了一半的问题,不会连整个界面都进不去。而新的问题又出现了。
到底是将整个对象都进行传递呢?还是先将对象在后台转换成字符串后再进行传递呢?百度一下:我所看到的是所有都是将序列化好了的JSON字符串进行传递,都是JSONObject,可试了无数次都无法正确进行返回,返回常常是500状态码。
直接切入解决办法,同伴看到一个传递方法用map,想到既然可以用map即可以直接传递一个对象。故试着直接传递对象(即struts.xml配置文件中的title),OK成功。简单粗暴。是否能将List直接传呢?类比ExtJs,应该是可以的。OK果然成果。简单粗暴。
所以最为简单粗暴的办法就是:在将从数据库中得到数据放到对象过后,直接将对象传递,因为在json-default中会进行转换,后来发现先转成JSON字符再传递也是可以的(会贴出源代码浅析,主要参考:http://yshjava.iteye.com/blog/1333602),原文作者采用struts2-json-plugin-2.1.8.1.jar。根据原文作者所做的分析,我在struts2-json-plugin-2.2.1稍加了一些修改(阅读顺序:JSONResult.java->JSONUtil.java->JSONWriter.java)。下载:http://pan.baidu.com/s/1hqzIPd6