【问题标题】:Struts2 json response using $.getJSON results undefined responseStruts2 json 响应使用 $.getJSON 结果未定义响应
【发布时间】:2015-08-07 17:57:10
【问题描述】:

我正在尝试使用$.getJSON 方法从操作类中获取String 值,但我得到的结果为undefined。这是我尝试过的代码sn-ps

脚本:

$(function() {
        $("#newPostionFormID").submit(
                function() {
                    var formInput = $(this).serialize();
                    $.getJSON('../employeeShifts/addnewposition.action',
                            formInput, function(jsonResponse) {
                                console.log(jsonResponse.positionAdded);
                            });
                    return false;
                });
    });

strus.xml:

<package name="employeeShifts" namespace="/employeeShifts"
                extends="struts-default,json-default">
     <action name="addnewposition" 
        class="com.vgt.intranet.employeeshifts.action.EmployeeShiftAction"
                    method="addNewPosition">
                    <result type="json">
                        <!-- <param name="excludeNullProperties">true</param>
                        <param name="noCache">true</param>
                        <param name="root">positionAdded</param> -->
                    </result>
        </action>
   </package>

动作类:

public class EmployeeShiftAction extends ActionSupport {
private String position;
private String positionAdded;

public String addNewPosition() {
    log.info("inside addNewPosition");
    position = this.getPosition();
    log.info("Position: " + position);
    positionAdded = position;
    log.info("positionAdded: " + positionAdded);
    return Action.SUCCESS;
}

public String getPosition() {
    return position;
}

public void setPosition(String position) {
    this.position = position;
}

public String getPositionAdded() {
    return positionAdded;
}

public void setPositionAdded(String positionAdded) {
    this.positionAdded = positionAdded;
}

控制台日志:

未定义

我不知道我哪里出错了?任何帮助表示赞赏。

【问题讨论】:

  • @AleksandrM,如果我只打印jsonResponse,它会显示Object { empID=1000, com.opensymphony.xwork2.util.OgnlValueStack.MAP_IDENTIFIER_KEY=""}
  • 你的action方法执行了吗?您为属性分配了哪些值?
  • @AleksandrM 执行操作方法并通过放置此标签 &lt;param name="root"&gt;positionAdded&lt;/param&gt; 解决问题。 (PS: 这在清理并构建了 tomcat 服务器后工作)。非常感谢您的回复。
  • @AleksandrM,现在通过添加root 标签解决了这个问题,但没有添加为什么它会显示我没有在我的Action方法中添加的其他东西?是否有机会在同一个 struts 文件中获得另一个 json 结果类型操作值?
  • 不应该。也许你有一些缓存问题(如果清理工作)?可以试试最新的 S2 版本吗?

标签: java jquery ajax json struts2


【解决方案1】:

您可以使用 inlcude 参数将多个对象定义为输出参数。 默认情况下,JSON 调用会自动调用该控制器中方法名称以“get”开头的所有函数/方法。所以请确保不会发生这种情况。

<result type="json">
<param name="excludeNullProperties">true</param>
     <param name="ignoreHierarchy">false</param>
     <param name="includeProperties">list1.*,list2.*,string</param>
</result>

【讨论】:

  • 如果我们也添加&lt;param name="root"&gt;action&lt;/param&gt; 标签,includeProperties 正在工作。我自己用你的提示发布了一个答案。谢谢
【解决方案2】:

在控制台日志中打印jsonResponse.positionAdded,但在操作返回的JSON 中没有属性positionAdded。要访问此属性,您应该返回 JSON 结果

<result type="json">
    <!-- <param name="excludeNullProperties">true</param> -->
    <param name="noCache">true</param>
</result> 

【讨论】:

  • 感谢您的回复。我按照你说的方式试过了,但结果是一样的。我是正确地理解了你还是遗漏了什么?
  • 我不知道你可能缺少一个 json 插件或它的依赖项,你使用的是 maven 吗?
  • 不,我手动将 jars 添加到 lib 文件夹中,并将这些 jars 添加到构建路径中。还包括 json 插件。
  • 是的,当然!我已经添加了所有必需的库,如果我包含root 标签&lt;param name="root"&gt;positionAdded&lt;/param&gt;,它适用于字符串。但如果没有这个,它会显示一些匿名对象作为结果。
  • 不知道是不是你在执行结果之前把东西压到了值栈中。您可以使用另一个根:&lt;param name="root"&gt;#action&lt;/param&gt; 来确保根是 action。
【解决方案3】:

您应该在您的动作类中为 json 编写代码。您应该将 json 数据返回到客户端。在我的情况下,我使用了 GSON,它是一个 java 库,可用于将 Java 对象转换为它们的 JSON 表示。GSON (https://code.google.com/p/google-gson/) 看看这里。在从动作类返回 json 数据之前,您无法在客户端检索 json 数据。尝试将 positionAdded 转换为动作类中的 JSON 数据。

我会建议你的客户端,这个脚本:

 jQuery.ajax(
                        {
                            type: 'POST',
                            url:'../employeeShifts/addnewposition.action',,
                            dataType: 'json',
                            success:function(data){
                                var dat=data.positionAdded
                                //alert(dat);
                                var obj = jQuery.parseJSON(dat);

                                            alert(obj);

                },
                            error:function(data1,data2,data3){
                                //alert("error");

                                alert(data3);
                            }



                    });

【讨论】:

  • OP 使用 json 插件,而不是手动将对象转换为 json。
  • @AleksandrM,好的,但他应该在动作类中为 json 编写代码,json 有它的表示,他不能只向客户端发送字符串类型的属性,他要求获取这个值到客户端。
  • 是的,他可以,因为 S2 json 插件。
  • 别抱歉。看看json插件:struts.apache.org/docs/json-plugin.html.
  • 一定要了解how the json-plugin works@FationHadri
【解决方案4】:

谢谢大家。在这里,我将发布最终的工作 struts 配置作为您的回复的答案。

<result type="json">
    <param name="root">action</param>
    <param name="includeProperties">positionAdded</param>
    <param name="excludeNullProperties">true</param>
    <param name="noCache">true</param>
</result>

【讨论】:

  • 我没看到你在动作课中从哪里得到subDepartmentMap?您应该编辑您的问题并添加缺少的代码。不完整的答案不可能正确回答,它对任何阅读它的人都没有帮助。
  • 我实际上只需要一个字符串,正如我在我的问题中发布的那样。我只想尝试它是否适用于更多对象。仅出于这个原因,我添加了subDepartmentMap。好的,我将根据我在问题中提出的内容来编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 2013-03-24
  • 2021-11-02
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 1970-01-01
相关资源
最近更新 更多