2013-03-12 25 views
2

我有一個條目servlet(稱爲DispatcherServlet),它根據配置參數將所有傳入的GET和POST請求重定向到/ *到其他servlet。爲了將請求分發給其他servlet,我使用它們的名稱而不是路徑,因爲我的DispatcherServlet在聽取/ *時會以無限循環結束。Servlet:在使用註釋而不是web.xml時,通過名稱向servlet轉發請求?

「舊」的方式是給的servlet在web.xml描述了一個名字:

<servlet> 
    <servlet-name>MyServlet</servlet-name> 
    <servlet-class>mypackage.MyServlet</servlet-class> 
</servlet> 

之後,一個人能夠使用RequestDispatcher時它的名字,以解決該servlet,例如,。我的DispatcherServlet中的代碼如下所示:

RequestDispatcher dispatcher = getServletContext()。getNamedDispatcher(「MyServlet」); dispatcher.forward(request,response);

這個效果很好。但是,我想用「新」的Servlet 3個標註不web.xml中,所以我這樣做:

@WebServlet(name="MyServlet") 
public class MyServlet extends HttpServlet { 
    ... 

但現在,我的DispatcherServlet內getServletContext().getNamedDispatcher("MyServlet")返回,而不是爲MyServlet適當的調度雖然我希望@WebServlet(name="MyServlet")行爲同樣喜歡<servlet-name>MyServlet</servlet-name>

我已經在Tomcat 7測試這個 這是因爲MyServlet沒有被時間尚未加載DispatcherServlet的時候被調用,因此MyServlet的名字不知道?如果是這樣,@WebServlet(name="...")註釋是什麼意思;)

請不要回答像「爲什麼你不使用過濾器?」等等。這更多關於註釋和web.xml的背景。

在此先感謝!

(PS請更改標題,如果你找到更合適的一個。))

回答

0

如果不與指定的名稱urlMapping中,你將需要做的添加類的全名。像

RequestDispatcher dispatcher = getServletContext(). 
             getNamedDispatcher("mypackage.MyServlet"); 

它爲我如果servlet被註釋爲:

@WebServlet(urlPatterns="/Servlet", name="Servlet") 

或更好:

@WebServlet(urlPatterns="/Servlet", displayName="Servlet", name="Servlet") 

此外,您還可以嘗試讓你的servlet名稱:

getServletName() 
0

只需發表評論@WebServlet不足以將Servlet加載到Web容器中;您必須至少包含一個URL模式,並且如果您不希望公開Servlet以僅保留內部轉發,請將URL設置爲以'/ WEB-INF /'開頭。

並記住,'名稱'屬性是越野車,所以不使用它。

@WebServlet(urlPatterns = "/WEB-INF/thisServlet") 
public class FooServlet extends HttpServlet { 
... 
} 

,並轉發請求,稱這樣的事情:

servletContext.getNamedDispatcher(FooServlet.class.getName()).forward(request, response); 
相關問題