00:00
我们来研究一个问题。在action里边如何去访问web资源?看笔记。在action中访问APP。资源OK,我们需要明确几个问题。第一个问题,什么是外部资源?第二个问题,为什么?访问爱吧。资源。第三个问题,如何访问?好了。什么是外部资源呢?说白了就是比方说http request。
01:00
HTTP。Fashion。原生。这些就是财务资源。那访问这些东西。好了,为什么消防外部资源呢?我们必定是一个BS的应用。BS的。应用的很抽了。就应该去访问外部资源,比方说我们需要去预对象里边放一个属性啊,去读取一个请求参数,去调用service context get real pass方法等等等等,我们开发的时候必然需要用到这些东西啊,包括去读写cookie。
02:02
来在BS应用中。在BS应用的CTRL中必然。需要访问外部资源,我们举几个例子啊,比方说像对象。宫补写属性,比方说呃。读写cookie,再比方说啊获取。Pass,等等等等。所以说我们。访问外部资源是必须的,那不可能不访问外部资源。好了,下面的问题就是,呃,如何访问?那具体访问的话呢,有两种方式,一种方式找和。API。解偶的方式,那既然是解偶的方式的话,我就只能访问到。
03:07
API一些。关键的方法,很多方法我访问不到。那还有一个是耦合的方式。好了,我们先来看这个解偶的方式。既然说没有的方式的话呢,有个特点,就是我只能够访问到。有限的sol API的对象,而且只能访问到其有限的方法。只能访问有线的。API。项,且只能访问其有限的。方法。有意义吗?当然有意义,实际上我们在CTRL里边用的方法通常都是什么方法呀?比方说获取请求参数。
04:07
读写属性,这是我们最最常用的。嗯,主要的方法是是什么呢?比方说啊读取请求参数。补写。对象的属性。二。十。三参失效,哎,等等等等这些的话呢,是我们最常用的方法,我们很多时候我们在CTRL里边我们都用这些方法,所以说我们就单独把这些方法提出来,所以说这个我们用解耦的方式是可以的,那耦合的方式呢。可以访问。更多。API。
05:02
对象切。可以调用其原生的方法,原生的方法不用说了,是吧,我要把这个request搞到的话,我想干什么干什么。好了,我们先看第一种吧,有的方式,有的方式呢,具体说还有两种方式。里边房子还有两种方式。第一种使用。一个类一个类叫。啊,Action action contact,还有一个是实现叉叉叉的。Where?两种方式,我底下这个呢,哎,也是两种方式。第一个是使用注意这个啊。
06:03
Action。还有一个是实现。So。他叉叉叉啊V接口,大家看这个的话,我们说这个方法呀,是对称的。差不多,好了,那我们就详细的来看一下第一种方式,跟API解耦的方式。看PPT。跟solid API结耦的方式,为了避免跟API耦合在一起啊,方便action做单元测试,那strong to我们可以把什么呢?把request session application进行封装。构造了三个map对象来替代。这三个对象本身即。我只能操作其属性,而不能去调用其原生的方法。
07:01
为什么这样做呢?我们找到我们的这个API,我们看。So。我们经常用的方法。Thanktribute remove attribute,包括。Get attribute实际上不就是在操作那个map吗?所以说这种方式就是我不操作这个对象本身,但我把这个三个map搞到,我通过这三个map来操作其属性。这块的话呢,实际上还有一个map哈,那个map就是请求参数对应的map。好了,我们具体看啊,通过action context访问外部资源,那action context叫action的上下文。Action context context这个词呢?我们在前面讲过,配置context JSP页面的上下文,Service context service上下文,那action context action上下文,从这里边我可以访问到当前action需要的所有对象。
08:16
那我从这里面我可以访问到请求参数对应的map request对应的map session对应的map,以及application对应的map。好,我们具体看一下吧。首先我创建一个包。念一个action。Action。Context。
09:03
解一个方法。P一个。Success,哎,我们的要求就是。访问。获取吧。获取。Application对应的map。并向其中添加。一个主径,同样啊,获取session对应的map加一个主镜。第三个获取requesting的map加一个属性,再来四个获取。请求。
10:01
参数对应的map。并获取指定的。碳数值。这是我们的要求。然后我需要上另外一个页面上,能够访问到application session跟request里边那些map,那我来这个action之前,我需要带一个请请求参数,这里面可以获取,可以打印出来。OK,这个说完哈。我们来建一个index。嘿。等于。Action context。Action action。
11:05
需要带一个参数。爱一个M等于at硅谷。配置文件。Action。GSP。对,更换。Lucy。好了,那我们需要来写一个class。Action。Contact action。怎么说呀?Test action contact action。过来方法是默认的。剪一个re。并不写了来。
12:00
Action。C。好了,这就是啊,最终通过这个页面。H4。Action context。我们回到这个里边来大家看啊,这个请求参数的话呢,我可以来带一个这个,呃,可以带一个请求参数叫name,等于at硅谷到这里边来一个一个看吧,首先呢,我们需要来获取application对应那个map。通过action contact来获取哈。哎。这个零吧,先获取。Action contact一下。啊,这里面的话我们要说一下action context是。
13:05
Action的上下文一下。那现在的话呢,我这个类就是一个action,它指的是当前类这个对象的一个上下文去象我可以重装。可以从中获取到。当前。Action需要的一切信息,一切对象不可以,好了,我们搞一个action context action context等于当然不是new出来的,我们就不出来它,于是的话呢,它会提供一个静态的通厂方法直接获取。好了,首先搞个application对应的map map键是一个形,只是一个object。
14:00
Application。等于action context点。Application大家看见了吗?果然是一个map加一个属性application map点。不。T。后边。Application value放好了,然后让页面上我可以把这个值给获取出来。被告。Application。点。先看效果。
15:25
好了,访问一下。大家看这个值我是可以获取到的,没问题。回来,哎,这就是我们获取application对应那个map,以及向其中添加一个属性。回来大家看,哎,我操作了service context set attribute方法,但是我并没有用其原生对象,而是操作的这个。Map。那这个是获取,同学会问是吧?你啊,这个是设置属性,设置属性同学会问是吧?你有可能获取属性吗?当然可以,道理是一样的。
16:05
我在index这块。我写银行代码。Application tribute,我们写一个。It。给个时间。不用有这个区分度的话呢,我们这样写说,如果application里边。Get attribute it。等于空的话我再放,那意思就是不等于空的话,我就不放了,好了,到里面来,我当然还可以来获取这个属性,一个设置属性。看获取属性,我们搞到一个date。Object。等于application map。
17:07
Sit out it。Bit。呀。好,试一下。这个不是index.jsp。他是。回退,我把这个页面刷一下哈。刷新了,好了,我过来我们看这个时间是可以打印的是吗?呃,193143,我再刷。还是193143,我们很快就会变成1932了,是吧?啊,已经变成01932了,你再刷一下,哎,还是193143这个值的确是从APP开里边获取的。
18:07
回到我们这个类里边来,我们看,哎,我们通过调用这个方法来获取application对应那个,然后我可以操作这个map,设置属性跟获取属性。说一下通过调用action。Context对象的方法。Application方法来获取。我举这个麦。Application。对应的。Map对象OK,这个搞定的话呢,这个session那个是一模一样的,我直接写了啊。
19:00
Map。点。等于action context get session。好,我们同样来设置一个属性。Map BOO店。3T。三身歪柳,后边这个的话呢,我就不试了,因为这个道理是一样的。再生T反映一下。第二,第二。Session。Session scope点八。有一个。JSP直接刷新。大家看这个值可以获取到啊,这个值没问题,同学们,诶,这个date怎么没了,因为我没有先刷这个index JSP,你只有刷新这个页面的话,它才会往那APP里面放直板。
20:16
刷新再走不就有了?好了。回来。那下一步理所应当的,我们搞到request对应的那个map string object request等于action context点。由egg。没有request的方法。这个让人呢很郁闷。怎么回事儿呢?嗯,我们先看一下这个源代码,然后的话呢,通过源代码的方式,通过这个运行状态,我们给大家这个结论。
21:07
看看怎么回事哈,好了,我们首先研究一下它是如何获取的这个。Session map。或者是application map,好了,我们以such map为例,我们看action context调了一个方法。做了一个筛选方法。了一个get session方法,Get session方法实际上到的是一个get方法,大家看见了吧,Get方法的话呢,它传了一个。K进去他搞到了什么呀,他搞到了那个。Session对应的map我们点一下。哦,这块的话呢,有一个返回值,我们从这块儿发现啊,它原来是有一个get的方法,OK,那get方法它从什么,他从这个context里边又搞到了一个,从这里边叫做get。OK,好了,我们看跑哪了,跑map里边了,这说明这个contact本身就是一个map。
22:10
好了,那这在这个context里边,现在我们已经知道有session对应的map,有application对应的map,那么。有request对应的map吗?看一下。怎么看呢?我在20。七行打一个断点,我们想看看什么呀?我想看看这个action context里边有没有request对应那个map。Debug。刷新。走。大家看27行,停住。27号停住,我们搞到。找到这个action context,打开里边只有一个context context是什么类型啊叫。
23:06
O g NL context,这说明o g context应该是一个map类型吧,因为刚才看源码的时候,我们看到了这个contact是一个map OK,打开,那这里边儿我是如何。实现map那些方法的呢?呃,它实际上靠的是这个。Values。就是说真正map那些建筑队啊,在这个values里边,OK,我们打开。往下一点,哎,这就是value。这里边儿有我们刚才那个session map跟application map吗?怎么看呢?我们还是回到这个action context里边。我回到账一里边哈。好,先找到这个test action context,我们首先来看这个方法,大家注意。
24:06
塞这个剑是什么呀,卯长。可诶等一下。CTRLC,好吧,这个里边我们不是看见它有这样的一个这个values吗?这个是实际上的一个map。我。最大化一下。往上提一点。好。X。Three。Stop。来看是不是有啊。啊,这就是session对应那个map,那同样。他也有。Application对应那个map那。有request对应的map吗?怎么找啊?如果要是找的话,这个结尾恐怕也是request,所以说我们就猜一下哈,于是上来。
25:05
你看F应该是request,找找这个不是。这个的话呢,实际上是一个对象,这个实际上确实是有一个request对象在这个map里面。下一个。哦,大家看。这是一个request,这里面放的是什么呀?是不是一些建筑队啊。看见了吧,这里边儿是一些键值,对,所以说你获取这个request这个键啊,就是request。回来吧,那我们找到了这个答案,答案是这样的,我想获取request啊,我必须这样获取。调用action context方法。里边传入一个字符串叫request就可以了。这就是request对应的map的获取方式。好,我先写个东西哈。
26:03
Request map put。Request。T值。Request value。一般。C。TST找一个。Request scope。Request安全效果。回馈刷新。是不是可以搞到啊,没问题,我们把这个的话呢,值得我们写一下,这个跟前边的不一样。说。
27:01
Action context中。并没有。提供request方法来获取request对应的提供。怎么办呢?需要。手工要用爱的方法。传入。Request字符串来获取啊,那实际上获取这个request map跟session map是一致的,因为。到这个方法呀,它这个键呢,它也写好了,但是我们获取request的时候呢,获取的是这个键pro这个键,这个键简单,它没写,但是用的方式是一样的,哎,这是需要我们特别注意的一个地方。
28:00
没提供,但是的话呢,用这样的方式可以获取。好了。回来吧,获取请求参数对应的那个map map。请求参数那个键啊,我们也写了一个object吧。Parameters等于。Action context getters或是它,我可以找一个什么东西啊,找一个ter.get我们还记得我们有一个name吗?我在发请求的时候。我不是写了一个name吗?看一看能不能获取。刷新大家看。哎哟,这个name值是是个什么呀?是一个string的数组,为什么呀。能想到吧,那我有可能是多选啊,我有可能是这种情况啊。
29:03
多个值啊。方说name。等于北京,哎,这样的话呢,就是name有两个值,当然应该是一个四中的数组了,那这个对应的是service request,那个GA。Map那个方法我们看啊,Get map。那这个方法这个键是一个string形,值不是一个string数组吗?还记得吧,你看值是一个string的一个数组吗。既然这样的话呢,我需要把这个值打一下。回来,那这个值我们简单打印了哈。我直接。获取地。零个。包装一下。宿主。好。
30:00
刷新。还没有重新加载哈。找一个大家看是不是那个S硅谷啊。就这个吗?爱硅谷12345走。这个值。好了,又是获取我们的请求参数对应的map回来。然后呃,有要说的一个要说的。键值对键是什么。是请求参数的名字,请求参数的名字值。请求参数的值对应的字符串。数组,OK,既然是一个字符串数组的话,那我就直接这样写呗,直接写成一个字符串数组呗。
31:01
保存这个保存不上。为什么呀,因为这个方法这个返回值啊,它就是一个object,所以说你还不能这样写,就是我们需要注意的一个地方,就比较奇葩哈,但注意。这个注意的话呢,有两点。一点说,呃。GA。返回值。的返回值为map。后边是object类型的map。而不是。卖这个。需要注意的一点。这个的话呢,其实我个人认为啊,确实是应该改为这样的方式。
32:05
好,再来第二个。我们搞到这个permits啊,我们挺兴奋的哈啊,既然我可以读,我能写吗?能写吗?Put写一个。我写个age age,我写成100啊,100岁。好了,写完之后的话呢,我当然希望上这个里边给他读一下。配置怎么写?S star。这样读吧,OK,效果。走一个。哎哟。
33:00
读不出来好了。那再回来吧,我们看我们读那个name可以吗?Parameters,我写错了吗?Parameter。啊,这个是可以读的,这个没问题,那改一下改成H。能读吗?有读不出来。白兴奋了是吧,这个promise请求参数,这个map只能读不能写,但写的话呢,不出错。来。这个map只能不能写入数据。
34:04
如果。泄露。注册。但也不起作用。好了。回来我们归结一下,就是我们讲到的action context来获取。外部资源,那首先的话呢,我们可以调用。Action context的一个静态工厂方法来获取action context。然后调用get application,获取application对应的map。调用get session,获取session对应的map。啊,这个map呢。就是application跟对应的那个map,然后你可以进行属性的读写操作。
35:00
获取request这个map啊,费点周章,没有提供get request方法,但是的话呢,我们可以调get方法,传这样的一个参数进去就可以。好了,那一样是可以读写抄作,我们只搞了一个读哈,写是一样啊,我们只搞了一个写读是一样的,但前提是那个请求里面得有那个属性。那你就靠一个点一个超链接过来的话,那里边儿是不是没有那个属性了,我们都都理解吧。就是说你在页面上这个意思,你在这个页面上index这样写。Request set attribute。来。Request value,我这个只要是这样写的话,在这里面是不是获取不着啊。这样通过点超链接是获取不着的,除非你在这个页面我直接转发过来可以吧,呃,这个的话呢,我们前面讲request的时候重点讲过,这块我们不再阐述。
36:10
好了,接着来看我们这个,我们还可以来获取请求参数对应的parameters,它实际上是一个。String,宿主的一个建筑队的一个map。但是。它返回的却是一个。他还不让软。啊,还有一个就是我们的美梦破灭了是吧,我们不能往里边去写入数据。好,OK,那以上呢,就是我们讲到的使用action context的这个对象来获取外部资源。笔记呢,我就不写了啊,大家看的话呢,看这个整个这个注释就可以了。
我来说两句