2012-04-25 144 views
5

我有一個spring 3.1 web應用程序,並試圖發出ajax請求,但在firebug中,我可以看到我的映射未找到。我嘗試了各種各樣的東西,但無法達到我的控制器方法。這裏還有一些細節:spring ajax請求

這個我有我我的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"; 
} 

這個我有我的調度員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"; 
} 

任何人都可以指向正確的方向嗎?

回答

1

我找到了一個解決方案:

在我的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; 
} 

關於c在我的方面,我使用jQuery:

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

我可以建立在此;我的System.out.println正在打印,所以我可以到達我的控制器現在

1

您的調度程序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

+0

謝謝你的回答;我嘗試了你的建議。在啓動JBoss時,我可以看到下面的url正被映射:[/ ctrl/test],[/ctrl/test.*],[/ ctrl/test /],[/ ctrl],[/ctrl.*]和[/CTRL /]。但我仍然無法達到我的處理程序方法(公共@ResponseBody字符串測試())。 – Tom 2012-04-25 07:47:20

+0

您的AJAX控制器是否發送GETs,或者有可能使用POSTs? – beny23 2012-04-25 07:49:18

+0

它發送一個獲取請求 – Tom 2012-04-25 07:56:54

3

我一直在使用基於AJAX的鏈接爲* .action或*基於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"; 

} 
} 
+0

thx爲提示;我喜歡基於ajax請求的擴展。 – Tom 2012-04-25 14:12:32