【问题标题】:Calling Struts 2 action class from AngularJS with HTTP GET request but not getting any response使用 HTTP GET 请求从 AngularJS 调用 Struts 2 动作类但没有得到任何响应
【发布时间】:2016-05-31 20:37:46
【问题描述】:

我正在创建一个简单的应用程序,它通过 AngularJS 对 Struts 2 进行简单的调用。我只是从 AngularJS 创建一个简单的 HTTP GET 请求以从服务器获取 JSON。在服务器端,我使用名为 AngularAction.java 的 Struts2 动作类。

但是,我一直无法上课,甚至我在动作课上打印了一些虚拟消息但找不到任何东西。

代码文件是:

index.jsp (我通过 AngularJS 向 Struts 类发送 HTTP GET 请求的索引页)

<script>
    var app = angular.module("myApp", []);
    app.controller("controller", function($scope,$http){
        $scope.getDataFromServer = function() {
        
            $http.get("angularAction").success(
                    function(data, status, headers, config) {
                            $scope.person = data;
                    }).error(function(data, statusenter code here, headers, config) {
                                    console.log("error message " + data);
            });
    };  
            
    });
        
</script>
</head>
<body>
<div ng-app="myApp"  >
        <div ng-controller="controller" >
                <button ng-click="getDataFromServer()">
                     Fetch data from server
                </button>
                <p> First Name : {{person.firstName}} </p>
                <p> Last Name : {{person.lastName}} </p>
        </div>
</div>
</body>
</html>

AngularAction.java: (Struts动作类)

public class AngularAction extends ActionSupport {

    PersonData personData ;
    
    @Override
    public String execute() throws Exception {
         personData.setFirstName("test");
         personData.setLastName("base");
        return SUCCESS;
    }
    public PersonData getPersonData() {
        return personData;
    }
    public void setPersonData(PersonData personData) {
        this.personData = personData;
    }

}

struts.xml: (Struts 配置文件)

<?xml version="1.0" encoding="UTF-8"?>


<struts>
    <constant name="struts.devMode" value="false" />
    
    <package name="default" namespace="/" extends="json-default">
            <action  name="angularAction"  class="com.action.AngularAction" >
                <result type="json" >
                      <param name="root">personData</param>
                      <param name="excludeNullProperties">true</param>
                      <param name="noCache">true</param>
                </result>
            </action>
    </package>

</struts>

【问题讨论】:

  • 您的personData 为空。
  • 不,我上不了动作课。映射有什么问题吗?
  • 它不会改变personData 为空的事实。查看您的浏览器的开发工具到请求的去向。
  • 如果你用 Spring 配置了PersonData,它将被注入到 action 属性中。你用过吗?
  • 让我们假设动作类中没有 personData 那么它也不适合我..

标签: java angularjs json jsp struts2


【解决方案1】:

你应该以任何一种方式初始化personData,使用参数,容器注入,手动,因为你会在execute()方法中得到NullPointerException。

Struts2 使用到 URL 的动作映射来执行动作方法。动作映射具有命名空间、动作名称、参数等属性。解析 URL 时,会创建操作映射对象,然后使用它来确定操作配置。如果没有找到动作配置,你应该得到 404 错误There's no action mapped for the action name [] and namespace [] in the context []。

在struts.xml 中,您定义了两个属性:动作名称和命名空间。剩下来定义第三个属性——context。

JSP 的名称是index.jsp,如果它不是一个欢迎文件,那么你可以在其中使用struts 标签,例如s:url,如果这个页面是作为索引操作的结果返回的。这里是来自 Struts2 Hello World 应用程序的此类操作示例

<action name="index">
  <result>/index.jsp</result>
</action>

如果您使用index.jsp 作为欢迎文件(大多数 Web 服务器默认使用该文件),那么您必须提供操作 URL 的上下文路径。

app.controller("controller", ['$scope', '$http', function ($scope, $http) {
  $scope.getDataFromServer = function() {
    $http.get("${pageContext.request.contextPath}/angularAction")
      .then(function(response) {
        $scope.person = response.data;
      }, function(response) {
        console.log("error message: " + response.statusText);
    });
  };
}]);

确保struts.xml 被Struts 找到并解析,并且Struts 过滤器被映射以处理所有请求。

【讨论】:

  • @sandeeprawat 如果有帮助,您可以接受答案。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多