00:00
Post提交时。我们携带的参数还有中文乱码问题,我们使用filter已经给他解决了。那现在的问题是,如果是get提交呢?这个get提交如果还有中文乱码,那么使用filter来解决啊,相对来说要麻烦一些,那下边我们先来分析一下。好。
01:01
这两个都不要啊。那么我们来看啊,这是拷贝过来的页面不变。只不过现在要改成get了。我们先打开soet。要想搞清楚这个问题啊,我们需要先搞明白。使用get提交时。为什么?若。请求中。
02:01
这个携带有中文,为什么会产生?乱码,先要搞清楚这个问题。它为什么会产生乱码?当然了,要想搞清楚这个问题啊,我们先要回顾一下。我们的请求参数。请求参数。一旦被我们的。服务器接收了,它会存放到哪?或者说放到我们请求里边了,对吧,其实仍然是被服务器接收了啊,被服务器接收以后,它会存放到哪。它会存放到一个map里边,这个我们大家应该知道是吧,Request点。
03:00
Get parameter。这是和请求参数相关的四个方法。其中getter这获取到的是什么?这获取到的就是我们请求参数,存放请求参数的那个map,需要大家注意一点,这个map的K是什么?是请求参数的名称,而value value是请求参数的值。但这个value是个什么?String数组,它是个数组,诶需要大家注意这么一点啊,它是个数组,为什么它是个数组。因为我们表单里边存在这种情况啊,最典型的就是check boss。
04:00
复选框一个。参数是不是可以含有多个值啊?典型的是谁?是,我们说hobby。是吧?兴趣爱好啊,对不对。所以这需要大家先知道的一点啊。啊,我们的请求参数是存放在一个map里边,Map的key是。是请求参数的名称,Value是个字符串数组,这需要大家先知道了一点,好,那么再来说啊,为什么会产生乱码?是因为。当用户提交。了提交了一个包含中文的中文请求参数。的中文。
05:03
参数的请求时。那么浏览器首先啊浏览。浏览器。首先会将。这些中文。转化为什么?一个字节序列。它会转化为一个字节序列。发送到服务器,服务器呢。接收接收到这个。字节序列后,会按照其。
06:07
默认的字符编码。默认的是谁?ISO8859-幺。会按照其默认的支付编码ISO8859-幺。对其进行什么?解码。那这一码肯定就出现什么问题了。乱码呀。对不对,我发过来是中文,不管是GK也好,还是U8也好,你现在用ISO8859-幺来进行解码,那肯定是乱码呀。此时就产生了。乱码。但紧接着。
07:03
服务器会将。解码过的。参数存。放到哪里?Parameter。那么。这个map中的。参数已经是。乱码了,诶你要知道这个乱码在什么时候成了乱码了,放到这个map的时候就已经成了乱码了。这是。我们首先要清楚的。
08:02
然后我们再再来想解决方案呢,那怎么解决呢。怪不得我们这儿啊,获取到的是乱码,你get牌me这是从哪,这从这个map里边,这是map的key啊,从这个map里边获取它的值呢。那你或许到肯定是乱码呀,所以怎么办?要想解决这个乱码问题,我们就需要我们就在这想我能不能。在服务器把这个参数放到它之前,我先把这个乱码问题解决了,解决以后再放进去。这样的话,Map里边放的就不再是乱码了,对不对,这是一种思路。那如果说我要完成这个,要按照这个方案来做的话,按照这个思路来做的话,我们成员就得能够获取到一个时间点,哪个时间点服务器。
09:06
往他里边。写入数据,往这个map里面写数据,这个时间点得能获取到,在他写之前,我先给你把乱码问题解决,然后再往往里面放。不过很遗憾。我们程序员无法获取到这个时间点。也就是说服务器向它里边放入的肯定是乱码。那这个问题不好解决了呀。那怎么办呢?我们就得换个思路了,既然它里边放的都是乱码,而我以后再用从request里边要读取参数,我肯定是从map里边读的,我在想的能不能这样呢?我们给他来个狸猫换太子。
10:05
我把这个map给你换了行不行。我不用你系统的这个卖法,我给你再创建出来一个卖法。然后呢,我逐个把这个map里边数据给你读出来,我读出来一个,把乱码问题解决,再放在另外一个新建的里边,我读一个放一个,读一个放一个,我读一个解决乱码再放啊。然后呢,我request在获取的时候,我就从新建的map里边获取。那里边儿肯定就不是乱码了。诶,这个思路比较好。把谁换了?把这个parameter map给它更换掉。可是你要注意。你如果说要更换人家那个卖。
11:02
就有个问题啊,这个request是谁?这最快的是。服务器里边的request呀。这是服务器里边儿的呀。这是个接口对吧,这个接口的实验类你看看。我们查看一下这个接口它的继承关系。他的试验类是谁?你看看他的实验类是谁。这儿有个叫。Request for。当然,这是什么?这是一种设计模式啊。这是一种事,但不管不管我们不管其他那么多,这个就是它的实验类。哦,也就是说这个接口,你如果说想让request读的时候,从你新建的那个map里边去读,你就得把它的实现类给换了。
12:09
这事就比较大了啊。你听好了,你不能用系统。我们服务器里边自带的这个request,这个I request它的。实现类。调对象来读取了,因为人家读的肯定是从。原来的per map里面读的。你就得再写一个这个类的。实现。但是原有的。的功能你还不能少,你仅仅是什么增加了扩展了。原有的。哦,原来的不能动。
13:02
原来的不能修改,但是还要扩充,还要扩展它的功能,诶这不就是我们刚刚讲过的。设计模式。装饰者设计模式对不对?我们现在只需要定义一个。一个装饰者,让这个装饰者实现这个接口。让装饰者实现这个接口。然后呢?当然了,这个装饰者里边应该包含什么,应该包含。我们的目标对象。因为你还得使用目标对象的东西啊,调目标对象的方法,然后你是对目标对象的方法进行了。增强,也就是说对目标方法进行了增强。
14:00
所以啊,我们现在大体上定了解决方案了,使用什么装饰者设计模式?那好,咱们假设说我们用装饰设计模式也实现了啊,能够从我们的map里边读了,我们自己建的map里边读了,现在的问题是你自己定义的request。谁来用呢?怎么用呢?也就是说,我们怎么样能够把。老的request替换为我们自己定义的这个request呢?这又是一次狸猫换太子,这个好完成在哪完成?我定一个。过滤器。这个过滤器过滤所有的请求,所有的请求过来以后,我就直接把你的筷子都给你换掉。
15:04
我来一个请求,我就把你的request给你换成我们自定义的。这就解决了,所以啊,这是我们的解决思路,当然我知道啊,有很多哥们儿这个这会儿听的不是特别的明白啊,这个成语有点复杂,没关系,我们下边。慢点写代码,我们一点一点来看。
我来说两句