| I"/<p>This example shows you how to configure Wicket to run without any XML definitions. |
| It requires to use the Servlet 3.x API and a container which is able to load the |
| web component definitions via annotations defined within this standard.</p> |
| |
| <h2 id="creating-the-web-components">Creating the web components</h2> |
| |
| <h3 id="myfilterjava">MyFilter.java</h3> |
| |
| <p>First you have to configure the filter which was done within the web.xml in previous versions |
| of the Servlet specification. All initialization parameters are configured also via annotations. |
| The Application class is defined in the init param with the name applicationClassName.</p> |
| |
| <figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kn">import</span> <span class="nn">javax.servlet.annotation.WebFilter</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">javax.servlet.annotation.WebInitParam</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.apache.wicket.protocol.http.WicketFilter</span><span class="o">;</span> |
| |
| <span class="nd">@WebFilter</span><span class="o">(</span><span class="n">value</span> <span class="o">=</span> <span class="s">"/*"</span><span class="o">,</span> <span class="n">initParams</span> <span class="o">=</span> <span class="o">{</span> |
| <span class="nd">@WebInitParam</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"applicationClassName"</span><span class="o">,</span> |
| <span class="n">value</span> <span class="o">=</span> <span class="s">"com.my.package.MyApplication"</span><span class="o">),</span> |
| <span class="nd">@WebInitParam</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"configuration"</span><span class="o">,</span> <span class="n">value</span> <span class="o">=</span> <span class="s">"development"</span><span class="o">)</span> <span class="o">})</span> |
| <span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyFilter</span> <span class="kd">extends</span> <span class="nc">WicketFilter</span> <span class="o">{}</span></code></pre></figure> |
| |
| <h3 id="mycontextloaderlistenerjava">MyContextLoaderListener.java</h3> |
| |
| <p>Another important class is the ContextLoaderListener which in our case is going to initialize |
| the Spring Framework’s context and effects a package scan for Spring components. Usually |
| those Spring components are initialized with specific annotations like @Component or @Service for |
| example. You have to place them into the scanned package or in sub packages. (com.my.package in this case)</p> |
| |
| <figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kn">import</span> <span class="nn">javax.servlet.annotation.WebListener</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.springframework.web.context.ContextLoaderListener</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.springframework.web.context.WebApplicationContext</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.springframework.web.context.support.AnnotationConfigWebApplicationContext</span><span class="o">;</span> |
| |
| <span class="nd">@WebListener</span> |
| <span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyContextLoaderListener</span> <span class="kd">extends</span> <span class="nc">ContextLoaderListener</span> <span class="o">{</span> |
| |
| <span class="kd">public</span> <span class="nf">MyContextLoaderListener</span><span class="o">()</span> <span class="o">{</span> |
| <span class="kd">super</span><span class="o">(</span><span class="n">getWebApplicationContext</span><span class="o">());</span> |
| <span class="o">}</span> |
| |
| <span class="kd">private</span> <span class="kd">static</span> <span class="nc">WebApplicationContext</span> <span class="nf">getWebApplicationContext</span><span class="o">()</span> <span class="o">{</span> |
| <span class="nc">AnnotationConfigWebApplicationContext</span> <span class="n">context</span> |
| <span class="o">=</span> <span class="k">new</span> <span class="nc">AnnotationConfigWebApplicationContext</span><span class="o">();</span> |
| <span class="n">context</span><span class="o">.</span><span class="na">scan</span><span class="o">(</span><span class="s">"com.my.package"</span><span class="o">);</span> |
| <span class="n">context</span><span class="o">.</span><span class="na">refresh</span><span class="o">();</span> |
| <span class="k">return</span> <span class="n">context</span><span class="o">;</span> |
| <span class="o">}</span> |
| <span class="o">}</span></code></pre></figure> |
| |
| <h3 id="myrequestcontextlistenerjava">MyRequestContextListener.java</h3> |
| |
| <p>To configure Spring Framework to recognize the request context a RequestContextListener needs to be |
| defined. This listener enables the web project to use beans with a scope. So if you want a bean |
| to remain in the session as long as the user is surfing on your web page you can do this by adding the |
| annotation @SessionScope together with @Component.</p> |
| |
| <figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kn">import</span> <span class="nn">javax.servlet.annotation.WebListener</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.springframework.web.context.request.RequestContextListener</span><span class="o">;</span> |
| |
| <span class="nd">@WebListener</span> |
| <span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyRequestContextListener</span> <span class="kd">extends</span> <span class="nc">RequestContextListener</span><span class="o">{}</span></code></pre></figure> |
| |
| <h3 id="mysessionbeanjava">MySessionBean.java</h3> |
| |
| <p>This is a small example of a session scoped bean within the “com.my.package” package. It can be |
| autowired by using the @SpringBean annotation in any wicket component like a WebPage or a Panel.</p> |
| |
| <figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kn">import</span> <span class="nn">javax.annotation.PostConstruct</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">javax.servlet.http.HttpSession</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.springframework.beans.factory.annotation.Autowired</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.springframework.stereotype.Component</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.springframework.web.context.annotation.SessionScope</span><span class="o">;</span> |
| |
| <span class="nd">@Component</span> |
| <span class="nd">@SessionScope</span> |
| <span class="kd">public</span> <span class="kd">class</span> <span class="nc">MySessionBean</span> <span class="o">{</span> |
| |
| <span class="nd">@Autowired</span> |
| <span class="kd">private</span> <span class="nc">HttpSession</span> <span class="n">httpSession</span><span class="o">;</span> |
| |
| <span class="nd">@PostConstruct</span> |
| <span class="kd">public</span> <span class="kt">void</span> <span class="nf">postConstruct</span><span class="o">()</span> <span class="o">{</span> |
| <span class="c1">// do something after the bean has been constructed</span> |
| <span class="o">}</span> |
| |
| <span class="kd">public</span> <span class="nc">HttpSession</span> <span class="nf">getHttpSession</span><span class="o">()</span> <span class="o">{</span> |
| <span class="k">return</span> <span class="n">httpSession</span><span class="o">;</span> |
| <span class="o">}</span> |
| <span class="o">}</span></code></pre></figure> |
| |
| <p>Here you can see the autowiring in the component class:</p> |
| |
| <figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kn">import</span> <span class="nn">com.my.package.MySessionBean</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.apache.wicket.spring.injection.annot.SpringBean</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.apache.wicket.markup.html.WebPage</span><span class="o">;</span> |
| |
| <span class="kd">public</span> <span class="kd">class</span> <span class="nc">HelloWorld</span> <span class="kd">extends</span> <span class="nc">WebPage</span> <span class="o">{</span> |
| |
| <span class="nd">@SpringBean</span> |
| <span class="kd">private</span> <span class="nc">MySessionBean</span> <span class="n">mySessionBean</span><span class="o">;</span> |
| |
| <span class="kd">public</span> <span class="nf">HomePage</span><span class="o">()</span> <span class="o">{</span> |
| <span class="c1">// do something</span> |
| <span class="o">}</span> |
| <span class="o">}</span></code></pre></figure> |
| |
| <h2 id="creating-the-web-application-class">Creating the web application class</h2> |
| |
| <p>Within our application class it is required to hand over the Spring’s application context to the |
| SpringComponentInjector so that beans are also injected into Wicket components. If you are interested in how to |
| implement the home page and the corresponding HTML markup have a look at the corresponding |
| example: <a href="helloworld.html">Hello World!</a></p> |
| |
| <figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kn">import</span> <span class="nn">org.apache.wicket.Page</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.apache.wicket.protocol.http.WebApplication</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.apache.wicket.spring.injection.annot.SpringComponentInjector</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">org.springframework.web.context.support.WebApplicationContextUtils</span><span class="o">;</span> |
| <span class="kn">import</span> <span class="nn">com.my.package.HelloWorld</span><span class="o">;</span> |
| |
| <span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyApplication</span> <span class="kd">extends</span> <span class="nc">WebApplication</span> <span class="o">{</span> |
| |
| <span class="nd">@Override</span> |
| <span class="kd">public</span> <span class="nc">Class</span><span class="o"><?</span> <span class="kd">extends</span> <span class="nc">Page</span><span class="o">></span> <span class="nf">getHomePage</span><span class="o">()</span> <span class="o">{</span> |
| <span class="k">return</span> <span class="nc">HelloWorld</span><span class="o">.</span><span class="na">class</span><span class="o">;</span> |
| <span class="o">}</span> |
| |
| <span class="nd">@Override</span> |
| <span class="kd">protected</span> <span class="kt">void</span> <span class="nf">init</span><span class="o">()</span> <span class="o">{</span> |
| <span class="kd">super</span><span class="o">.</span><span class="na">init</span><span class="o">();</span> |
| <span class="n">getComponentInstantiationListeners</span><span class="o">().</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="nc">SpringComponentInjector</span><span class="o">(</span><span class="k">this</span><span class="o">,</span> |
| <span class="nc">WebApplicationContextUtils</span><span class="o">.</span><span class="na">getRequiredWebApplicationContext</span><span class="o">(</span> |
| <span class="n">getServletContext</span><span class="o">())));</span> |
| <span class="o">}</span> |
| <span class="o">}</span></code></pre></figure> |
| |
| <h2 id="summary">Summary</h2> |
| |
| <p>Since Servlet 3.x and the corresponding changes within the Spring Framework to configure web applications |
| without any XML definitions it is easily possible to increase the maintainability, because every configuration |
| is covered by the java compiler. Also you don’t have to switch between various different initialization representations. |
| Required artifacts are: spring-web (required: >4.0), wicket-spring (recommend: >7.6.0), wicket-core (recommend: >7.6.0), |
| javax.servlet-api (required: >3.x)</p> |
| :ET |