4

我有一个 spring 3.1 Web 应用程序并正在尝试发出 ajax 请求,但在 firebug 中我可以看到我的映射未找到。我尝试了各种方法,但无法达到我的控制器方法。以下是一些细节:

我有我的 web.xml:

<servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/ctrl/*</url-pattern>
</servlet-mapping>

这是我的控制器中的:

@RequestMapping(value="/ctrl/test", method = RequestMethod.GET)
public @ResponseBody String test() {
    System.out.println("method test()");
    return "aString";
}

这个我在我的 dispatcher-servlet.xml 中有:

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

我有另一个请求映射到我的控制器中的一个方法,并且该请求正在工作,但它不是 ajax:

@RequestMapping(value="/ctrl", method = RequestMethod.GET)
public String printWelcome(ModelMap model, HttpSession session) {
    initializeTree(session);
    return "tree";
}

任何人都可以指出我正确的方向吗?

4

3 回答 3

2

我总是使用基于 ajax 的链接作为 *.action 或 *.ajax 用于基于 AJAX 的请求和 *.html 映射用于 jsp 视图。那么你的调度器 Servlet 应该如下

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

下一步:

如果您所有的 ajax 命令 URI 都以 /ctrl 开头,我向您推荐以下内容:

@Controller
@RequestMapping(value="/ctrl")
public class AjaxController{

@RequestMapping(value="/test.ajax", method = RequestMethod.GET)

public String test(ModelMap model, HttpSession session) {
    System.out.println("method test()");
    return "test";

}
}

不要忘记为@ResponseBody基于 ajax 的映射添加注释。

现在 index.html 的视图控制器应该如下:

@Controller
public class ViewController{

@RequestMapping(value="/index.html", method = RequestMethod.GET)
@ResponseBody
public String test(ModelMap model, HttpSession session) {
    System.out.println("method test()");
    return "index";

}
}
于 2012-04-25T12:36:13.450 回答
0

我找到了一个解决方案:

在我的 web.xml 中:

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/ctrl/*</url-pattern>
</servlet-mapping>

在我的控制器中:

@RequestMapping(value="/test", method = RequestMethod.GET)
public String test(ModelMap model, HttpSession session) {
    System.out.println("method test()");
    return null;
}

在客户端,我使用 jQuery:

$.get(
     "ctrl/test/",
     function(data){
         alert(data);
});

我可以以此为基础;我的 System.out.println 正在打印,所以我现在可以访问我的控制器

于 2013-04-19T09:08:23.913 回答
0

您的调度程序 servlet 未映射到/ctrl/test,因此不会为 AJAX 控制器调用它。

改变你servlet-mapping

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/ctrl/*</url-pattern>
</servlet-mapping>

这样调度程序就可以调度这两个 URL。

有关更多信息,这可能会有所帮助(Weblogic 特定但一般适用):http ://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/components.html#148787

于 2012-04-25T07:42:24.853 回答