Struts返回Json格式数据
来源:互联网 发布:网络购彩 编辑:程序博客网 时间:2024/05/01 09:44
我们知道json数据就是一堆键/值对的集合,更随意的可以就把它理解为符合特定规则字符串。那么我们怎么利用这个特殊的“字符串”来进行前后台的交互呢?
其实很简单,让你用字符串交互估计都会,用json也没有那么复杂。
简单的我们直接向页面输出:先获取到response(不要问我怎么获取,用你的奇技淫巧可以办到的)然后调用response.getWriter().write(String str)方法直接向调用者输出,感觉是不是很无聊啊,就是输出个字符串而已嘛,不过既然是输出json格式的就麻烦把字符串弄成符合要求的json吧。你可以自己拼字符串,也可以用现成的工具类,Java api就有现成的,不过有好多更加优秀的第三方jar包,为什么不试一试呢?来半张官网的图,有兴趣的自行研究:
现在我们要讲的是如何配合Action来实现
首先也是最关键的一点:我们来配置Action
<package name="adminManage" namespace="/" extends="json-default">
<action name="KAdminTest" class="com.know.control.action.AdminAction"
method="queryAllUsers">
<result type="json">
<!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
<param name="root">jsonResult</param>
<!-- 指定是否序列化值为空的属性 -->
<param name="excludeNullProperties">true</param>
</result>
</action>
</package>
有几点值得注意:
1.不同于我们以往配置的Action(以往配置的Action所在的package都是extends="struts-defualt")
这里我们extends="json-default",这里需要引入特定的jar包:struts2-json-plugin-xxx.jar.来支持
有人可能会问了json-default哪来的?其实就是继承自struts-default打开struts2-json-plugin-xxx.jar.查看struts-default.xml文件就会发现这个:
<struts>
<package name="json-default" extends="struts-default">
........
</package>
</struts>
2.就是配置result的时候要指定type="json",如果想向前台传递参数则配置<param name="root">jsonResult</param> ,这里的jsonResult必须在Action中有对应的get方法,
jsonResult的类型不固定,因为最终由jsonResult到格式化的json是由struts2完成的,不需要我们做转换。
当然还有其它更多的配置如下:
<param name="root">jsonResult</param>
<!-- 指定是否序列化值为空的属性 -->
<param name="excludeNullProperties">true</param>
<!-- 指定将序列化jsonResult中的哪些属性 -->
<param name="includeProperties">userList.*</param>
<!-- 指定jsonResult中哪些属性将不被序列化,一般不与上边的配置同时出现 -->
<param name="excludeProperties">SUCCESS</param>
Action配置好了,然后我们再来编写Action
public class AdminAction extends ActionSupport{
private Map<String,Object> jsonResult;
public Map<String, Object> getJsonResult() {
return jsonResult;
}
private static final UserService userProxy = (UserService) BeanFactory
.getBean("UserProxy");
public String queryAllUsers(){
List<UserModel> userList = userProxy.transForm(userProxy.getUsers());
jsonResult = new HashMap<String, Object>();
jsonResult.put("total", userList.size());
jsonResult.put("rows", userList);
jsonResult.put("success", true);
return SUCCESS;
}
}
使用Map做jsonResult更符合json的格式。好了,其它的细节不展开了。
最后测试,下面是输出结果:
这里再展开一个其它内容:
就是一开始我在获取userList的时并没有做transForm操作,一切看似正确,但是当程序运行,访问URL的时候报了一个could not initialize proxy -no session 异常,当时很郁闷。后来才发现是hibernate的懒加载捣的鬼。就是我的User和其他表有一对多的映射。看似userList查询成功,其实User的一些属性并没有值(这种”没有值“的状态和为null不太一样,当你访问这些属性的时候,它会再次查询一遍数据库(俗称懒加载),不过,要实现懒加载必须在同一个session中,但是由于我们访问这些属性的地方不对(我们在哪里访问这些属性了?),不在同一个session中,导致出错)
所以我重新做了一个UserModel来封装需要的数据。这样就不会被那些无辜牵连的数据折腾了。
- Struts返回Json格式数据
- struts返回对象json格式数据
- Struts json格式返回
- Struts返回JSON数据
- 返回json格式数据
- struts返回json数据解析
- php返回json格式数据
- Servlet返回JSON格式数据
- 采用Json格式返回数据
- Servlet返回JSON格式数据
- django 返回json格式数据
- struts2 json格式返回数据
- C#返回Json格式数据
- struts2返回json格式数据
- Struts.xml配置返回JSON数据
- WebService 返回json格式和返回xml格式的数据
- jsp向EXTJS返回json格式数据
- Springmvc数据校验返回Json格式
- 总结系列--Android开发规范
- UI数据库
- Mongodb设置Replica Set集群 并使用PHP来连接
- java:回调函数
- 九度oj 1141
- Struts返回Json格式数据
- JUnit 4的基本用法
- EasyUI----EasyUI-Tree联想加模糊查询
- Cocos2d-x 网络登录与注册
- Rust之开始入门<2>
- 信号例子
- Linux 的cp命令
- Taekwondo
- extjs3 用户管理 页面