Un des problèmes intéressants que j'ai trouvé est que je veux souvent que mon servlet soit un bean géré par Spring. De cette façon, il peut effectuer toutes les injections de dépendances, etc. Mais normalement, vous devez spécifier vos servlets dans web.xml, ce qui signifie que votre conteneur (par exemple Tomcat), et non Spring, créera le servlet.
Il existe un moyen de contourner cela, en utilisant le HttpRequestHandlerServlet. Mon fichier web.xml comprend ces lignes:
<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>
Cela dit printemps qu'il va utiliser deux de ses haricots servlets, l'un appelé dataProvider, et l'autre appelé documentCreator. Il faudra déterminer ce que sont ces beans, soit en utilisant le fichier de configuration xml ou les annotations. Je préfère les annotations, telles que @Controller. Que se passe-t-il lorsque Tomcat reçoit une requête, par exemple GET/dataProvider/test Dans la section de mappage de servlet, il sait qu'il doit donner cette requête au premier HttpRequestHandlerServlet qu'il a créé. Cette classe sait qu'elle porte le nom dataProvider et elle recherche dans le contexte Spring un bean appelé dataProvider. Ensuite, il appelle la méthode handleRequest sur ce bean.
Ma classe DataProvider ressemble à ceci:
@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);
}
}
}
Je pense qu'il est un peu regrettable que nous avons besoin de cette méthode handleRequest() (et si vous utilisez autre chose que publierez, vous devrez ajouter eux là-dedans). Ce serait plus agréable si HttpRequestHandlerServlet pouvait faire ce travail pour vous, mais c'est comme ça que ça fonctionne pour le moment.
Pouvez-vous décrire davantage le problème réel? – John