2016-06-12 44 views
1

我對Spring很感興趣,並且通過網上的一些教程學習。我使用AngularJS作爲前端創建了一個簡單的Spring MVC Login App,並使用JSON將數據發佈到Spring Controller。表單沒有發佈數據到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> 

我的春天控制器:

@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(); 

    } 
} 

我的分發程序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控制器,它顯示但在我的春節控制器print語句不打印。此外,沒有顯示錯誤。

更新:

我嘗試過帳數據到我的春天控制器,它提供了正確的響應。所以,AngularJS控制器存在問題。我嘗試使用螢火蟲,並看到角控制器中的登錄方法未被調用,但腳本本身已加載。

UPDATE2:

我改變了我的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 

請在這裏建議我做錯了什麼。

回答

3

我想你的方法正在返回一個邏輯視圖名稱。相反,您應該在validateUser方法的上方使用@ResponseBody註釋,然後嘗試返回任何字符串,因爲此註釋將直接發送輸出作爲響應,而不是將其作爲邏輯視圖發送給解析器以解決問題 嘗試此鏈接此JSON後使用Spring MVC的Java是解釋好 http://hmkcode.com/spring-mvc-json-json-to-java

+0

感謝您的評論。你說什麼,對我有意義。我將這些更改包含在我的代碼中。還是同樣的錯誤,雖然:( – k19

+0

非常感謝鏈接。它的好!我試圖複製它,相同的問題。 – k19

1

在你的Ajax調用你發送「數據」,並在你的控制器,你期待的用戶名和密碼,怎麼可能?當你從URI發送一些東西時使用@PathVariable。您正在發出POST請求,因此無法從URI獲取數據。使用@ModelAttribute(「窗體」)用戶的用戶(這是對應於用戶名和密碼的表格POJO對象)

我建議你看看一些例子

爲什麼你的URL映射當你甚至沒有使用休息控制器時,指出「休息」?

+0

我可能混合了一些教程。你可以請建議一個好的,如果你有任何?映射到休息,因爲這是我將來要做的事情。對,現在只是使用一個簡單的彈簧控制器。 – k19

+0

最好的應該是這樣的:[link](https://spring.io/guides/gs/handling -form-submission /)我之所以詢問關於使用REST來映射URL的原因是因爲它沒有任何邏輯意義,所以試着讓它合理合理。另外,Spring提供了一個兼容JAX-RS的RestController無論如何,快樂的學習 – Kid101

+0

我嘗試着改變彈簧控制器,就像你提到的一樣......還是一樣:( – k19