Spring MVC – 11 – Interceptor & Externalizing Text Messages

Merhaba Arkadaslar

Onceki orneklerimiizde Urun ekleme sayfasinda hep hard-coded olarak etiketler/label yazdik. Ornegin ;

<label class="control-label col-lg-2 col-lg-2" for="productId">Product Id</label>

Bu text’leri properties dosyalarinda tutabiliriz ve ilgili dile gore ilgili text’lerin gosterilmesini saglayabiliriz. Boylece jsp sayfalarimiz Internationalization’a uygun hale gelecektir.

Internationalization , icin oncelikle language/locale e gore mesaj destegi saglamamiz gereklidir. Bunun icin org.springframework.context.MessageSource arabirimini uygulayan siniflari kullanmamiz gereklidir.

10.external.textMessage.xml

properties dosyalarimizi projemizde source folder altinda tutabiliriz (src).
Bunun icin yeni bir source folder da olusturabiliriz.

springMessages_XX.properties dosyalarimiz burada yer alacaktir.

 <bean id= "messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basename" value="springMessages"/> 
    <property name="defaultEncoding" value="UTF-8"/> 
 </bean>

Dosyalarimizin ismi XML tanimimizdaki basename ile ayni olmalidir.

 

Eger message properties dosyalarimizi source folder degil de WebContent altinda tutmak istersek bu durumda ReloadableResourceBundleMessageSource sinifini kullanarak bu dosyalara erisim saglayabiliriz.

 <bean id="messageSource"
 class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="/WEB-INF/messages/springMessages" />
    <property name="defaultEncoding" value="UTF-8" />
 </bean>

external messages2

springMessages_en.properties

product.products= Products
product.add.newproduct = Add new product
product.id=Product Id
product.name= Name
product.unit.price = Unit Price
product.description = Description
product.manufacturer = Manufacturer
product.category = Category
product.stock = Units In Stock
product.condition = Condition
product.New = New
product.Old = Old
product.Refurbished= Refurbished
product.add.button= Add

springMessages_tr.properties

product.products= Ürünler
product.add.newproduct= Ürün Ekle
product.id= Ürün Kodu
product.name= Ürün İsmi
product.unit.price = Ürün Fiyatı
product.description = Ürün Tanımı
product.manufacturer = Üretici
product.category = Kategori
product.stock = Stok
product.condition = Durum
product.New = Yeni
product.Old = Eski
product.Refurbished=Yenilenmiş
product.add.button=Ekle

XML konfigurasyonumuza 2 yeni bean tanimi ekleyelim ;

 <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
     <property name="defaultLocale" value="tr" />
 </bean>
 
 <mvc:interceptors>
     <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
     <property name="paramName" value="language" />
     </bean>
 </mvc:interceptors>

SessionLocaleResolver bean taniminda defaultLocale property’sine deger atadik. Boylece kullanici icin session’da gecerli olacak Locale bilgisini set edebiliriz.

SessionLocaleResolver ile kullaniciya ait HttpSession objesi icerisinde ilgili kullanicinin Locale bilgisi saklanir.

AbstractLocaleResolver.java

...
	public void setDefaultLocale(Locale defaultLocale) {
		this.defaultLocale = defaultLocale;
	}
...

Spring MVC uygulamalarinda internationalization (i18n) ozelligine LocaleChangeInterceptor yardimi ile sahip olabiliriz.
LocaleChangeInterceptor sinifi , current Locale’in her HTTP request sonrasinda degisebilmesini saglar.

Interceptor ; durdurucu , yol kesen gibi anlamlara gelmektedir.
Bazi durumlarda HTTP request karsilanmadan once araya girip bir is yapmak isteyebiliriz.
Burada oldugu gibi internationalization ya da audit/logging gibi islemler icin kullanabiliriz.
Ilerleyen bolumlerde Interceptor’lari tekrar inceleyecegiz.

Burada <mvc:interceptors> icerisinde LocaleChangeInterceptor tagini kullaniyoruz.

productAdd.jsp
JSP sayfamiza 3 yeni directive ekliyoruz. Boylece , tagini kullanabiliriz.
UTF-8 olarak encoding’i degistirdim. Boylece TR karakterler icin encoding problemi olmayacaktir.

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
...

<h1><spring:message code="product.products"/></h1> 

...
<span style="float:right">
	<a href="?language=tr" >
		<img src="${contextPath}/resources/images/TR.png" />						
	</a>
	|
	<a href="?language=en">
		<img src="${contextPath}/resources/images/EN.png" />
	</a>					
</span>
...
 <label class="control-label col-lg-2 col-lg-2" for="productId">
 <spring:message code="product.id"/>
 </label>
...
 <label class="control-label col-lg-2" for="name">
 <spring:message code="product.name"/>
 </label>
...
 <label class="control-label col-lg-2" for="unitPrice">
 <spring:message code="product.unit.price"/>
 </label>
...
 <label class="control-label col-lg-2" for="description">
 <spring:message code="product.description"/>
 </label>
...
 <label class="control-label col-lg-2" for="manufacturer">
 <spring:message code="product.manufacturer"/>
 </label>
...
 <label class="control-label col-lg-2" for="category">
 <spring:message code="product.category"/>
 </label>
...
 <label class="control-label col-lg-2" for="unitsInStock">
 <spring:message code="product.stock"/>
 </label>
...
 <label class="control-label col-lg-2" for="condition">
 <spring:message code="product.condition"/>
 </label>

...
 <c:forEach var="varCondition" items="${conditionMap}">
 <form:radiobutton path="condition" value="${varCondition.key}" /> 
 <spring:message code="product.${varCondition.value}"/>
 </c:forEach> 
...
 <div class="col-lg-offset-2 col-lg-10">
 <input type="submit" id="btnAdd" class="btn btn-primary" value ="<spring:message code='product.add.button'/>"/>
 </div>

Ornegimizi calistirip Turkiye bayragina tikladigimizda ;

 http://localhost:8080/injavawetrust.springmvc/products/management/add?language=tr

UK bayragina tiklarsak tekrar her sey ingilizce olacaktir.

NOT : Properties dosyalarina daha fazla text eklenerek , diger JSP dosyalari icerisinde kullanabiliriz.

web.xml
Konfigurasyon dosyamizi degistirelim ;

 <servlet>
 <servlet-name>dispatcher</servlet-name>
 <servlet-class>org.springframework.web.servlet.DispatcherServlet
 </servlet-class>

 <init-param>
 <param-name>contextConfigLocation</param-name>
 <param-value> 
 <!-- 
 /WEB-INF/01.appContext.xml
 /WEB-INF/02.00.appContext.xml
 --> 
 /WEB-INF/10.external.textMessage.xml
 
 </param-value> 
 </init-param>

 <load-on-startup>1</load-on-startup>
 </servlet>

Github kaynak kodlar / source folder
Injavawetrust-springmvc-tutorial

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *