00:00
嗯,刚才写的这个hello word呢,未免有点太简单了啊,这怎么回事啊,我只是在。这个控制台里面打了这样的几行字,嗯,这个效果不怎么好,这个是刚才用GSTL那个啊,我们自个儿写的,在这呢什么也没有,那现在的话呢,我们要求也不高,我就希望在页面上打一个hello。我再说一遍哈,我就希望在页面上打一个。那这个时候我们翻过头来,我们再来看这个hello simple tag吧,这里边的话呢,诶有一些set方法,其中我们发现有一个方法被调用了吧,叫什么set JP context,哪个是啊这个,那这个JP contact的究竟是谁呢?
01:04
大家看这个JP context叫什么JP上下文,它是不是有一个子类啊,叫配置context,我们在讲JSP页面的九个隐含对象的时候说过,说这个隐含对象至关重要,但是的话呢,这个需要等到学习自定义标签的时候再来详细的使用它,那这个标签,那这个配置context是GSP context的一个子类,那传入的是一个GSP context还是一个配置context呢?于是我来写一下。Urg internal。状态你看是不是他保存再看。
02:07
哎,我传入的确实是一个page context。好了,哎,我们知道这个时候呢,JP引擎会在调。Do t方法之前先来调JSP context,把代表当前JSP页面的配置context传进来。看这。看这个哈,这个方法一定会掉的,在调这个do t方法之前,它会把代表JP页面的配置context传到我们这个。标签处理器里边来,那于是。怎么写?我可以来写一个全局变量private。
03:01
写一个吧,这点配context等于二零。好了,那配置context,我们知道这个代表三分之面,我从这个里边可以获取到其他的八个隐含对象,于是我想输一个hello word是不是小差异碟啊,怎么写,He contact get out点写一个hello。Or保存再看?嗯。哎,有了没问题。我们看到这个是什么呢?这个就是我们的这个叫呃配置。Set j contact对方法的作用。它会把。实际代表当前GSP页面的配置context传进来,那么我们使用一个腾讯变量去接收不就可以了吗?
04:09
说这个方法是JP引擎。调用,然后呢,把代表JSP。页面的page contact对象转入好了,Do方法也可以来说一下了,这个方法是do t。执行标签体吧。标签标签体逻辑实际应该编写到该方法中好了,这是我目前看到的OK,那这个里边的话呢,我不但可以获取out,我还可以获取其他的八个隐含对象,比方说我想来获取一个。
05:12
Request request request等于配置context.get。Request强转一个HTTP肯定没问题,好了,我想来获取一个请求参数。二盐。这样吧。拿过来。加request点,再看效果。问号name等于S。
06:00
对。是不是啊,这就是我。看到的这个,嗯,Site JP contact的这个方法的作用,以及呢,我们小爽了一下,这个page contact他真的很强,为什么呀,他可以。配置。Contact可以获取JSP页面的其他八个隐含对象,所以说这个时候的话呢,我这个标签跟在G界面是不就几乎一样啊,GTB面能干的事,我当前标学处理器内都可以干。所以,所以凡是JSP页面可以做的。
07:04
标签处理器都可以完成,所以说为什么这个标签可以在页面上为所欲为呢?就是因为有这个配置context。好了,有了这个方法之后的话呢,我们还不是特别的满足,我们还是觉得什么呀,还是觉得我们写这个东西啊,哎,太简单了,我现在的话呢,尝试着为其添加一个属性。加一个属性,加一个什么属性呢?比方说哎,我来加上一个。这个属性吧,加上一个Y流。等于啊S对补比方加一个它我要加上一个这样属性的话呢,我们这个也很简单哈,我就是说我要把这个Y6值打印框不变,Count等于十。
08:04
就这个意思,就是说我加上一个Y,加上一个count,我在页面上把这个value值。出十次也是一个Hollywood级的,那好了,那现在我们看到一个什么呀,我这个属性如何传给这个标签处理器类呢。再说一遍,需求是这样的,我这个属性如何传给这个标签处理器类呢?看。Set JP context调完之后的话呢,还有一个set叉叉叉方法,这个设置标签的属性,定义属性的话,这个方法就会被调用,写上说设置属性过来看吧。嗯。Private value private。
09:07
Set value。C。哦,写完。好了,写完之后的话呢,我们首先看这两个值能不能进来。Y。光这样进的话进不来怎么办呢?我肯定需要在我的这个TLD文件里边描述一下说,哎,我当前的标签有哪些属性过来看。刷描述当前标签的属性。什么描述啊,Attribute?
10:05
Attribute一定会有一个啊。Name叫属性名,这个属性名呢,我们有一个叫value。好,还需要什么?说这个属性是不是。必须的,有的属性是可选,有的属性必须的,比方说我说这个属性是必须的,还有一个必须得写叫什么呢?叫这个。叫runtime expression value,我就写为to,这给我解释一下哈,这一个的话呢,有点复杂,这是一个合成词。RTEXTR。Value。Run。
11:00
Time expression。Y流叫什么?运行时表达式的值?这意味着什么?当前属性?当前属性是否可以接收?运行时表达式的动态值。是这个意思。那这个比较简单了是吧,铝块是什么意思啊,说该属性是否为。必须妹属姓名。属性名好了,都写完之后的话呢,再写一个两组吧。ATTRIBUTE2个属性,第二个name false,然后required,比方说啊,我说这个不是必须的。
12:10
然后呢,呃,Runtime impression value,我写成fourth,看一下有什么异同吗?回到这个里边来,注意看这个哈。At推股,Hello,你看属数是必须的,必须写,不写不行,那重写吧,哎,推谷。而这个属性是可选的,你不写也可以。好了,这个不简单。出错放这什么串啊。这个属性是必须的,Missing required attribute,必须的,然后的话呢,我们还说了说这个属性啊,可以接收表达式的值,我先写一下,看它点内我接受这个值就是。
13:04
请求参数name的值,好了,框不允许,我写一下,你看一下啊,点框。保存好了,我写了。他说什么呀,他说这块的话呢,他说他如果不支持运行值表达式啊,他不支持,所以说这个你就写一个十吧。好,跑一下。大家看at硅谷跟框是不是传过来了,这只传过来,这个传过来之后的话呢,我的需求是什么,我的需求是不是说我要把这两个值,把这个值打印这些遍。这个事儿又不是那么的难了。于是我们看。既然打印那么多遍的话,这个out我都拿出来啊,Print right out等于page.get。
14:07
哦。嗯。好,然后。写一个。印。矿等于零。好,C等于in,点我写上一个point。For循环in等于零小于CII加加二点。Value。然后加上一个什么呀。你要加一个边点。
15:01
点这就可以了。好看效果。这个账。不卡了十遍啊。我们还可以把这个序号加上。嗯。I加一。保存再看。好了,加上序号就是这个效果,哎,这就是。带属性的标签小结一下。二我们说这个方法吧J。
16:02
有一个方法,等他好了,这个方法的话呢,一定会背。一定会被引擎所调用,一定会掉,然后呢,先于先于什么呀,都看他把。代表引擎的。Page context。转给。标签处理器类,处理器类好了,这个是set jsb context方法来说的事,那一般情况下怎么实现呢?实现的方式的话呢,通常是这样回来。
17:00
Proceed。这个值我得接收着呀。嗯。哎,通常都提供这样一个视线三。叫带属性的自定义标线。好了,那。这个呢,需要有几个步骤。什么叫带属性的呢,一。实际上这个顺序啊,应该是先。在。标签处理器类中。定义。Set方法必须的,你先定定义赛方法,这里边的话呢,我们说一下啊,建议把所有的属性类型都设置为。
18:08
四寸类型,因为我怎么样,我从这我从这块传入的,传入的这个东西,我比方说你要定义成一个int形还是什么形,我传的不一定是一个T形吧,所以说我们都给它怎么样形成一个string形,那我写的话呢,我这里边我就这么写的。赛的方法。对。成为C出来,这就是这里面干的事。这是第一步,第二步,第二步是在TLD描述文件中来描述属性。怎么描述呢?这个描述实际上并不难。在这怎么描述的,使用来描述,把这个复制过来,这C过来,你稍微往前串属性零,这个属性是不是必须的,是不是可选的,然后这个属性是不是可以接收运行普拉的动态值,这我们刚才已经看到了三。
19:17
这要再搞定的话呢,然后怎么啦,然后就是在页面中。使用属性可以了,那属性。然后呢,属性名,属性名同同什么呀,同TLD文件中定义的名字好了,那这块的话呢,这个属性我们也说一下啊,需和需和标签处理器类的。Set方法定义的属性。属性。相同吧,就是第一个字母变去掉S,第一个字母变小写吧,就这个意思,那这怎么用呢,这样用。
20:12
C过来。那整个这块这个过程呢,我们都说完了,我们一共是讲了两个点,第一个set j context。第二个,如何来写带属性的自定义标签?好,我们来做一个练习。我们来看它。MAX1。定制一个带两个属性的标签max,用于输出两个数的最大值,在页面上这两个数量库的最大值清楚没?再来第二个练习定义一个带属性的标签at,硅步read file s RC,然后的话呢,我可以把这个文件的内容都输出到页面上,这个是不是得用IO流啊,我把那个文件读过来,但是这个文件啊,我应该是在当前的外部应用一下啊。
21:11
读过来,读完之后的话呢,把这个文件都输出到我的页面上,而这个呢,是输出两个数的最大值来搞一下。第一个练习mark标签。
22:09
好了,然后呢,有两个属性。好,写完这里边的话呢,需要输出一个最大值。等于page contact.get out。好了,灰常的话呢,控制一下吧,靠什么呀,输入的属性的格式图。
23:04
正确。八个点。A大于B吗?大于的话取A,否则的话取B是吧。嗯。Max凯。Curry。嗨,那个。那。
24:04
目前是。两个属性,两个属性都是必须的啊。Attribute。NUMBER1。块处。Prime time expression value。Number two。用在。嗯。这个里边。第二,At硅谷NUMBER1。点A。
25:03
点B。不挣钱,因为我不没出呢。A等于12。B等于13 13吧,12吧,是不是写完了,这就是最基本的一个写法,没有什么更多需要讲的哈,就是这样一个实现就可以了啊,我们这块的话呢,要说一点。大家发现呢,在我们写这个自定义标签的时候啊,我们实现这个接口,实现接口是不是挺麻烦的呀,我需要实现这个接口的全部方法吧,虽然这有些方法我一点都没动那。我也实现了很麻烦,那我们看一看这个接口接口,这是一个接口,我们希望什么呢?我们希望这个接口有一个实现类啥的。
26:08
本周C看他吧。Simple有一个什么呀,它有一个simple tag support点开,诶,这个是他正儿八经的实现类,我们来继承它试试哈。Extend STEM support。保存c shift会有什么不一样吗?先停掉看,这个时候这个方法我就不用写了。什么都不用写了。都不用写的话,他怎么来啊?啊,这么来呗。配置contact contact等于get JSP contact它有一个方法给我们写了,这个时候的话呢,这个时间是一样的,我们一会就看一下源码哈,先跑一下看好不好用。
27:12
一样好用没问题,好了,我们去看一下什么呀,我们去看一下这个。Simple textport。点一下去找谁呢?应该去找com服务器。Tomcas。X2C,好了,你看这位怎么实现的啊。对,实现的这个接口,大家看是不是有parent tag GP tag,还有一个JP fragment,这是三个乘以变量,这是一个无传的过照器,不太空空的吧。赛是不是把这个JSP tag付给了这个?
28:05
Apartment tag,然后他提供了一个get方法,这个方法可以干什么呀?可以返回这个apartment tag。再看set j contact是不是把这个呃配置。那就提PC是吧,JP刚才付给付给他了,那同样提供了一个这的方法,这个方法是不是自个儿定义的,这个方法可不是接口里边要有定义的哈,同样set body它也提供了一个呃,Get body。后边的话呢,是另外的一个方法,这个方法的话呢,也不说是吧,前面的几个方法的话呢,直接用就可以了,我们来说一下啊,这是我们写这个练习的一个收获。四。嗯。
29:05
四那通常情况下。通常情况下,开发简单标签,直接继承simple。就可以了,好了,我们把这个实现类的话呢,简单的跟大家说一下。不要看着复杂哈,一点也不复杂,拿过来。往这放啊,很多时候都是什么呢?很多的时候都是一些注释,注释我们不看就完了。不看。好,你看这是dead body,一会我们讲这个标签体的时候,这个。
30:01
J fragment代表一个标签体,你看它是什么呀?这是不是一对get的方法呀,前边有一个。乘变量,这也是一对get的方法。嗯,又是一对的方法。太就是空的。构造区是空的,我们可以不要。然后的话呢,三个属性。上。这是tag。在这儿。
31:03
好,再来。这儿呢?还有一个是GP。在这儿。看到了吧,这个代码的话,大家都可以看得懂,我们直接记住它就可以了,然后的话呢,可以直接。可以直接调用其。对应的get方法,得到对应的APIOK,好了,下一个。下一个呢,叫read file。Re file。绿的。
32:04
继承simple直接写的do,嗨,这个有什么呀,还有一个属性的src。怎么实现啊?SSRC,我得先把这个输入流整出来吧,输入流好了,那这个的话呢,这个src应该是相对于当前web应用根路径的一个路径,是相对于当前web。应用的根路径的。文件名,OK。那搞吧,我需要一个输入流input in等于这应该用谁呀?应该用service context比较好,好了。
33:13
我们先得到这个配置,Context等于get GP。做一个强转,然后的话呢,配置contact。Application。context.get stream,我们说了啊,这个是代表根目录下的src就可以。OK,写完这个有了,然后的话呢,这应该是一个呃。文档就不是一个二进制文件啊,于是给他包装一下,包装什么呢?这个是最好的,因为我听一行行读嘛。
34:03
Reader等于new ber的reader reader是不是需要一个reader?六。我我这是个什么呀,我这是不是一个stream,我有stream到ER怎么去啊。是不是有个stream叫什么表空流吧。搞定好了,这个搞定之后的话呢,我可以一行行来读。Will写个FTR等于now,那等于什么呀?等于FTR等于瑞德点瑞。如果这个不等于now的话,我怎么办?那来写呗,配置context.right。
35:06
啊,Get out right。可以写写一行。T,写完一行之后是不是得换个行啊?这contact get out.right。第二。行吧。总体写的话呢,就这么写,当然我们还可以加一些什么的啊,然后呢。去。PLD文件里边来证明这个标签。Class。
36:03
Empty,好了,只有一个属性。CTRLCCTRLVSRC。CTRLF可以了。用吧。我们直接把这个文件。CTRLC复制到。外面刚的下边它。嗯。JPDRDR帮我们看一下啊,At,硅谷read fair s rt根目录下的web INF目录下的not.t。
37:00
跑起来。嗯。是这个效果吧。这样不就搞到了吗?就是哦,是什么问题大家说。大家看这个天LG里边描述这个是没出来,你看什么问题啊。TLD里边描述这个没出来过来。大家看我这里边儿,我是不是有标签啊,这个标签需要。转换一下,如果这个标签要不转换的话,那在在那个HTL文档里边,他认为这是不是也是一个标签,他就给你瞎转看一下你看。又见。另文件这里边那是正常的,只不过的话,这里边怎么了,这里边他看见这个tag呀,看见这个BR啊,那就得瞎搞了哈,你这个不行,我们得给他转一下,怎么转呢?首先从到这个里边来,我打开LN吧。
38:11
不打LN,看着有点太太不爽了哈,点print print LN看这个方法。这样的打一个str。Bta。点儿。不是他OK,这个时候的话呢,我们看语音文件的时候会舒服一些。再看。在刷新。原文件,你看这个原文件的话呢,就跟我们想的原文件一样了,只不过这里边大家看这里边是不是有大量的这个带标签的,带标签的他就认为这个也是一个HTML标签,所以说的话它不会转,我们应该怎么样,我们应该把这个。
39:07
再把这个标签转成。转到什么不会出这个问题啊。LT吧,是吧,大于号呢。转成。嗯。GT版这个数没问题,这个怎么转呢。如果要是确实遇到这种的话,我们需要给他转一下。一行一行都很好,我们要是遇着每一行里边要是带那个小于号或大于号的,需要给它转一下,怎么转呢?这一行里边啊,可能会有。很多个str,那我得把那个str都转成我需要的格式。
40:00
怎么转呢?就是目前我们这个要求实际上已经达到了啊,但是我们想给他写的好一点,你想转的话,应该怎么转呢。那我就不能什么呀,一行行输出的时候必须得保证,必须得保证什么,必须保证我输的这个里边已经是被选好的str。我不知道这个用什么是最好的用。正则表达式是最好的,那正则咋用啊?在接触。SE里面正则。如何去找郑泽?我们以前叫IP没找着,然后怎么办?Dream。String这个类里边的话呢,肯定有处理这个字符串的基本方式,我们看找啊,比方说找replace。
41:11
Replace,我们在换的时候的话呢,我们希望能够看到一个这个里边有一个带正则的一个东西出来就好了。这也不是,这也不是哦,这个是它是什么呀,这是一个,这是一个正则表达式的一个效果,Regular后边的话呢,符合我们写一下吧。那正式法函是这怎么写呀?Patternon compel,用用这种方式去得这个,用另种方式去得这个正则吧,那看见了吧,Pattern comp replace all,那既然写了,拿这个写吧。CTRLC过来。这是正则表达是。
42:01
这是替换成什么什么东西?Ctrl o。这里边他坑啥呀。快点。哦。这个意义的,不是这样。开大家看哈,我首先的话呢,这个应该是一个正表达式,那写吧,我这应该正表达式应该是包含着。小一号。小序号,然后的话呢,它需要去编辑一个它replace哦,变成什么呢,变成。LT反还是一个string,就是FR,等于它再写一把把。大于号变成。
43:00
具体对抗。是不好了,这样这个就全部都完成了,就这么着。记住什么呀,这就是输出的这个效果。看到了哈,这就是我们这块输出这个效果,那这里边的话呢,我们用到了一个正则表达式,我们以前呢,没有特意的讲过如何去用它,那怎么找的呢?我甚至连Python都不知道,于是就想啊说呀,String这个里边貌似应该有,然后找到哦,看这个RG Rex,我本来呢,我还想这样写。没找着,那于是的话这头来找,于是的话呢,看到一个提示,然后这个方法完全都是通过这样的方式来写的。一放就OK了,那整个这个输出效果的话呢,我们还是挺满意的。行。
44:05
好吧,这样的话呢,我们这个带属性这个就可以了,下要再讲的话应该讲啥了。这个应该讲在。副标签的跟带标签体的,我们今天这两个的话呢,我们先不讲了。
我来说两句