【问题标题】:Struts2 How to Return a JSON Response [duplicate]Struts2如何返回JSON响应[重复]
【发布时间】:2017-04-30 12:28:48
【问题描述】:

我目前正在创建一个网络应用程序,用户可以在其中以 JSON 格式从数据库中获取标签,

这是我的 struts 操作

public String execute(){


    Gson gson = new Gson();
    String tagsAsJson = gson.toJson(audioTaggingService.findTagsByName(q));
    System.out.println(tagsAsJson);

    return "success";
}

更新:

tagsAsJson 已经是 JSON 格式,我只想返回它,而不是整个类操作本身。

它返回类似这样的东西

这是我要返回给用户的数据

[{"id":2,"name":"Dubstep","description":"Dub wob wob"},{"id":3,"name":"BoysIIMen","description":"A 1990s Boy Band"},{"id":4,"name":"Sylenth1","description":"A VST Plugin for FLStudio "}]

如何将tagsAsJson 作为 r JSON 响应返回?因为客户端代码将使用该 JSON 响应。

【问题讨论】:

  • ^ 这对我不起作用。
  • 它将整个动作类转换为 JSON。我只希望字符串得到响应,这个例子给了我很多例外。
  • 为了解决您的更新,它采用 json 格式,因为您手动将其放置在这种方式。只需使用插件。如果您想要做更多的工作来做您想做的事,那么使用流结果...您也可以使用 JSP 输出 JSON,请参阅:stackoverflow.com/questions/9124960/… 但实际上...只需使用插件。
  • 我也有同样的问题。 Struts 2 返回一个带有偶数请求参数的整个动作类!

标签: java json struts2 action gson


【解决方案1】:

使用 Struts "JSON Plugin"

很简单,三个步骤:

只需像这样将它包含在您的 maven 项目中

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-json-plugin</artifactId>
    <version>${version.struts2}</version>
</dependency>

声明您希望返回的字段为 JSON 字符串,就像您的操作字段一样,提供 getter 和 setter。

public class Struts2Action extends ActionSupport {

    private String jsonString;

    public String execute() {
        Gson gson = new Gson();
        jsonString = gson.toJson(audioTaggingService.findTagsByName(q));

        return "success";
    }

    public String getJsonString() {
        return jsonString;
    }

    public void setJsonString(String jsonString) {
        this.jsonString = jsonString;
    }
}

最后,把它放到你的 XML 中:

<action name="someJsonAction" class="com.something.Struts2Action">
    <result type="json">
        <param name="noCache">true</param>
        <param name="excludeNullProperties">true</param>
        <param name="root">jsonString</param>
    </result>
</action>

关注&lt;param name="root"&gt;jsonString&lt;/param&gt;。这段 xml 告诉 Struts2 这个确切的属性应该被视为 JSON 序列化的根。因此,JSON 响应中只会返回命名属性(以及以下属性,如果它是地图或其他属性)。

感谢 JSON 插件,内容类型将是正确的。

“JSON 插件”文档在这里:http://struts.apache.org/release/2.3.x/docs/json-plugin.html

【讨论】:

  • 这看起来是最好的答案。它对我来说很好。特别是现在 json-plugin 已被 Struts2 吸收为默认库。
  • 这似乎不适用于 struts 2.5 和 json 结果。与另一个返回 json 字符串并尝试使用 json 结果将其发回的库具有完全相同的设置。当指向字符串属性时,我得到 net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
  • 当心这个答案:你不应该在你期望依赖于请求的单例中拥有实例字段。这是一个等待发生的令人讨厌的竞争条件。
  • @TylerHoppe 我可以看到这里没有单身人士——你能解释一下吗? 未来读者注意:此警告与普通 S2 应用程序无关;这里没有单例,这个答案完全可以(三角洲它正在做的工作 S2 已经可以为你做,这没有多大意义)。
【解决方案2】:

尝试使用响应的 PrintWriter。

Java

    public String execute()
    {
      Gson gson                    = new Gson();
      String jsonString            = gson.toJson(audioTaggingService.findTagsByName(q));
      HttpServletResponse response = ServletActionContext.getResponse();

      response.setContentType("application/json");
      response.getWriter().write(jsonString );

      return null;
   }

【讨论】:

  • 这是最正确的答案,因为他已经有一个 JSON 字符串。不过,更好的方法是创建一个实际的Result 来处理HttpServletResponse
【解决方案3】:

在 Action 类中放下面的代码。

  public class Struts2Action extends ActionSupport
  {     

    public String jsonString="";

    public String execute()
    {
      Gson gson = new Gson();
      jsonString  = gson.toJson(audioTaggingService.findTagsByName(q));
      System.out.println(jsonString);

      return "success";
   }
  }

在JSP中放下面的代码

<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<title>Struts Rais</title>

<s:property value="jsonString"/><br />

如果您想操作 JSON 数据,您将在 var &lt;s:set&gt; 标记中查找数据并访问整个页面中的变量,这将打印 JSON 数据。

【讨论】:

  • 如果您正在寻找其他东西,请告诉我
  • 如果 OP 正在寻找 JSON 响应,则更有可能他们不想要 HTML,需要设置内容类型等。
  • 这完全可以正常工作。但我有 ArrayList jsonList;此列表不包含任何数据,即使它导致成功功能
【解决方案4】:

要返回 JSON 响应,您需要在项目构建路径中包含 struts2-json-plugin-2.x.x.jar 文件您需要设置包 extends="json-默认" 结果类型为 json

struts2-json-plugin-2.x.x.jar 文件允许您将具有 setter 的 Action 类属性序列化为 JSON 对象。

从maven获取jar依赖

  <dependencies>
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.1.8</version>
</dependency>
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-json-plugin</artifactId>
    <version>2.1.8</version>
</dependency>

您可以从此链接获得完整的帮助...

Struts 2 and JSON response

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 2017-12-11
    • 2015-12-27
    • 2012-02-12
    • 2019-06-30
    • 2021-04-25
    • 1970-01-01
    • 2018-12-24
    相关资源
    最近更新 更多