我發現的一個有趣的問題是我經常希望我的servlet成爲一個Spring管理的bean。這樣,它可以執行所有的依賴注入等。但通常,您必須在web.xml中指定servlet,這意味着您的容器(例如Tomcat)而不是Spring會創建servlet。
有一種解決方法,使用HttpRequestHandlerServlet。我的web.xml文件中包括這些行:
<servlet>
<servlet-name>dataProvider</servlet-name>
<servlet-class>
org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>documentCreator</servlet-name>
<servlet-class>
org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dataProvider</servlet-name>
<url-pattern>/dataProvider/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>documentCreator</servlet-name>
<url-pattern>/documentCreator/*</url-pattern>
</servlet-mapping>
這告訴Spring,它的要使用它的兩個豆爲小服務程序,一個名爲dataProvider的,另一種叫documentCreator。必須使用xml配置文件或註釋來確定這些bean是什麼。我更喜歡註釋,比如@Controller。
那麼當Tomcat收到請求時會發生什麼,例如GET/dataProvider/test 從servlet映射部分,它知道它必須將該請求提交給它創建的第一個HttpRequestHandlerServlet。該類知道它具有名稱dataProvider,並且它在Spring上下文中查找名爲dataProvider的bean。然後它調用該bean上的handleRequest方法。
我DataProvider類看起來是這樣的:
@Controller
public class DataProvider extends HttpServlet implements HttpRequestHandler {
@Autowired
private OtherBeanType otherBean
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
// my doGet method
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
// my doPost method
}
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (request.getMethod().equalsIgnoreCase("GET")) {
doGet(request, response);
} else if (request.getMethod().equalsIgnoreCase("POST")) {
doPost(request, response);
}
}
}
我覺得這是一個有點不幸的是,我們需要一個handleRequest()方法(如果你使用比其他任何獲取和發佈,您會需要添加他們在那裏)。如果HttpRequestHandlerServlet可以爲你工作,那將會更好,但這就是它現在的工作方式。
你能更詳細地描述實際問題嗎? – John 2010-03-29 09:59:31