Wicket Filter a Wicket Servlet

Rád bych stručně podal základ fungování aplikace Apache Wicket v rámci webového serveru a popsal dva základní rozdíly v principu činnosti. Následující popis je platný pro Wicket 1.5 a měl by být shodný pro předchozí Wicket 1.4.x a Wicket 6.0 (místo 1.6), který je v době psaní tohoto příspěvku v beta verzi.

Konfigurace Apache Wicket v rámci serverového kontextu je založena na nastavení souboru web.xml (platí pro Tomcat, JBoss, WebShpere a řadu dalších serverů). Věnujme se tedy tomuto souboru a případně jeho rozšíření v kombinaci se Spring, tedy doplnění o konfigurační soubor Springu.

Wicket Filter – základní konfigurace

Pro funkčnost aplikace musím mít v nejjednodušším případě k dispozici třídu aplikace dědící z org.apache.wicket.protocol.http.WebApplication, v následujícím příkladě je to třída org.company.mywicketapplication.HelloWorldApplication, která má na starosti činnost a celé řízení aplikace. Jak je vidět z konfigurace, Wicket aplikaci lze navázat na specifická URI, pro která se filtr aplikuje. Tedy lze i v rámci jednoho kontextu provozovat smíšený obsah, např. JSP a Wicket, což umožňuje např. sdílet v rámci kontextu či v rámci session data (upozorňuji však na čistotu kódu, neboť je zde velké nebezpečí vzniku memoryleaks).

Nejjednoduším způsobem je užití filteru, tedy do web.xml přidat následující:

web.xml

<filter>
	<filter-name>wicket-filter</filter-name>
	<filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
	<init-param>
		<param-name>applicationClassName</param-name>
		<param-value>
			org.company.mywicketapplication.HelloWorldApplication
		</param-value>
	</init-param>
</filter>

<filter-mapping>
	<filter-name>wicket-filter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

Wicket Servlet – náhrada filtru

Stejným způsobem, jako filtr, se používá servlet. Důvodem tohoto použití to, že v některých případech, event. na některých serverech zcela správně WicketFilter nefunguje. Odkazuji se na text https://cwiki.apache.org/WICKET/websphere.html

Konfigurace web.xml je velmi podobná a uvnitř servletu se vždy vytvoří WicketFilter, který je aplikován, pouze je obalen třídou servletu, která je vnitřně volá.

web.xml

<servlet>
	<servlet-name>wicket-servlet</servlet-name>
	<servlet-class>org.apache.wicket.protocol.http.WicketServlet</servlet-class>
	<init-param>
		<param-name>applicationClassName</param-name>
		<param-value>
			org.company.mywicketapplication.HelloWorldApplication
		</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>wicket-servlet</servlet-name>
	<url-pattern>/*</url-pattern>
</servlet-mapping>

Wicket Filter a Spring

Rozhodnutí o tom, jak se vezme hlavní třída aplikace se provádí pomocí paremteriazce filtru parametrem applicationClassName. Ještě před aplikací tohoto parametru wicket zkusí najít parametr applicationFactoryClassName, tedy tovární třídu pro získání aplikace.

Nejjednodušším způsobem je využít tovární třídu pro integraci se Springem, která je přímo ve Wicketu. Rovněž je potřeba připojit listener Springu. Ukázka je pro Spring 3.1, v jiných mohou být změny v názvu třídy listeneru nebo ve schématech XSD.

Soubor s definicí beanu, springContext.xml, zde v příkladě je v adresáři WEB-INF:

springContext.xml

<beans>

	<!--       
		zde může být cokoliv, jak je zvyklostí ve Spring<br>
	-->

</beans>

Následná úprava web.xml:

web.xml

<web-app>

	<display-name>Hello World Application</display-name>

	<!-- konfigurace Spring -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			classpath:springContext.xml
		</param-value>
	</context-param>

	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>


	<!-- konfigurace Wicket -->
	<filter>
		<filter-name>wicket-filter</filter-name>
		<filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
		<init-param>
			<param-name>applicationClassName</param-name>
			<param-value>
				org.company.mywicketapplication.HelloWorldApplication
			</param-value>
		</init-param>
		<init-param>
			<param-name>applicationFactoryClassName</param-name>
			<param-value>
				org.apache.wicket.spring.SpringWebApplicationFactory
			</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>wicket-filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>

Wicket Filter a Spring jako zdroj WebApplication

Malé rozšíření nastává, pokud hlavní třídu aplikace použijeme přímo ze Spring http://www.springsource.org/ jako jeho bean, pak je potřeba odstranit v konfiguraci parametr applicationClassName.

V následující konfiguraci je definována aplikace jako bean Springu a tento bean je předán Wicketu.

Soubor s definicí beanu, springContext.xml, zde v příkladě je v adresáři WEB-INF:

springContext.xml

<beans>

	<bean id="wicketApplication" 
	class="org.company.mywicketapplication.HelloWorldApplication"/>

	<!--        
		zde může být cokoliv, jak je zvyklostí ve Spring
	-->

</beans>

Následná úprava web.xml:

web.xml

<web-app>

	<display-name>Hello World Application</display-name>

	<!-- konfigurace Spring --> 
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			classpath:springContext.xml
		</param-value>
	</context-param>

	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>

	<!-- konfigurace Wicket -->
	<filter>
		<filter-name>wicket-filter</filter-name>
		<filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
		<init-param>
			<param-name>applicationBean</param-name>
			<param-value>wicketApplication</param-value>
		</init-param>
		<init-param>
			<param-name>applicationFactoryClassName</param-name>
			<param-value>
				org.apache.wicket.spring.SpringWebApplicationFactory
			</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>wicket-filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>

Závěrem o konfiguraci Wicketu

Wicket se Springem a event. dalšími rozšířeními, zejména pro Spring, jsou v této kombinaci mocné nástroje vývojáře J2EE aplikací. Při zakládání projektu nebo deploy na různé typy aplikačních serverů může však vývojář narazit na různé problémy. Pevně věřím, že tento příspěvek pomůže alespoň ty prvotní a nejčastější z nich překonat.

Článek obsahuje 0 komentářů