关于<result>元素的type属性

• type属性表明了本次应答结果的类型。该属性的取值可使用struts-default.xml

中预定义的result-type:

dispatcher //(默认值)转发到jsp页面;
stream //文件流
redirect //重定向(可以转到jsp或action)
redirectAction //重定向到另一Action
• redirect与redirectAction的使用区别:

1、使用redirect时url需要.action后缀名,使用redirectAction不需要后缀名;
2、redirect可以转到其它命名空间下的action或其它网址,而redirectAction只能转到同一命名空间下的 action

• 如果要返回JSON文本,可定义action类的execute()方法返回void,在代码中直接使用HttpServletResponse输出JSON字符串即可。

【示例代码】

HttpServletResponse resp=ServletActionContext.getResponse();
resp.setCharacterEncoding("utf-8");
resp.setContentType("application/json");
resp.getWriter().println(array.toString());
生成JSON字符串方法一
• 使用json-lib.jar帮助生成JSON字符串,它依赖ezmorph.jar,所以在想要利用这两个jar包,需要将他们的jar文件拷贝到webContent下的lib文件夹中,当然也可以使用其他两个jar文件jackson-core-asl-1.9.2.jar和jackson-mapper-asl-1.9.2.jar,用法上稍有区别

单个java对象的转换

JSONObject.fromObject(bean).toString();

若要返回数组:

JSONArray.fromObject(bean).toString();
JSONArray.fromObject(array).toString();
其中的array参数可以为java数组对象,也可以是java的集合对象

注:java.util.Date对象返回到客户端后是普通的javascript对象。

    private Date productDate = new Date();
    
    public Date getProductDate() {
        return productDate;
    }
    public void setProductDate(Date productDate) {
        this.productDate = productDate;
    }
/**
     * 商品检索返回json格式的数据
     */
    public void prdSearch() {
        String prdName = super.getParameter("prdName", String.class);
        Float lowPrice = super.getParameter("lowPrice", Float.class);
        Float highPrice = super.getParameter("highPrice", Float.class);
        //将客户端提交的参数装载到Map集合中
        HashMap<String, Object> condition = new HashMap<String, Object>();
        if (prdName != null) {
            condition.put("prdName",prdName);
        }
        if (lowPrice != null) {
            condition.put("lowPrice",lowPrice);
        }
        if (highPrice != null) {
            condition.put("highPrice",highPrice);
        }
        //获得检索的商品信息
        List<ProductInfo> prdList = this.productService.searchByCondition(condition);
        //以JSON格式返回给客户端
        HttpServletResponse resp = ServletActionContext.getResponse();
        //服务器响应的字符集
        resp.setCharacterEncoding("utf-8");
        //服务器响应的内容类型
        resp.setContentType("application/json");
        //将服务器包装的数据应答到客户端
        try {
            JSONArray.fromObject(prdList).write(resp.getWriter());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }       
生成JSON字符串方法二
• 配置<result type=“json”>方式返回json结果,以符合struts工作流程的方式来返回json数据

1、添加 struts2-json-plugin-2.3.x.jar
2、Action中将需要返回的java对象放入值栈中,并返回”success”
3、在struts.xml中配置:

<package extends="json-default" ...>
<result type="json">
<param name="root">object key</param>
</result>
</package>

【示例】

/**
     * 根据条件检索商品,返回json格式的数据
     * 
     * @return
     */
    public String prdSearch2() {
        String prdName = super.getParameter("prdName", String.class);
        Float lowPrice = super.getParameter("lowPrice", Float.class);
        Float highPrice = super.getParameter("highPrice", Float.class);
        //将客户端提交的参数装载到Map集合中
        HashMap<String, Object> condition = new HashMap<String, Object>();
        if (prdName != null) {
            condition.put("prdName",prdName);
        }
        if (lowPrice != null) {
            condition.put("lowPrice",lowPrice);
        }
        if (highPrice != null) {
            condition.put("highPrice",highPrice);
        }
        //获得检索的商品信息
        List<ProductInfo> prdList = this.productService.searchByCondition(condition);
        //将服务器返回的信息放入值栈中,让客户端来获取
        super.add2ValueStack("prdList", prdList);
        return SUCCESS;
    }

struts.xml配置

<action name="prdSearch2" class="com.xixi.struts_demo.action.ProductAction" method="prdSearch2">
     <result type="json">
            <param name="root">prdList</param>
     </result>
</action>

jsp页面获取数据

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
    <script type="text/javascript" src="/struts_demo/js/jquery-3.2.1.js"></script>
        <script type='text/javascript'>
           jQuery(function(){
              $("input[value='检索']").click(function(){
                  var prdName = $("input[name='prdName']").val();
                  var lowPrice = $("input[name='lowPrice']").val();
                  var highPrice = $("input[name='highPrice']").val();
                
                  var data={};
                  
                  if (prdName) {
                      data.prdName = prdName;
                  }
                  
                  if (lowPrice) {
                      data.lowPrice = lowPrice;
                  }
                  
                  if (highPrice) {
                      data.highPrice = highPrice;
                  }
                //  $.post("/struts_demo/prd/prdSearch.action",data,function(r){
                  $.post("/struts_demo/prd/prdSearch2.action",data,function(r){
                      if (r) {
                          console.info(r);
                          var prd = null;
                          var tbody = $("#tbody1");
                          tbody.empty();
                          var row = null ;
                          for (var  i=0; i<r.length; i++) {
                              prd = r[i];
                              console.info(prd.productDate);
                              row = "<tr><td>" + prd.prdId+"</td><td>"+prd.typeId+"</td><td>"+prd.prdName+"</td><td>"+prd.prdDesc+"</td><td>"+prd.price+"</td></tr>";
                              tbody.append(row);
                          }
                      }
                  },"json");
              });
          });
    </script>
</head>
<body>
    <h3>商品检索</h3>
    商品名称:<input type="text" name="prdName"/><br/>
    价格范围:<input type="text" name="lowPrice"/>~<input type="text" name="highPrice"/><br/>
                       <input type="button" value="检索"/>
    <hr/>
    <table>
        <thead>
            <tr>
                <th>商品编号</th>
                <th>类别</th>
                <th>名称</th>
                <th>描述</th>
                <th>价格</th>
            </tr>
        </thead>
        <tbody id="tbody1">
            
        </tbody>
        <tr>
    </table>
</body>
</html>
注: java.util.Date对象返回到客户端后是String对象,若要控制该字符串格式,可在java类的相关属性get方法上添加@JSON注解。如下:
@JSON(format = "yyyy-MM-dd HH:mm:ss")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,296评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 一. Java基础部分.................................................
    wy_sure阅读 3,731评论 0 11
  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    禅与计算机程序设计艺术阅读 3,764评论 2 8
  • 先把结论告诉大家,真正的贵族精神就是追求不实用。我简单翻译一下,就是不去追求世俗的东西,而是去追求精神上的满足。 ...
    猫黍阅读 1,114评论 1 18