00:00
我们来看一段示例代码。或者是看一个常用的一个需求,利用超链接实现动态加载国际化资源文件。说白了呢,就是通过那个超链接切换页面是中文的还是英文的,具体实现效果是这样。目前是英文哈。中文英文,而且呢,呃,它是可以跨页面的,比方说我的index回去,我再回来还是英文状态,中文的效果一样,中文点过去再点回来,什么意思啊,这个时候我是把这个lock q。放在了那个session里边,我们讲,我们前面讲国际化的时候呢,讲过这个基本的思想和实现。那这个的话呀,就不需要我们在这块在烟Internet的选项进行切换了,这个我们在这个,呃,实际开发里边这种功能用的还比较多,下面我们来看如何实现这个功能。
01:10
大家考虑一下,实际这个功能最核心的在于什么呀?最核心的在于,我需要确定抓to是如何确定那个local对象的,抓two不是正是根据那个lock对象来加载对应的资源文件吗?所以说核心在于,关键之处在于,呃,知道stress to。框架是如何确定lock对象的?哎,这是核心,好了,那strong two是如何确定那个local对象的呢?这个实际上就涉及到那个I18N拦截器,可以通过阅读。
02:16
I18N拦截器啊,知道上面抓two框架是如何确定这个lock q对象的,我们先大致的看一下哈。说刷to使用这个A18拦截器处理国际化,而且它是默认拦截器的一员。好了,以下的话呢,就是这个流程了,我们直接。来看这样的一个流程图。填大致的有一个印象,然后我们再去结合的去看,去看源码。首先,Stra two会来。在请求参数里面获取这个request local或者是request only local走。
03:00
大家看哈,如果这个request local这个值,注意这个值啊,不是空的话,那我就。把这个转为一个lock对象,那我从页面过来的是不是一定是一个字符串啊。哎,我把这个字符串会转成对对应的一个local,然后呢,把它保存在session里面,那下边再给它保存到action context里面,后边我就开始用这个local了,看到了吧,所以说的话呢,我们只要加上这样的一个请求参数,然后这个请求参数可以解析成一个local,这个请求参数就是语言国家代码,那下一次的时候。它就直接保存到S里边了是吧,那看下一次,如果我下一次没有传这个参数的话,怎么办呢?哎,它会尝试着从S里面进行获取,如果要30里面有的话,直接。就用了。就是这样一个流程。
04:00
所以说,我们只需要第一次。第一次点那个超链接的时候,你放这样的一个请求参数。然后呢,Ru图框架会根据这个请求参数确定这个lock q,而且把它保存到session里边,然后来使用第二次,即便是你不带这个请求参数的话,它会直接从session里边把这个lock q读出来,刚才不是放了吗?所以说也可以用到刚才的那个lock好了,如果这个也没有,这个也没有的话,应该是哪个啊?应该是这个直接从action count里边获取,然后把这个值拿过来,这个获取是怎么回事,都没有吗?那这个就是根据浏览器。这个呃方这个这个语言的情况来确定,这个就request get local方法确定好了,我们目前。没有实现这个功能之前,走的是哪一针啊?
05:00
是空。是空找的是对阵,我们是用的request get lock获取那个lock来确定当前页面的这个,呃,所加载的资源文件的,好了,我们希望我第一次点那个切换的时候找的是哪个呀,说的是这阵看到了吧。好了,我第二次,我第二次点,我我第二次可不是点那个带参数的啊,我第二次可能是点一个一般的超链接,它并不携带参数了,走的是哪一帧啊,走的是。这一帧看到了吧,因为这个时候它已经把它保存到了我们这个赛里边,而这一帧呢。是默认情况下找的,那这个是默认的。这个是第一次点那个超链接的,这个是点完超链接之后,你再点其他超链接的是它。好了,我们先来实现一下。放弃刚才的话呢,这块我有一个基本的实现哈,我先给它进行删除。
06:05
这样吧。我把这个呢拿掉。我把这个呢,嗯,也拿掉好了,我们实际上只需要来贴这两个超链接的这个属性就可以了,这块这个就是直接连到这个首页,这没啥说的好了,那我写什么呢。因为我这个页面上,我还需要来显示这个date,所以说我连到的地呢,是这个地。Test l8写上点action问号需要带一个参数,这个参数在PPT上我们给定的叫request下划线来request_local。等于。En us。CTRLCG应该等于GHCN走。
07:05
这个是干什么的,这个服务器是开着的,好了我刷新一下。大家看。中文。英文。点index注意啊,这个时候我并不带这个请求参数了,大家看一下啊,我回来之后如果要是还能够显示英文的话,说明什么呀。说明这个时候这个已经保存在了。30里边。看英文没问题,中文点过去再回来,哎,这样的话呢,我们这个功能就实现了。好了,这个流程的话呢,刚才我们通过PPT的方式啊来分析了一下,我们再来看一下那个源代码,我们要知其然,知其所已然。那找到struts two的默认的那个配置文件struts default。在这呢?
08:02
往下翻。我们现在使用的这个默认的拦截器站的话呢,就depo stack这里边有一个拦截器。叫。I18N拦截器往前翻找到I18N拦截器在这。CTRLS的。T。好,我们要加一些断点就可以了,往下翻我们看一下哈,首先的话呢,我获取了请求参数对应的map,看到了吧,而且呢,保存到session的话,这个温值是true,然后我会尝试着从请求参数里边来获取一个lock的值,实际上这应该是一个字符串是吧,点一下。看这个值是什么呀。这就是我们前面用的那个叫request local,我们刚才用的不就是它吗?好了,回来,这个值如果要是空的话,有可能是空号,是空的话呢,我会尝试从请求参数里边来获取,怎样来获取这个值。
09:08
注意这个值是呃值,保存在request里边,不放在这里边,所以说如果这个值不是空的话,它会把这个值置为false,我们正是根据这个store in session的true跟false决定着是不是把那个log保存到session里边的。继续往下。嗯。获取这个lock q,根据我们什么根据这个请求参数来获取这个lock q对象怎么获取的呢?点一下吧,大家看。这应该是,如果我这个只要不是空的话,怎么获取啊,不是空的话,那我这个夹或柴进来的话呢,肯定是一个字符串,所以说inter of这个整不上是吧,它就是从这个字符串呃,解析成一个lock对象,那具体这个字符串的这个形式就是呃,语言代码下划线,国家代码就是那个JH_CN或者是。
10:05
En_us这个我们刚才已经实现了,好了。这块呢,我们可以确定这个request lock,然后呢,如果这个值还是空的话,呃,需要注意。这不需要看一下哈。对,你俩在这儿吧。如果还是空的话呢,它就会。哦,这个说完了是吧,往下往下这个是local。这块这个137行的话呢,实际上这个捞漂可能还是空。有可能的,然后我们继续往下,大家看,这个时候的话呢,我获取了session对象,然后呃。如果local还是空的话怎么办呢?诶,它会尝试着从。赛里边去获取,看怎么获取的,点一个超链接。看。
11:00
尝试从三里边进行获取,但可惜什么呀,可惜这个值还有可能是空,但是空呢,哎,我就从。In里边进行获取,那这个就是从浏览器里,从浏览器上面获取的那个默认的lock q什么叫默认的呀。就是这块这个。这块这个叫从浏览器这块获取的log q我们默认不是中文吗?好了这个搞定。得到这个you之后的话呢,我会。看一下啊,需不需要把它保存到30里面,那有有两种情况是不需要保存的,第一种情况就是我本身这个值就是从30里边获取的,那我就不需要保存了,就是前面都是空,我不需要保存,还有一个就是如果你请求参数要是这个的话,我也不需要保存,那如果请求参数是第一个嘞,就需要把它保存到。Session里面,然后把它保存到我们的E里边,后边的话呢。
12:01
具体进行国际化的时候,我们就是用invoc里边这个lock怎么保存的。不就是保存到了这个invoc contact里边吗,对吧,可对。OK,这就是整个的流程走一下。服务器。Debug。来,我直接点这个超链接,我直接点这个ul找一个,我没有携带任何参数往下来。算一点哈。在这好了,这个时候的话呢,这个参数值很明显是空。没有吗?没有带任何参数,再往下来这个参数值也还是空,所以说继续往下好了,这个local当然也是空,没问题,再往下。
13:03
是空啊,我会尝试从session里边进行获取,我进去。在这儿吗?下。这个值还是。这只不是空啊。哦,这个这不是空,为什么呀,因为我刚才这个服务器重启的话呢,我那个session被持久化了,看到吧,所以说我们回来我把那个。持久化那个三给它清一下。Tomcat那个work,那个director。OK。这个呢,我也重新的开一下。开心了。好,第八个。
14:04
刷新着。又看了一遍哈,这个值没有带任何参数。这个值。这个值。下一点。这个值是空,再往下这个请求参数值也没有携带还是空,然后呢,赛程里边。好获取去,下一步获取走,现在这个lock q还是空,我们下一步我们看好下一步获取一下。北京来吧。因为那个赛程不是被持久化了嘛,是吧,再往下找。从哪获取的,从evoc里面获取的,因为我这个,嗯。Action invocation。在初始化的时候有一个local q,所以说这个时候的话呢,这个值是可以获取到的。
15:04
GHCN,对吧,好了。出来。那我这个值的话呢,最终就OK。那下边的话呢,我来点这个英文切换,大家再看。下一步这个时候怎么了?这个时候这个值不是空了不en us吗?我传过来了,然后往下拉往下走,哎,这个时候我会确定这个local,那我当然会把这个local保存到。在里边去会保存。就保存,所以说下一次赛里面就有这个值了吧,再继续保存了,然后整个这个OK好了,页面切换成英文。那我注意我通过点这个超链接出去。再进来好了,这个时候的话呢,Session里边已经有这个lock q了,大家注意看哈,下一步。
16:07
这个时候这个值是空,我没有带这个参数吗?再下来。好了,注意看这个时候这个lock还是空,因为这个lock是根据那个请求参数确定的。再往下找。Session大家看这个时候的话呢,我要从session里边去获取这个lock q对象目前是空号。下一步。哦,这是我的这个里边是吧,这是我这个呃,Readto lock方法,你看我下一步吧,看这个时候的话呢,可以来获取这个lock,就是session local,我返回的是谁呀。不就是他吗?EUF,因为刚才已经保存到我的。赛程里边了,那我们网上找一下代码哈。在哪呢?
17:00
这块这个我是可以读得到的,这块我加上一个断点走。大家看这个时候这个local q是可以获取的,就那个e enuss嘛,那我后边我就使用这个local来进行国际化,那以上的话呢,就是我们整个运行的这个原理和过程。那我们,呃,解析保存log q这个过程已经让抓都给我写好了,我们在自己实现国际化的时候,我们是不是需要自己去解析那个请求参数,自己给它放到30里边啊啊,这个过程我们不需要再写了,这就是框架。回来。那整个这个过程的话呢,我们这块有这样的一个流程图,大家也可以来看我这个汉字,汉字这一部分啊,做一个笔记。三。说具体确定lock对象的过程,这个过程的话呢,我们刚才看了源码是吧,我这块的话呢,已经写过来了,CTRLC直接复制上就可以了。
18:17
大家看一下啊。第一个啊,抓度是用218拦截器来处理,国际化,而且它在默认的拦截器站中。他并且注册在默认的拦截器站中。好,第二步。我们在执行action方法之前呢,我们会来读取这样的一个请求参数,如果该参数存在的话,我们就把它转成对应的lock对象。并将其设置为用户使用的这个,并把它保存到session里边好了。这下一步,如果这个里边要是,如果request里边要是没有这个请求参数的话,它就会从赛里边来读取这个请求参数,而且把它作为。
19:03
浏览器使用的local。默认的lock就是去解析那个配置文件那个lock q好了,如果30这个还是空的话,那我就只只能使用默认这个就是过程。等点实的吧,是吧,具体实现啊,只需。要在超链接的后面,超链接的后面附着什么呀。这个的请求参数就可以了,这个的请求参数,那我们这个实现的话呢,就是这样写的,我复制过来。CTRLC过来。那值呢,值是呃语言国家代码好在这里边啊,有有一个需要注意的地方,注意什么呀,大家说我这块要直接写JSP的话,好用吗?怎么写。
20:24
我直接这样来写,我直接写成。I18N。点JSP。这样写好用吗?想想好用吗?这样写的话。我是不是没有经过那一系列的拦截器呀。对吧,没有经过那一系列的一系列的拦截器,导致我那个I18拦截器根本就不会工作,所以说不好用,可以看一下。
21:01
刷新一下。哦,这个是。没有起来哈,再看。刷新。大家看我点中文。不好用是吧,我点英文哎,也不好用,这个时候我会连到这个页面,这个页面的话呢,都没给都没给,没有没有很好的给我显示,为什么呀。这是因为我这个date它都不能够解析,这是我们前面的问题哈,在这的。国际化资源文件里边,我不是有个date啊,它没有经过我那个action,没有经过action的话呢,我这个date都无法解析,那我把这个我先注意一下吧。
22:04
这两个值啊没有,所以说的话呢,它也会有一个异常。抽掉好再看。好了,我点英文中文是不是无法切换啊,因为你要直接连到这个页面的话,它不会走拦截器,所以说不行。注意啊,必须超链接必须。是一个stra to的请求,G使是什么呀?使我们的这个I18N拦截器工作才可以,如果他都不工作的话,那刚才讲的这个过程那不就没用了吗?那这是我们需要。
23:00
注意的一个地方。我们把这个呢也改过来。好了,再看一下。直接连那个JSP不可以是吧,点它。点这个。看一下我改什么东西了吗?还是这个date的问题,那我们这样吧,我们先上index进来好用的中文英文,哎,这就可以了,刚才那个异常啊。是因为我想对那个date进行格式化,但是这个date没有。它的话呢,就会默认使用那个data字符串,所以说发生这个异常了。OK。
我来说两句