2016-06-10 71 views
2

我是Spring MVC的新手。我有基本的Rest Controller和JSP。我希望能夠從JSP中訪問請求映射註釋中的URL。我注意到Spring MVC 4.1中的mvcUrl允許你這樣做。但是當我嘗試這個時遇到錯誤:SpringMVC - 錯誤使用mvcUrl - 缺少WebApplicationContext

當我打開localhost/test.jsp。我看到這個在瀏覽器:

org.apache.jasper.JasperException: javax.el.ELException: Problems calling function 's:mvcUrl' 
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:556) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:477)  
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)  
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339) 
    ..... 

java.lang.IllegalArgumentException: Cannot lookup handler method mappings without WebApplicationContext 
    org.springframework.util.Assert.notNull(Assert.java:115) 
    org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.getRequestMappingInfoHandlerMapping(MvcUriComponentsBuilder.java:521) 
    org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.fromMappingName(MvcUriComponentsBuilder.java:330) 
    org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.fromMappingName(MvcUriComponentsBuilder.java:313) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    .... 

下面是我用

@RestController 
@RequestMapping("/foo") 
public class FooRestController { 
    @RequestMapping(value = "/hello", method = RequestMethod.GET) 
    public String hello() { 
      return "hello"; 
    } 
} 

JSP文件中的一些示例代碼 - test.jsp的

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %> 

<a href="${s:mvcUrl('FRC#hello').build()}">Link to Hello</a> 

可能是什麼設置錯了嗎?

當我打localhost/foo/hello我確實收到一個json字符串"hello"。這是不是意味着調度程序servlet工作正常,並且WebApplicationContext實際設置正確?

+0

如果它返回「你好」,那麼你可以說「你好」,不需要編碼。 –

+0

不,這意味着你應該使用'@ Controller'而不是'@ RestController'。 – kryger

+0

我不知道我理解你。 – Jaskirat

回答

2

這裏的問題是:您只爲/foo/hello定義了控制器處理程序,但是沒有爲/test.jsp定義控制器處理程序。嘗試添加一個新的控制器:

@Controller 
@RequestMapping("/") 
public class GeneralController { 
    ... 

    @RequestMapping(value = "/test.jsp", method = RequestMethod.GET) 
    public String hello() { 
      return "test"; // put the view name here. You won't need ".jsp" because it would be automatically added by the view resolver in the configuration below 
    } 
} 

,使存在於您的配置確保類似的代碼,以便系統知道在哪裏尋找你的觀點

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <property name="prefix" value="/WEB-INF/[Your_JSP_FOLDER]"/> 
    <property name="suffix" value=".jsp"/> 
</bean> 
+1

同意的錯誤來自於:斷言WebApplicationContext == null,因爲它無法解析源文件視圖 – Destrif

+0

非常感謝您使用MvcUriComponentsBuilder.java。你是對的。我早些時候嘗試過。因爲我意識到jsp文件沒有被Spring MVC正確渲染,也許是因爲我從來沒有通過調度器servlet運行它,而只是簡單地爲它服務。但是,那時候,我仍然得到了同樣的錯誤。不知道我做錯了什麼。再次感謝! – Jaskirat

+1

寫得很好的答案。接受這個。你得到賞金。 – Jaskirat

0

我不認爲這是一個配置問題我們也面臨類似的問題,唯一的解決方案是使用modelandview而不是返回視圖作爲控制器中的字符串

1

這與您使用的配置文件不存在問題 @RestController annotaion i n您的控制器,它是一個便利的註釋,它本身用@Controller和@ResponseBody註解。正如你可能知道使用@ResponseBody註釋你的類將會返回來自coltroller的方法的json響應,這是在這種情況下的預期行爲。

如果你想獲得JSP文件,你應該使用什麼

1.使用@Controller代替@RestController 2.Assuming你已經配置視圖解析器使用前綴和後綴的jsp頁面並返回測試從該方法的字符串,因爲您的jsp文件名稱說它的名稱是測試。

希望這回答你的問題。

+0

很好的答案。 (+1)你是對的。 view/jsp需要通過spring servlet解決,而不是僅僅使用默認的tomcat servlet來提供。 – Jaskirat