【问题标题】:Ajax call implementation with Controller interface in SpringSpring中带有Controller接口的Ajax调用实现
【发布时间】:2014-05-15 01:57:17
【问题描述】:

目前我在 Spring mvc 的遗留项目中,注释没有在它上面工作。

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

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

我可以用这个实现一个 jsp 页面,但无法将它用于 ajax 调用。

寻求link1link2link3的帮助

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 将如何知道 this 是应该调用的控制器。我是否缺少任何映射?

请帮忙。

【问题讨论】:

    标签: ajax json spring spring-mvc


    【解决方案1】:

    这是一个示例,说明如何从 ajax 函数调用 Spring MVC 控制器 这一切都是使用注释驱动的环境完成的。

    1) 需要先驱动应用注解,然后把你的控制器包放在那里。

    2) 将@RequestMapping 添加到要从ajax fn 调用的fn,并提供映射URL 到ajax fn '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。

    【讨论】:

    • 感谢您的回答 @neel4soft.Yr 是正确的,但正如我的问题所述,由于 Spring 版本非常旧,没有像 Requestmapping 或 requestBody 这样的注释对我有用。
    【解决方案2】:

    最后我得到了一个解决方案(不是通过 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>
    

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 2015-11-22
      • 1970-01-01
      • 2017-12-26
      • 2014-08-08
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多