{"id":24,"date":"2007-07-25T06:34:00","date_gmt":"2007-07-25T06:34:00","guid":{"rendered":"http:\/\/euve3303.vserver.de\/stefan\/blog\/?p=27"},"modified":"2011-12-01T20:35:22","modified_gmt":"2011-12-01T19:35:22","slug":"generisches-spring-servlet","status":"publish","type":"post","link":"https:\/\/cogito-ergo-blog.de\/blog\/2007\/07\/25\/generisches-spring-servlet\/","title":{"rendered":"Generisches Spring-Servlet"},"content":{"rendered":"<p>[:de]Manchmal braucht man neben den MVC Mechanismen von Spring-Web auch ein ganz normales Servlet, welches nicht einem Handler entspricht, der ModelAndView zur\u00fcckgibt. Leider ist so ein Servlet dann aber selbst keine Spring-Bean, sondern muss sich selbst des Spring-Contexts bedienen, um an die Spring-Beans heranzukommen und Dependencies zu setzen.<\/p>\n<p>Ein generisches Spring-Servlet, welches auf eine Servlet-Spring-Bean delegiert, schafft Abhilfe &#8230;<\/p>\n<p><!--more--><\/p>\n<p>Alles was es braucht ist eine Servlet-Deklaration in der web.xml:<\/p>\n<blockquote style=\"border: 1px solid gray; font-size: 100%; background-color: #eeeeee;\">\n<pre><span class=\"java14\">&lt;servlet&gt; &lt;servlet-name&gt;test&lt;\/servlet-name&gt; &lt;servlet-class&gt; com.rinke.solutions.spring.servlet.GenericSpringServlet &lt;\/servlet-class&gt; &lt;\/servlet&gt; <\/span><\/pre>\n<\/blockquote>\n<p>eine Bean Definition im Spring-Context:<\/p>\n<blockquote style=\"border: 1px solid gray; font-size: 100%; background-color: #eeeeee;\">\n<pre><span class=\"java14\">&lt;!-- define a servlet a spring bean, will be called from generic spring servlet --&gt; &lt;bean id=\"test\" class=\"com.rinke.solutions.TestServlet\" scope=\"prototype\"&gt; &lt;property name=\"..\" ref=\"..\"\/&gt; &lt;\/bean&gt; <\/span><\/pre>\n<\/blockquote>\n<p>Und ein Servlet wie dieses:<\/p>\n<blockquote style=\"border: 1px solid gray; overflow: auto; font-size: 100%; height: 300px; background-color: #eeeeee;\">\n<pre><tt class=\"java\"><span class=\"java4\">package <\/span><span class=\"java10\">com.rinke.solutions.spring.servlet; <\/span><span class=\"java4\">import <\/span><span class=\"java10\">java.io.IOException; <\/span><span class=\"java4\">import <\/span><span class=\"java10\">javax.servlet.ServletConfig; <\/span><span class=\"java4\">import <\/span><span class=\"java10\">javax.servlet.ServletException; <\/span><span class=\"java4\">import <\/span><span class=\"java10\">javax.servlet.ServletRequest; <\/span><span class=\"java4\">import <\/span><span class=\"java10\">javax.servlet.ServletResponse; <\/span><span class=\"java4\">import <\/span><span class=\"java10\">javax.servlet.http.HttpServlet; <\/span><span class=\"java4\">import <\/span><span class=\"java10\">org.springframework.web.context.support.WebApplicationContextUtils; <\/span><span class=\"java14\">\/** * generic servlet class that holds the springs WebApplicationContext in * its init method. it delegates to another servlet defines in the spring * context and injected through spring. * a servlet used a delegate should defined with scope 'prototype' otherwise when * the container tries to instanciate more than one instance of the generic * servlet the delegate still remain one singleton. * * <\/span><span class=\"java11\">@author <\/span><span class=\"java14\">ster *\/ <\/span><span class=\"java4\">public class <\/span><span class=\"java10\">GenericSpringServlet <\/span><span class=\"java4\">extends <\/span><span class=\"java10\">HttpServlet <\/span><span class=\"java8\">{ <\/span><span class=\"java4\">private <\/span><span class=\"java10\">HttpServlet delegate; <\/span><span class=\"java14\">\/** * just delegate to the \"spring\" servlet. * <\/span><span class=\"java11\">@inheritDoc <\/span><span class=\"java14\">* <\/span><span class=\"java11\">@see <\/span><span class=\"java14\">javax.servlet.Servlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) *\/ <\/span><span class=\"java16\">@Override <\/span><span class=\"java4\">public <\/span><span class=\"java9\">void <\/span><span class=\"java10\">service<\/span><span class=\"java8\">(<\/span><span class=\"java10\">ServletRequest req, ServletResponse res<\/span><span class=\"java8\">) <\/span><span class=\"java4\">throws <\/span><span class=\"java10\">ServletException, IOException <\/span><span class=\"java8\">{ <\/span><span class=\"java10\">delegate.service<\/span><span class=\"java8\">(<\/span><span class=\"java10\">req,res<\/span><span class=\"java8\">)<\/span><span class=\"java10\">; <\/span><span class=\"java8\">} <\/span><span class=\"java14\">\/** * retrieves a servlet bean from the context with the same name that the generic * servlet is configured. if one instance of the generic servlet is named 'test', * a spring bean with id 'test' is searched and used as delegate. * <\/span><span class=\"java11\">@inheritDoc <\/span><span class=\"java14\">* <\/span><span class=\"java11\">@see <\/span><span class=\"java14\">javax.servlet.Servlet#init(javax.servlet.ServletConfig) *\/ <\/span><span class=\"java16\">@Override <\/span><span class=\"java4\">public <\/span><span class=\"java9\">void <\/span><span class=\"java10\">init<\/span><span class=\"java8\">() <\/span><span class=\"java4\">throws <\/span><span class=\"java10\">ServletException <\/span><span class=\"java8\">{ <\/span><span class=\"java10\">ServletConfig config = getServletConfig<\/span><span class=\"java8\">()<\/span><span class=\"java10\">; delegate = <\/span><span class=\"java8\">(<\/span><span class=\"java10\">HttpServlet<\/span><span class=\"java8\">) <\/span><span class=\"java10\">WebApplicationContextUtils .getRequiredWebApplicationContext<\/span><span class=\"java8\">(<\/span><span class=\"java10\">config.getServletContext<\/span><span class=\"java8\">())<\/span><span class=\"java10\">.getBean<\/span><span class=\"java8\">( <\/span><span class=\"java10\">config.getServletName<\/span><span class=\"java8\">())<\/span><span class=\"java10\">; delegate.init<\/span><span class=\"java8\">(<\/span><span class=\"java10\">config<\/span><span class=\"java8\">)<\/span><span class=\"java10\">; delegate.init<\/span><span class=\"java8\">()<\/span><span class=\"java10\">; <\/span><span class=\"java8\">} }<\/span><\/tt><\/pre>\n<\/blockquote>\n<p>Per Konvention wird als Servlet &#8220;Bean&#8221; immer eine Bean, die so hei\u00dft wie der ServletName als Delegate benutzt.<br \/>\n[:en]<\/p>\n<p>Sometimes you need a simple servlet, which does not use spring mvc of the spring web package that does not deal with &quot;ModelAndView&quot;. Unfortunately such a servlet isn&#8217;t itself a spring bean and hence must use the WebApplicationContext to resolve dependencies and get to its &quot;worker&quot; spring beans.<\/p>\n<p>A generic spring servlet, which delegates to a spring bean, puts things right &#8230;<\/p>\n<p><!--more--><\/p>\n<p>All you need is a servlet declaration in web.xml:<\/p>\n<blockquote style=\"border: 1px solid gray; font-size: 100%; background-color: rgb(238, 238, 238);\">\n<pre><span class=\"java14\">&lt;servlet&gt;\r\n   &lt;servlet-name&gt;test&lt;\/servlet-name&gt;\r\n   &lt;servlet-class&gt;\r\n     com.rinke.solutions.spring.servlet.GenericSpringServlet\r\n   &lt;\/servlet-class&gt;\r\n&lt;\/servlet&gt;\r\n<\/span><\/pre>\n<\/blockquote>\n<p>a bean definition in the spring context:<\/p>\n<blockquote style=\"border: 1px solid gray; font-size: 100%; background-color: rgb(238, 238, 238);\">\n<pre><span class=\"java14\">&lt;!-- define a servlet a spring bean, \r\n       will be called from generic spring servlet --&gt;\r\n&lt;bean id=&quot;test&quot; class=&quot;com.rinke.solutions.TestServlet&quot; scope=&quot;prototype&quot;&gt;\r\n    &lt;property name=&quot;..&quot; ref=&quot;..&quot;\/&gt;\r\n&lt;\/bean&gt;\r\n<\/span><\/pre>\n<\/blockquote>\n<p>\nand a servlet like this:\n<\/p>\n<blockquote style=\"border: 1px solid gray; overflow: auto; font-size: 100%; height: 300px; background-color: rgb(238, 238, 238);\">\n<pre><tt class=\"java\"><span class=\"java4\">package <\/span><span class=\"java10\">com.rinke.solutions.spring.servlet;\r\n\r\n<\/span><span class=\"java4\">import <\/span><span class=\"java10\">java.io.IOException;\r\n\r\n<\/span><span class=\"java4\">import <\/span><span class=\"java10\">javax.servlet.ServletConfig;\r\n<\/span><span class=\"java4\">import <\/span><span class=\"java10\">javax.servlet.ServletException;\r\n<\/span><span class=\"java4\">import <\/span><span class=\"java10\">javax.servlet.ServletRequest;\r\n<\/span><span class=\"java4\">import <\/span><span class=\"java10\">javax.servlet.ServletResponse;\r\n<\/span><span class=\"java4\">import <\/span><span class=\"java10\">javax.servlet.http.HttpServlet;\r\n\r\n<\/span><span class=\"java4\">import <\/span><span class=\"java10\">org.springframework.web.context.support.WebApplicationContextUtils;\r\n\r\n<\/span><span class=\"java14\">\/**\r\n * generic servlet class that holds the springs WebApplicationContext in\r\n * its init method. it delegates to another servlet defines in the spring\r\n * context and injected through spring.\r\n * a servlet used a delegate should defined with scope 'prototype' otherwise when\r\n * the container tries to instanciate more than one instance of the generic\r\n * servlet the delegate still remain one singleton.\r\n *\r\n * <\/span><span class=\"java11\">@author <\/span><span class=\"java14\">ster\r\n *\/\r\n<\/span><span class=\"java4\">public class <\/span><span class=\"java10\">GenericSpringServlet <\/span><span class=\"java4\">extends <\/span><span class=\"java10\">HttpServlet <\/span><span class=\"java8\">{\r\n\r\n    <\/span><span class=\"java4\">private <\/span><span class=\"java10\">HttpServlet delegate;\r\n    <\/span><span class=\"java14\">\/**\r\n     * just delegate to the &quot;spring&quot; servlet.\r\n     * <\/span><span class=\"java11\">@inheritDoc\r\n     <\/span><span class=\"java14\">* <\/span><span class=\"java11\">@see <\/span><span class=\"java14\">javax.servlet.Servlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)\r\n     *\/\r\n    <\/span><span class=\"java16\">@Override\r\n    <\/span><span class=\"java4\">public <\/span><span class=\"java9\">void <\/span><span class=\"java10\">service<\/span><span class=\"java8\">(<\/span><span class=\"java10\">ServletRequest req, ServletResponse res<\/span><span class=\"java8\">) <\/span><span class=\"java4\">throws <\/span><span class=\"java10\">ServletException, IOException <\/span><span class=\"java8\">{\r\n        <\/span><span class=\"java10\">delegate.service<\/span><span class=\"java8\">(<\/span><span class=\"java10\">req,res<\/span><span class=\"java8\">)<\/span><span class=\"java10\">;\r\n    <\/span><span class=\"java8\">}\r\n\r\n    <\/span><span class=\"java14\">\/**\r\n     * retrieves a servlet bean from the context with the same name that the generic\r\n     * servlet is configured. if one instance of the generic servlet is named 'test',\r\n     * a spring bean with id 'test' is searched and used as delegate.\r\n     * <\/span><span class=\"java11\">@inheritDoc\r\n     <\/span><span class=\"java14\">* <\/span><span class=\"java11\">@see <\/span><span class=\"java14\">javax.servlet.Servlet#init(javax.servlet.ServletConfig)\r\n     *\/\r\n    <\/span><span class=\"java16\">@Override\r\n    <\/span><span class=\"java4\">public <\/span><span class=\"java9\">void <\/span><span class=\"java10\">init<\/span><span class=\"java8\">() <\/span><span class=\"java4\">throws <\/span><span class=\"java10\">ServletException <\/span><span class=\"java8\">{\r\n        <\/span><span class=\"java10\">ServletConfig config = getServletConfig<\/span><span class=\"java8\">()<\/span><span class=\"java10\">;\r\n        delegate = <\/span><span class=\"java8\">(<\/span><span class=\"java10\">HttpServlet<\/span><span class=\"java8\">) <\/span><span class=\"java10\">WebApplicationContextUtils\r\n                .getRequiredWebApplicationContext<\/span><span class=\"java8\">(<\/span><span class=\"java10\">config.getServletContext<\/span><span class=\"java8\">())<\/span><span class=\"java10\">.getBean<\/span><span class=\"java8\">(\r\n                        <\/span><span class=\"java10\">config.getServletName<\/span><span class=\"java8\">())<\/span><span class=\"java10\">;\r\n        delegate.init<\/span><span class=\"java8\">(<\/span><span class=\"java10\">config<\/span><span class=\"java8\">)<\/span><span class=\"java10\">;\r\n        delegate.init<\/span><span class=\"java8\">()<\/span><span class=\"java10\">;\r\n    <\/span><span class=\"java8\">}\r\n\r\n}<\/span><\/tt>\r\n<\/pre>\n<\/blockquote>\n<p>\nThe convention is simple: use a spring &quot;servlet&quot; bean with the same name as the servlet name as delegate.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>[:de]Manchmal braucht man neben den MVC Mechanismen von Spring-Web auch ein ganz normales Servlet, welches nicht einem Handler entspricht, der ModelAndView zur\u00fcckgibt. Leider ist so ein Servlet dann aber selbst keine Spring-Bean, sondern muss sich selbst des Spring-Contexts bedienen, um &hellip; <a href=\"https:\/\/cogito-ergo-blog.de\/blog\/2007\/07\/25\/generisches-spring-servlet\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[],"_links":{"self":[{"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/posts\/24"}],"collection":[{"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/comments?post=24"}],"version-history":[{"count":2,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/posts\/24\/revisions"}],"predecessor-version":[{"id":52,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/posts\/24\/revisions\/52"}],"wp:attachment":[{"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/media?parent=24"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/categories?post=24"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cogito-ergo-blog.de\/blog\/wp-json\/wp\/v2\/tags?post=24"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}