2013-04-30 64 views
0

我有這個在web.xml:Spring如何從jsp中知道使用什麼控制器?

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<!-- Dispatching handled by StaticFilter --> 
<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

我有這個dispatcher-servlet.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 

    <context:annotation-config/> 

    <!-- Activates scanning of @Repository --> 
    <context:component-scan base-package="com.pronto.mexp" /> 

    <!-- View Resolver for JSPs --> 
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="requestContextAttribute" value="rc"/> 
     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
     <property name="prefix" value="/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 
</beans> 

我有這樣的AlertsController:

@Controller 
public class AlertsController { 

    protected final Log logger = LogFactory.getLog(getClass()); 

    @Autowired 
    private AlertManager alertManager; 

    @RequestMapping("/alerts") 
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 

     // display in view 
     logger.info("Returning alerts view"); 

     List<Alert> alerts = alertManager.getAlerts(); 
     request.setAttribute("alerts", alerts); 

     return new ModelAndView(); 
    } 

    public void setAlertManager(AlertManager alertManager) { 
     this.alertManager = alertManager; 
    } 
} 

而且我有這在alerts.jsp中:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 

<h3>ALERTS</h3> 

<table border="1"> 
<c:forEach var="alert" items="${alerts}"> 
    <tr> 
    <td>${alert.hostname}</td> 
    <td>${alert.message}</td> 
    <td>${alert.program}</td> 
    <td><fmt:formatDate value="${alert.date}" dateStyle="medium"/></td> 
    </tr> 
</c:forEach> 
</table> 

但是,當我啓動應用程序並將瀏覽器指向localhost:8080/alerts.jsp時,我只能看到標題「ALERTS」,而沒有其他東西。這就像Spring不知道使用AlertsController。我知道我要離開一些關鍵配置,但我看不到它。

回答

2

你正在做的與你應該的相反。這不是JSP知道要使用哪個控制器,而是Controller知道要呈現哪個視圖(JSP)。該控制器由其url映射執行,該映射在@RequestMapping屬性中定義。當你直接訪問你的JSP時,你根本就沒有經歷過Spring。因此請嘗試使用網址http://localhost:8080/context/alerts代替context與Web應用程序的上下文路徑。

+0

謝謝!還有一個問題 - 我在哪裏可以找到Web應用程序的上下文路徑? – barclay 2013-04-30 20:33:45

+0

如果你可以用'localhost:8080/alert.jsp'訪問你的JSP,那麼它是空白的。但通常在部署應用程序時進行配置。 – NilsH 2013-04-30 20:46:31

0

我的同事指出我的調度員servlet.xml中還缺少MVC指令在我的控制器掃描註釋:

<!-- Configures the @Controller programming model --> 
<mvc:annotation-driven/> 

因此,即使當我localhost:8080/alerts指着我的瀏覽器(因爲我沒有背景路徑配置),它仍然失敗。一旦我添加了mvc指令,就會調用控制器,並將動態內容發送給jsp。

+0

但是,由於我的同事拒絕註冊SO帳戶,因此我將給予@NilsH他的一半答案。 IDK爲什麼! – barclay 2013-04-30 20:52:13

0

一行答:你在呼喚它,你必須調用錯誤的方法/警報不alerts.jsp

但爲什麼你得到這個空白頁,因爲你調用JSP不直接由控制器設定值,你把JSP文件根目錄下

<property name="prefix" value="/"/> 

,使其接近,最好是把它放在WEB-INF,以防止直接訪問

<property name="prefix" value="/WEB-INF/jsps/"/> 
+0

我得到空白頁面,因爲控制器沒有被調用。看到我的答案,上面。但是就你而言,還有你之前的NilsH,我注意到,我錯誤地稱它爲/後退思考。 – barclay 2013-05-01 15:48:02

+0

「控制器沒有被調用」因​​爲你正在調用「/alerts.jsp」,而控制器正在監聽「/ alerts」@RequestMapping(「/ alerts」) – 2013-05-01 15:57:53

+0

對不起,但正如我在上面的答案中提到的,即使在我打電話給「/警報」它仍然失敗。控制器沒有被調用,因爲Spring不知道爲控制器尋找註釋。 – barclay 2013-05-01 16:21:56

相關問題