在Spring中使用Controller接口实现Ajax调用实现

时间:2014-05-15 01:57:18

标签: ajax json spring spring-mvc

目前我正处于Spring mvc的遗留项目中,并且注释无法正常使用。

我必须创建一个控制器动作,它将响应带有JSON响应的ajax调用。

我通过实施Controller接口创建了我的控制器。

我可以用这个实现一个jsp页面但是无法调整它以进行ajax调用。

link1 link2 link3

获取帮助

action-servlet.xml中的Xml配置

<bean id="jsonResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
    <property name="order"><value>1</value></property>
</bean>
<bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView">
    <property name="contentType">
        <value>text/html</value>
    </property>
</bean>

<bean id="myOwnController" class="com.myapp.webapp.action.MyOwnController" />


<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="interceptors">
        <list>
            <!-- list of inteceptor urls -->
        </list>
    </property>
        <property name="mappings">
        <props>
                    <prop key="/mytest">myOwnController</prop>
            <!-- mapping for other controller actions -->
        </props>
    </property>
</bean>

控制器类

package com.myapp.webapp.action
public class myOwnController implements org.springframework.web.servlet.mvc.Controller
{   
    @Override
    public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception
    {
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("success", "true");
        return new ModelAndView("jsonView", model);
    }
}

ajax调用js方法(在Prototype.js中)

function myAjaxMethod(){
    new Ajax.Request('${pageContext.request.contextPath}/jsonView', {
          method:'get',
          onSuccess: function(transport) {
            var response = transport.responseText || "no response text";
            alert("Success! \n\n" + response);
          },
          onFailure: function() { alert('Something went wrong...'); }
        });
}

此外,我无法理解ajax调用中的url如何知道这是应该调用的控制器。我是否缺少任何映射?

请帮忙。

2 个答案:

答案 0 :(得分:0)

以下是如何从ajax函数调用spring MVC控制器的示例 这都是使用注释驱动的环境完成的。

1)首先需要驱动应用程序注释并将控制器包放在那里。

2)将@RequestMapping添加到将从ajax fn调用的fn中,并为ajax fn'url'属性提供maping URL。

p [om.xml

中的变化

需要添加,跟随库转换并以json的形式向ajax成功发送响应。

 <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>

spring conf文件中的更改

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

控制器代码:

@RequestMapping(value = "/save", method = RequestMethod.POST, headers = { "Content-type=application/json" })
    public @ResponseBody
    Response saveData(@RequestBody Employee employee) {
        System.out.println("First Name: " + employee.getFirstName());
        System.out.println("Last Name: " + employee.getLastName());
        System.out.println("Email: " + employee.getEmail());
        System.out.println("Phone: " + employee.getPhone());

        return new Response("1", "Done");
    }

ajax函数语法

   function doAjaxPost() {
        var formData = JSON.stringify({
            firstName : $('#firstName').val(),
            lastName : $('#lastName').val(),
            email : $('#email').val(),
            phone : $('#phone').val()
        });

        $.ajax({
            type : "POST",
            url : "save",
            data : formData,
            contentType : 'application/json',
            success : function(data) {
                if (data.status == '1')
                    $('#status').html('Form data sent !');
                else
                    $('#status').html('Error in sending data !');
            }
        });
    }

希望这会有所帮助。 使用按钮而不是提交来阻止提交表单上的页面加载并调用ajax fn onClick。

答案 1 :(得分:0)

最后我得到了一个解决方案(不是通过Spring,而是通过一个脏逻辑)。

警告:永远不要使用旧的Spring版本项目。

解决方案:我在ajax调用中呈现了整个html响应,过滤了我的数据并解析为json。

action-servlet.xml文件

<bean id="myOwnController" class="com.myapp.webapp.action.MyOwnController" />

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="interceptors">
        <list>
            <!-- list of inteceptor urls -->
        </list>
    </property>
        <property name="mappings">
        <props>
                    <prop key="/mytest.html">myOwnController</prop>
            <!-- mapping for other controller actions -->
        </props>
    </property>
</bean>

控制器类

package com.myapp.webapp.action
public class myOwnController implement org.springframework.web.servlet.mvc.Controller
{   
    @Override
    public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception
    {
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("name", "davy jones");
        return new ModelAndView("mytest", model);
    }
}

调用jsp Ajax调用

function createFreshdeskUser(){
    new Ajax.Request('${pageContext.request.contextPath}/mytest.html', {
          method:'get',
          onSuccess: function(transport) {
            var divIdWordLength=16;
            var htmlData=transport.responseText;
            var startIndex=htmlData.indexOf("<div id=\"mydiv\">");
            var endHtmlData=htmlData.substring(startIndex+divIdWordLength , htmlData.length);
            var endIndex=endHtmlData.indexOf("</div>");
            var finalHtmlData=endHtmlData.substring(0,endIndex);
            var jsonObj=eval ("(" + finalHtmlData + ")");
            alert(jsonObj.name);
          },
          onFailure: function() { alert('Something went wrong...'); }
        });
}

mytest.jsp

<head>
</head>
<body>
    <div id="mydiv">{'name':'${name}'}</div>
</body>
</html>