2014-03-28 50 views
-1

我想使用Spring,jQuery,Ajax和Json做一个非常简单的流程。但我无法向Spring控制器发送POST请求。当我尝试使用消耗并在@RequestMapping中产生时,我的eclipse也显示编译错误。我没有使用maven。这是一个简单的eclipse中的动态web项目。我使用弹簧3.0.5罐。不能发送POST请求到Spring控制器使用JQuery,Ajax和Json

HTML页面。

<html> 
    <head> 
    <style> 
    div { 
      border: 1px solid #000000; 
     } 
    </style> 

    <script src="/JSONProject/js/jquery-1.11.0.min.js"></script> 
    <script> 
    var user=""; 
    var pwd1=""; 
    var json=""; 
    var strJson=""; 
     $(document).ready(function(){ 

      $("#button").click(function(){ 
       console.log("inside click"); 
       user=$("#userName").val(); 
       pwd1=$("#password").val(); 
       json={username:user,password:pwd1}; 
       console.log("json: "+json); 
       strJson=JSON.stringify(json); 
       console.log("strJson: "+strJson); 

       $.ajax({ 
        type: "POST", 
        url: "http://localhost:8080/JSONProject/add.html", 
        contentType: 'application/json', 
        data: JSON.stringify(json) 
       }) 
       .done(function(resultUserDTO) { 
        JSON.stringify(resultUserDTO) 
        alert("result: "+resultUserDTO); 
        }); 



      }); 
     }); 
    </script> 
    </head> 
    <body> 
    <FORM> 
      Please enter your text: 
      <BR> 
       <div > 
        <label id="uName">Username</label> 
        <input id="userName"/> 
        <br> 
        <label id="pwd">Password</label> 
        <input id="password" type="Password" id="pwd"/> 

       </div> 
      <BR> 
      <INPUT id="button" TYPE="SUBMIT" VALUE="Submit"> 
     </FORM> 
    </body> 
</html> 

控制器:

package demo.controller; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestBody; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.servlet.ModelAndView; 

import demo.model.Login; 

@Controller 

public class HelloWorldController { 

    Login users; 

    @RequestMapping("/hello") 
    public ModelAndView helloWorld() { 

     String message = "Hello World, Spring 3.0!"; 
     System.out.println("Inside controller"); 
     return new ModelAndView("hello", "message", message); 
    } 

    /** 
    * Handles POST request 
    */ 
    @RequestMapping(value = "/add",method = RequestMethod.POST ,consumes = "application/json") 
    public String processJson(@RequestBody String requestBody){ 

     return "Handled application/json request "; 


    } 
} 

我收到以下编译错误:

属性消耗是未定义注释类型RequestMapping

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5"> 
    <display-name>Spring3MVC</display-name> 


    <servlet> 
     <servlet-name>spring</servlet-name> 
     <servlet-class> 
      org.springframework.web.servlet.DispatcherServlet 
     </servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>spring</servlet-name> 
     <url-pattern>*.html</url-pattern> 
    </servlet-mapping> 
</web-app> 

为spring-servlet.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd 
http://www.springframework.org/schema/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

    <context:component-scan base-package="demo.controller" /> 
    <mvc:annotation-driven /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/jsp/" /> 
     <property name="suffix" value=".htm" /> 
    </bean> 

</beans> 

的index.jsp

<html> 
<head> 
    <title>Spring with ajax</title> 
</head> 
<body> 
    <a href="hello.html">Say Hello</a> 
</body> 
</html> 

当我点击的index.jsp hello.html的链接,打开hello.html的,我也得到了控制方法的syso处理“\ hello”并获取。但是,当我使用jQuery发出POST请求时,我仍然看到处理“\ hello”的方法的syso并在控制台上获取方法..

真的很困惑。 请帮忙 提前谢谢!

在给出建议后新的更新代码。代码已经编译。但是不要调用POST处理程序。 POST处理程序中的Syso未在eclipse控制台上打印。

控制器:

package demo.controller; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestBody; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.ResponseBody; 
import org.springframework.web.servlet.ModelAndView; 

import demo.model.Login; 

@Controller 

public class HelloWorldController { 

    Login users; 

    @RequestMapping("/hello") 
    public ModelAndView helloWorld() { 

     String message = "Hello World, Spring 3.0!"; 
     System.out.println("Inside controller"); 
     return new ModelAndView("hello", "message", message); 
    } 

    /** 
    * Handles request for adding two numbers 
    */ 
    @RequestMapping(value = "/add",method = RequestMethod.POST ,consumes = "application/json",produces = "application/json") 
    public @ResponseBody String processJson(@RequestBody String requestBody){ 
     System.out.println("inside controller 2"); 

     return "Handled application/json request "; 


    } 
} 

hello.html的:

<html> 
    <head> 
    <style> 
    div { 
      border: 1px solid #000000; 
     } 
    </style> 

    <script src="/JSONProject/js/jquery-1.11.0.min.js"></script> 
    <script> 
    var user=""; 
    var pwd1=""; 
    var json=""; 
    var strJson=""; 
     $(document).ready(function(){ 

      $("#button").click(function(){ 
       console.log("inside click"); 
       user=$("#userName").val(); 
       pwd1=$("#password").val(); 
       json={username:user,password:pwd1}; 
       console.log("json: "+json); 
       strJson=JSON.stringify(json); 
       console.log("strJson: "+strJson); 

       $.ajax({ 
        type: "POST", 
        url: "http://localhost:8080/JSONProject/add.html", 
        contentType: 'application/json', 
        data: JSON.stringify(json) 
       }) 
       .done(function(resultUserDTO) { 
        JSON.stringify(resultUserDTO) 
        alert("result: "+resultUserDTO); 
        }); 



      }); 
     }); 
    </script> 
    </head> 
    <body> 
    <FORM method="post"> 
      Please enter your text: 
      <BR> 
       <div > 
        <label id="uName">Username</label> 
        <input id="userName"/> 
        <br> 
        <label id="pwd">Password</label> 
        <input id="password" type="Password" id="pwd"/> 

       </div> 
      <BR> 
      <INPUT id="button" TYPE="SUBMIT" VALUE="Submit"> 
     </FORM> 
    </body> 
</html> 

PS:我已经使用3.2.0版

+0

我不太记得这方面的很多,但

标签默认为GET,我看到你使用的是按钮处理程序,但是这可能是离合器? 第二件事可能是,你发送请求到JSONProject/add.html,但映射只是/添加。 – Lukino

+1

如果你遇到编译错误,你认为你的程序可以做什么? –

+0

我认为问题在于您将ajax调用发送给“/JSONProject/add.html”,但您的控制器中的映射是“/ add”。我假设你的WAR上下文是'JSONProject',所以第一部分是好的,但除非你在你的配置中做了一些我没有看到的东西,Spring MVC在它的映射上不使用'.html'扩展名。我怀疑如果您使用Chromes开发工具或FireFox的FireBug之类的东西,看看您为AJAX调用返回的回应是什么,那么您将获得404 Not Found。 – CodeChimp

回答

0

producesconsumes属性已被引入用弹簧3.1 。请参阅:http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/new-in-3.1.html

您正在使用spring 3.0.x,因此您的程序将无法编译,因此不会执行任何操作。

另外,根据配置,您的add方法的返回值将用作视图名称(名称为“Handled application/json request”的视图)。如果您想自己处理内容生成,请使用@ResponseBody注释您的add方法。

而且你的js处理程序调用了错误的网址:

$.ajax({ 
    url: "http://localhost:8080/JSONProject/add.html" 
}); 

@RequestMapping(value = "/add",method = RequestMethod.POST ,consumes = "application/json") 
public String processJson(@RequestBody String requestBody){ 

要么改变JS/AJAX网址http://localhost:8080/JSONProject/add或您的请求映射@RequestMapping(value = "/add.html",method = RequestMethod.POST ,consumes = "application/json")

+0

我更换了所有罐子弹簧3.2.0版本。我添加了@ResponseBody这解决了我的编译问题。仍然POST处理程序不会被调用。 :( 我会把更新后的代码编辑为编辑 –

+0

看到我编辑的帖子 –

+0

我确实改变了我的映射来处理/add.html 仍是同样的问题我打开了Chrome控制台查看原因,我可以看到 OST http:// localhost:8080/JSONProject/hello.html 404(Not Found) –

0

以下是我的观察,让我知道,如果有帮助:

1.内部资源视图解析器

您的内部资源查看Resolver在jsp文件夹中查找带有后缀.htm的文件。因此,除index.jsp外,所有文件都应以.htm结尾。或者,如果它们是.html,则可以将视图解析器更改为查找.html。

 <bean id="viewResolver" 
      class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
      <property name="prefix" value="/WEB-INF/jsp/" /> 
      <property name="suffix" value=".html" /> 
     </bean> 

2.输入型按钮无法提交

更改输入类型,只是按钮,而不是提交。 点击此输入[type =“Submit”],往往会将表单提交给表单的操作(因为没有指定,因此会重新加载页面,这就是为什么您会得到相同的syso)。 你想用你的onclick事件覆盖这个输入。因此,将其类型更改为按钮。

<INPUT id="button" TYPE="Button" VALUE="Submit"> 

3.消耗,并产生

不是真的需要。 这些基本上是对处理程序的限制。 这给了我麻烦。它没有它们。完全你在这一个电话。

相关问题