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来封装需要的数据。这样就不会被那些无辜牵连的数据折腾了。

0 0
原创粉丝点击