struts2的國際化(三)


眾所周知,struts2中使用了大量的攔截器(即是傳說中的interceptor),其中默認的攔截器可以參見struts2源碼中的struts-default.xml文件,如下圖

可以看到,其中國際化使用的攔截器為com.opensymphony.xwork2.interceptor.I18nInterceptor,那么接下來分析一下I18nInterceptor這個類。

一.屬性

  I18nInterceptor有三個屬性,分別為parameterName,requestOnlyParameterName,attributeName。

  parameterName:http request請求中的參數名字,該參數反映了應該轉向的locale,並且保存在session中,所以會話過程都有效。默認為request_locale。

  requestOnlyParameterName:http request請求中的參數名字,該參數反映了應該轉向的locale,不保存在session中,所以只對當前請求有效。默認為request_only_locale。

  attributeName:session中保存用戶選擇的locale值對應的key值。默認值為WW_TRANS_I18N_LOCALE

二.方法

  攔截器中最重要的方法當屬intercept方法,其他方法暫時忽略。該方法的邏輯如下:

  1.獲取parameters對象。Map<String, Object> params = invocation.getInvocationContext().getParameters()

  2.在params在取出並移除request_locale。  Object requested_locale = params.remove(parameterName);(parameters對象獲取參數得到的是一個字符串數組)

      2.1 requested_locale不為null,是Array,長度為1,取出requested_locale的值。否則,2.2

      2.2 返回requested_locale

  3.在step2中獲取到的request_locale如果為空,則將2中的parameterName換成requestOnlyParameterName,執行step2,返回requested_locale

  4.如果通過step2和step3獲取到的requested_locale不為null,則將requested_locale轉換成locale並保存在session中(注意:如果獲取到的requested_locale.toString()為null或空字符串或者"_",此時locale=Locale.getDefault())。

  5.如果通過step2和step3獲取到的requested_locale為null,則判斷session中key=attributeName的value值是否存在,若存在則locale=session.get(attributeName),否則locale = invocation.getInvocationContext().getLocale()(此處意思是沒有找到重寫的locale定義,則保持當前的invocation locale,即用戶在瀏覽器中設置的語言)。

  至此,通過I18nInterceptor得到了locale,此后的處理就不言而喻了,肯定就是根據locale取值了(見struts2的國際化(二)),略。

 可以看出:用戶在畫面設置的locale優先級高於瀏覽器設置語言得到的locale。

以下附例子一個

可以看到此處超鏈接處設置request_locale=en_US,這樣struts2獲取到的locale當然就是en_US,此時不管瀏覽器語言設置成什么,畫面顯示的都是英文的資源,並且在會話期間都有效。若設置的是request_only_locale=en_US,這樣只是在當前請求下會顯示英文界面,刷新頁面就會顯示中文了。

至此,struts2的國際化相關內容已經寫完整。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM