struts2 18拦截器详解(五)
?? 該攔截器處理defaultStack第四的位置,是用來方便國際化的,如果說我們的一個Web項目要支持國際化的話,通常的做法是給定一個下拉框列出所支持的語言,當(dāng)用戶選擇了一種語言后后面瀏覽的所有頁面自動切換到所選擇的語言版本,而該攔截器就是用來實現(xiàn)該功能的。要實現(xiàn)語言切換說白了就是動態(tài)改變Locale。
?? 在該攔截器中定義了三個屬性,分別是:parameterName,requestOnlyParameterName,attributeName,這三個屬性都有默認(rèn)值,相應(yīng)地分別是:"request_locale","request_only_locale","WW_TRANS_I18N_LOCALE",當(dāng)然可以手動地給該攔截器傳遞參數(shù)以改變這幾個屬性的值。第一個屬性的指的是切換Locale時指定的request參數(shù)名稱并且要把Locale存儲到session中,第二個參數(shù)與第一個意思一樣只不過不存儲到session中,只對當(dāng)前request有效,第三個參數(shù)指的是存儲到session中的Locale的key。下面看一下該攔截器是如何實現(xiàn)該功能的:
?
@Override public String intercept(ActionInvocation invocation) throws Exception {//省略...//獲取請求參數(shù)Map<String, Object> params = invocation.getInvocationContext().getParameters();boolean storeInSession = true;//是否要把Locale存在session中的開關(guān)變量Object requested_locale = findLocaleParameter(params, parameterName);if (requested_locale == null) {//無request_locale參數(shù)requested_locale = findLocaleParameter(params, requestOnlyParameterName);if (requested_locale != null) {//有request_only_locale參數(shù)storeInSession = false;//是request_only_locale則不存儲在session中}}//獲取session MapMap<String, Object> session = invocation.getInvocationContext().getSession();Locale locale = null;if (requested_locale != null) {//請求參數(shù)中有request_locale或request_only_locale//將字符串轉(zhuǎn)化為Locale對象locale = (requested_locale instanceof Locale) ?(Locale) requested_locale : LocalizedTextUtil.localeFromString(requested_locale.toString(), null);//省略...}if (session != null) {synchronized (session) {if (locale == null) {//如果請求參數(shù)中即沒有request_locale也沒有request_only_locale// check session for saved localeObject sessionLocale = session.get(attributeName);//如果session中已經(jīng)有Locale對象if (sessionLocale != null && sessionLocale instanceof Locale) {locale = (Locale) sessionLocale;//把session中的Locale對象獲取出來//省略...} else {//如果session中也沒有Locale對象// no overriding locale definition found, stay with current invokation (=browser) localelocale = invocation.getInvocationContext().getLocale();//則獲取ActionContext中的Locale//省略...storeInSession = false;//并且不存儲到session中}}if (storeInSession) {//如果storeInSession為true則把Locale存儲到Session中session.put(attributeName, locale);}}}saveLocale(invocation, locale);//將Locale存儲到ActionContext中//省略...return result; }?
//從請求參數(shù)中獲取Locale字符串值 private Object findLocaleParameter( Map<String, Object> params, String parameterName ) {Object requested_locale = params.remove(parameterName);if (requested_locale != null && requested_locale.getClass().isArray()&& ((Object[]) requested_locale).length == 1) {requested_locale = ((Object[]) requested_locale)[0];}return requested_locale; }?
//將Locale對象存儲到ActionContext中 protected void saveLocale(ActionInvocation invocation, Locale locale) {invocation.getInvocationContext().setLocale(locale); }
?? 為了更集中于功能實現(xiàn),上面的方法中省略了日志if判斷,如果要看完整源碼請參看struts2自帶源碼。
?? sturts2是根據(jù)ActionContext中的Locale對象去找相應(yīng)的國際化資源文件的,所以要動態(tài)切換語言版本就是要動態(tài)改變ActionContext中的Locale對象,intercept方法中的執(zhí)行邏輯上面的注釋已經(jīng)寫得清楚了,這里列舉一下傳遞request參數(shù)時可能出現(xiàn)的情況:
1.只傳遞request_locale參數(shù),該攔截器就會將該參數(shù)值轉(zhuǎn)成一個Locale對象,然后以"WW_TRANS_I18N_LOCALE"為吸存儲到session中,并且更新ActionContext中的Locale對象,這樣如果在以后的請求參沒有傳遞request_locale參數(shù),這時session中已經(jīng)有了Locale對象,那么該攔截器就會將session中的Locale對象更新到ActionContext中,這樣就可以實現(xiàn)語言的切換了。
2.只傳遞request_only_locale對數(shù),這種情況下Locale對象不會存儲到session中,在該次請求能將傳遞的Locale更新到ActionContext中因為沒有存儲到session中,在以后的請求中如果沒有傳遞request_only_locale或request_locale,那么被更新到ActionContext中Locale
還是ActionContext原先的Locale,這樣又回到了原來的語言版本。
3.request_locale與request_only_locale都沒有傳遞,這種情況不用解釋。
?? 更新完ActionContext中的Locale對象后,調(diào)用下一個攔截器......
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/pangblog/p/3400265.html
總結(jié)
以上是生活随笔為你收集整理的struts2 18拦截器详解(五)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript面向对象编程(1)-
- 下一篇: 解决Windows7 Embedded连