将AJAX从Javascript发送到Spring Controller

时间:2014-07-29 15:33:57

标签: javascript ajax spring

我有一个JSP页面,上面有一些javascript:

function enviar(tableID) {


    var table = document.getElementById(tableID);


    var array= new Array();

    for (var i = 1;i<table.rows.length; i++){

        var row = table.rows[i];
        for (var j = 0; j < row.cells.length; j++){

            alert("added to array: "+row.cells[j].getElementsByTagName('INPUT')[0].value);
            array.push(row.cells[j].getElementsByTagName('INPUT')[0].value);

        }
    }
    var ajaxRequest;  

    try{
        // Opera 8.0+, Firefox, Safari
        ajaxRequest = new XMLHttpRequest();
    } catch (e){
        // Internet Explorer Browsers
        try{
            ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try{
                ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e){
                // Something went wrong
                alert("Your browser broke!");
                return false;
            }
        }
    }

    ajaxRequest.open('POST', 'proyecto/saveRecompensas');

    ajaxRequest.send('array='+array);

}

还有一个控制器,有一个方法可以接收请愿书和我发送的数组以及请愿书:

@RequestMapping ("/proyecto/saveRecompensas")
    public String saveRecompensas(@RequestParam String[] array){
        System.out.println("saveRecompensas method");

        return null;        
    }

问题是,从不调用方法中的sysout。这样,当执行Javascript时,服务器控制台会这样说:

WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/myapp/proyecto/proyecto/saveRecompensas] in DispatcherServlet with name 'appServlet'

为什么双重&#34; proyecto&#34;在URI?我应该使用哪个URL到服务器才能收到请愿?我发送参数好吗?

谢谢。

编辑:

我的调度员:

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

    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

3 个答案:

答案 0 :(得分:0)

我的猜测是当前的URL上下文是:/myapp/proyecto所以如果你这样做:

ajaxRequest.open('POST', 'proyecto/saveRecompensas');

它将基于当前的URL上下文,再次添加proyecto。

答案 1 :(得分:0)

您最好指定后缀或子路径,而不仅仅是根路径。

  • 子路径approch:

servlet映射:

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/action/*</url-pattern>
</servlet-mapping>

动作:

@RequestMapping ("/proyecto/saveRecompensas")
public String saveRecompensas(@RequestParam String[] array){
    System.out.println("saveRecompensas method");
    return null;        
}

URL:

ajaxRequest.open('POST', 'action/proyecto/saveRecompensas');
  • 后缀approch:

servlet映射:

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

动作:

@RequestMapping ("/proyecto/saveRecompensas")
public String saveRecompensas(@RequestParam String[] array){
    System.out.println("saveRecompensas method");
    return null;        
}

URL:

ajaxRequest.open('POST', 'proyecto/saveRecompensas.action');

@Edit在控制器方法中获取数组参数:

    java中的
    • 在@RequestParam里面,必须使用&#39; value =&#34; paramName []&#34;&#39;要指定参数名称,名称必须以&#34; []&#34;
    • 结尾
    • 参数应定义为数组类型,

    e.g。

    public Map<String, Object> getObjects(@RequestParam(required = true, value = "ids[]") Integer[] ids) { }

  • 在js:

    • 数组参数的名称也应该带有后缀&#34; []&#34;,

    e.g。 "ids[]":[1,2,3]

答案 2 :(得分:0)

只需为您的网址添加后缀',如下面的web.xml文件

所示
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

从ajax调用控制器方法,如下面的代码

 $.ajax({
        url:"your_url.do",
        type: "POST",
        data: {'somename':data},
        success: function(data)
        {
            console.log(data);
        }
    });

它会起作用。