【问题标题】:Form not posting data to Spring Controller表单未将数据发布到 Spring Controller
【发布时间】:2016-06-12 17:55:34
【问题描述】:

我对 Spring 非常陌生,并试图通过网上的一些教程来学习。我创建了一个简单的 Spring MVC 登录应用程序,使用 AngularJS 作为前端并使用 JSON 将数据发布到 Spring Controller。

我的简单登录表单:

<form id="loginForm" ng-submit="login()" novalidate ng-controller="loginController" align="center">
            <fieldset>
                <div class="form-group col-lg-10">
                    <label for="username" class="control-label">Username</label>
                    <input class="form-control" ng-model="username" placeholder="Username" type="text">
                </div>
                <div class="form-group col-lg-10">
                    <label for="password" class="control-label">Password</label>
                    <input class="form-control" ng-model="password" placeholder="Password" type="password">
                </div>
                <div class="form-group">
                    <div class="col-lg-10 col-lg-offset-25">
                        <button type="submit" class="btn btn-primary">Login</button>
                        <button type="reset" class="btn btn-default">Reset</button>
                    </div>
                </div>
            </fieldset>
        </form>

我的角度控制器:

function loginController($scope){
    $scope.login=function(){
        var data=$scope.fields;
        var response = $http.post("rest/dologin",data);
        alert(response);

    };
};

我的 Web.xml:

<welcome-file-list>
        <welcome-file>pages/login.html</welcome-file>
    </welcome-file-list>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
        /WEB-INF/spring-core.xml
    </param-value>
    </context-param>

    <!-- Spring MVC -->
    <servlet>
        <servlet-name>spring-mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/spring-mvc.xml
            </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>spring-mvc</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

我的 Spring 控制器:

@Controller
public class LoginController {




@RequestMapping(value = "/dologin", method = RequestMethod.POST, headers = {"Content-type=application/json"})
protected @ResponseBody String validateUser(@RequestBody User user) {

    System.out.println(user.getUsername() + " " + user.getPassword());
    return "Sucess" + " " + user.getUsername();

    }
}

我的 Dispatcher Servlet:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-4.1.xsd  
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-4.1.xsd
     http://www.springframework.org/schema/mvc
     http://www.springframework.org/schema/mvc/spring-mvc.xsd"     
    xmlns:context="http://www.springframework.org/schema/context">

    <context:component-scan base-package="com.app.web.controllers" />
    <mvc:annotation-driven />
</beans> 

我尝试在 Angularjs 控制器中放置一个警告框,它会显示,但我的 Spring 控制器中的打印语句不打印。此外,没有显示任何错误。

更新:

我尝试将数据发布到我的 Spring 控制器,它给出了正确的响应。所以,问题出在 AngularJS 控制器上。我尝试使用firebug,发现没有调用角度控制器中的登录方法,而是加载了脚本本身。

更新2:

我把我的 AngularJS 控制器改成了这个,现在控制器被检测到了:

var loginApp = angular.module('loginApp',[]);
loginApp.controller('loginController', ['$scope','$http',function($scope,$http) {

  $scope.login = function() {
          var data=$scope.fields;
          var response = $http.post('/test/rest/dologin',data).success(function(data){
            alert(response);
          });
      }

这一次我在 Firebug 中收到“错误 400 错误请求”错误代码:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<title>Error 400 BAD_REQUEST</title>
</head>
<body><h2>HTTP ERROR 400</h2>
<p>Problem accessing /test/rest/dologin. Reason:
<pre>    BAD_REQUEST</pre></p><hr /><i><small>Powered by Jetty://</small></i><br/>                  

<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                

</body>
</html>
  };
}]);

服务器出现以下异常:

NotReadableException: Required request body is missing

请提出我在这里做错了什么。

【问题讨论】:

    标签: java angularjs json spring-mvc


    【解决方案1】:

    我认为您的方法正在返回一个逻辑视图名称。取而代之的是,您应该在 validateUser 方法上方使用 @ResponseBody 注释,然后尝试返回任何字符串,因为此注释将直接将输出作为响应发送,而不是将其作为要解析的逻辑视图发送到视图解析器 试试这个链接,在这个 json post to java using spring mvc 中解释得很好 http://hmkcode.com/spring-mvc-json-json-to-java

    【讨论】:

    • 感谢您的评论。你说的,对我来说很有意义。我将这些更改包含在我的代码中。不过还是一样的错误:(
    【解决方案2】:

    在您的 ajax 调用中,您正在发送“数据”,而在您的控制器中,您期望用户名和密码,这怎么可能?当您从 URI 发送内容时使用 @PathVariable。您正在发出 POST 请求,因此无法从 URI 获取数据。 USE @ModelAttribute("userForm") User user(这是你的POJO对象,对应你的表单,用户名和密码)

    我建议你看一些例子

    为什么当您甚至不使用休息控制器时,您的 URL 映射会显示“休息”?

    【讨论】:

    • 我可能混合了一些教程。有的话可以推荐一个好的吗?我尝试映射到休息,因为这是我将来想做的事情。对,现在只使用一个简单的弹簧控制器。
    • 最好是这样的:[link] (spring.io/guides/gs/handling-form-submission) 我之所以问关于用 REST 映射你的 URL 的原因是因为它没有任何逻辑意义,尽量使它合理和合乎逻辑.此外,Spring 提供了一个与 JAX-RS 有点兼容的 RestController。总之,学习愉快。
    • 我试过改变你提到的弹簧控制器..还是一样:(
    • @p19 尝试将@ModelAttribute("userForm") 更改为@ModelAttribute
    猜你喜欢
    • 2013-09-04
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2015-10-10
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多