• Structs2中Action返回json到前台方法


    1.传统方式JSON输出

    这一点跟传统的Servlet的处理方式基本上一模一样,代码如下

    01public void doAction() throws IOException{
    02        HttpServletResponse response=ServletActionContext.getResponse();
    03        //以下代码从JSON.java中拷过来的
    04        response.setContentType("text/html");
    05        PrintWriter out;
    06        out = response.getWriter();
    07        //将要被返回到客户端的对象
    08        User user=new User();
    09        user.setId("123");
    10        user.setName("JSONActionGeneral");
    11        user.setPassword("JSON");
    12        user.setSay("Hello , i am a action to print a json!");
    13        JSONObject json=new JSONObject();
    14        json.accumulate("success"true);
    15        json.accumulate("user", user);
    16        out.println(json.toString());
    17//      因为JSON数据在传递过程中是以普通字符串形式传递的,所以我们也可以手动拼接符合JSON语法规范的字符串输出到客户端
    18//      以下这两句的作用与38-46行代码的作用是一样的,将向客户端返回一个User对象,和一个success字段
    19//      String jsonString="{"user":{"id":"123","name":"JSONActionGeneral","say":"Hello , i am a action to print a json!","password":"JSON"},"success":true}";
    20//      out.println(jsonString);
    21        out.flush();
    22        out.close();
    23    }

    struts.xml中的配置:

    1<package name="default" extends="struts-default" namespace="/">
    2    <action name="testJSONFromActionByGeneral"class="cn.ysh.studio.struts2.json.demo.action.UserAction" method="doAction">
    3    </action>
    4</package>

     

    这个action没有result,且doAction方法没有返回值!

    2.structs2封装方式
    01<result type="json">
    02                <!-- 这里指定将被Struts2序列化的属性,该属性在action中必须有对应的getter方法 -->
    03                <!-- 默认将会序列所有有返回值的getter方法的值,而无论该方法是否有对应属性 -->
    04                <param name="root">dataMap</param>
    05                <!-- 指定是否序列化空的属性 -->
    06                <param name="excludeNullProperties">true</param>
    07                <!-- 这里指定将序列化dataMap中的那些属性 -->
    08                <param name="includeProperties">
    09                    userList.*
    10                </param>
    11                <!-- 这里指定将要从dataMap中排除那些属性,这些排除的属性将不被序列化,一半不与上边的参数配置同时出现 -->
    12                <param name="excludeProperties">
    13                    SUCCESS
    14                </param>
    15</result>

     JSON数据在Action类中是根据getter方法的返回值自动装配的,也就是说完全可以不需要重写execute方法。JSON的生成机制(上述两个必需的包中提供的方法)会直接从setter方法获取到request中提供的值,并且自动装配getter方法提供的返回值。期间如果有其它的功能操作,如计算、查询数据库、重组数据等,可以写到getter方法中,也可以写到execute方法中统一执行。

    这里需要注意的是execute方法的返回值字符串是无效的,可以随意设置,因为在后面的配置文件中并不会用到。

    getter方法返回值的类型可以采用基本数据类型、String类、集合类(List、Map等)以及诸如Double、Integer等打包类。这些都不会影响JSON的生成,因为对于结果而言都是字符串类型的;而集合类在生成时会被自动迭代,因此生成的结果中其本身的集合类型(列表、映射表等)也不会改变。

    因此在Action类可以将所有的结果数据保存到一个List或Map中在通过getter方法输出,也可以设置多个getter方法返回不同类型、不同变量的数据。这些数据在JSON中的名称与getter方法名中一致。

    与基本的Action相比,生成JSON的Action在配置文件struts.xml中主要有两点不同:

    1.      不能与基本的Action配置在同一个package中,新的package必须扩展自(extends)json-default命名空间;

    2.      result标签中可以不包含name属性(因为没用),但是必须包含type属性,且值必须为“json”,即<result type=”json” ></result>,表明这是一个JSON数据,不需要跳转页面。


     




  • 相关阅读:
    5.集合(3)——Map集合
    4.集合(3)——List集合
    2.初窥集合类1
    1.正则表达式1
    (13)JSON
    (12)表单验证
    Wpf实现TreeSelect多选
    Wpf实现TreeSelect
    Wpf登录验证方式(5)-推理拼图的实现
    Wpf登录验证方式(4)-语序点选的实现
  • 原文地址:https://www.cnblogs.com/doit8791/p/4294276.html
Copyright © 2020-2023  润新知