00:00
那前边呢,我们讲课已经讲到了,我们可以来写一个带属性的自定义标签,那么现在我们来看这个C接口哈,这里边的几个方法,第一个set JSP context,这个方法是一定会被JP引擎调用的,它干什么呀?他把代表JSP页面那个配置contact对象传过来。好了,如果没有属性,没有任何标签体,也没有副标签的话,下一个的方法应该是do t这里边。将去执行整个标签体的逻辑。好,那我如果要是有属性呢,我把这个属性放在这个set叉叉叉方法里面,哎,这个是属性,好下一个我们要写一个带标签体的这个方法应该叫什么呀?叫set JSP body。
01:06
好了说如果有标签体的话呢,JB引擎将把标签体封装成一个JD fragment对象,把这个对象传过来。好了,这里边出现了一个对象,叫什么呀?叫JP fragment,那JP fragment它就封装了标签体的信息。就是我们如何去学习这个面向对象,如何去学习张海啊,这我们拿来一个类的时候,你得知道这个类代表的是什么意思。JP fragment看一下。哎,Fragment那它代表的呢,是标签体,这个时候什么时候用啊。
02:05
在我们学习自定义标签的时候,需要用到它,这里边儿呢,有这样的,呃,两个方法,第一个方法叫get j context返回。J contact j是谁来着,是?配刚才的。互类吧,所以说这个的话呢,我们基本上我们在这个标签体里边,我们在这个自定标签里边用不着,因为自定标签里边的话呢,我们已经有一个方法可以搞到那个,呃j context,所以说主要用的呢是这个方法叫EVO,它里边有个什么,有一个out叫输出流,那这决定了什么呢?我们看out。这个out是一个writer,那这个决定着我会把这个标签体输出到神马位置,如果是空的话,就意味着我输出到哪呀,输出到页面上。
03:06
好了,我们来试一下这个方法,带标签体的。新建一个。对多少了,37。新建一个包。新建一个标签处理器类好了,那这块的话呢,我们也把如何写一个自定义标签这个过程的复习一遍,第一步应该是先来编写一个标签处理器类,我们这个类的话呢,我们叫test。JSP fragment。
04:02
它的负类应该是simple,下一个support是吧,这就可以。好,直接来写都。Tag好了,我们前面学这个GMPF,呃,这个c po的时候呢,我们知道它有一个方法叫GP,这么写吧,叫get。Body这个方法呢,是在这个类里边是实现的,还是自己定义的一个方法呀。啊,自个定义的一个方法,那个方法应该是什么呀?那个方法应该叫set GI body,那个方法是接口里边定义的方法,而这个是我们自个儿实现的方法,那写吧,它返回一个什么呢?他想返回一个JP。
05:00
Fragment body content,它代表的是标签体,好了,那这个标签体里边呢,哎,有这么一个方法,Body content。具体有两个哈,一个是还有一个什么来着,Get contact这个方法的话呢,直接用用不太上,因为我们在这个。标签处理器类里面,我是不是可以搞到这个JP contact,它本身有这个方法了,所以说的话呢,给他就可以说呀,如果这个是闹的话,意味着什么呢?意味着他把这个标签里的内容输出到页面上。哎,我们说一下这个方法叫JSP。Fragment的眼窝。里边是个什么呢?里边是个writer。我们看API,我们知道啥意思啊。
06:01
大家看看什么意思啊,说这个writer实际上就是这个标签体输出的那个。输出到什么位置是吧,如果要是空的话,表示说输出到这个out里边,OK说一下啊right。即为标签体。内容输出的。字节流。这福利。若为闹,则输出哪输出?到到这个地方get JSP content get out,说到这个地,这个地是什么呀?就这个页面上。
07:00
D。输出。到页面上写完了。好了,那下面的话呢,我们来写一下这个,嗯。带标签里的标签的这个配置哈,那这个就搞定了,这就是我们的标签处理器类,我们也不写属性回来。回到这个里面,定义一个TD。定义一个TD文件。XML,比方说Y减TLD。好了,写好了,这中有一个问题,那个头什么的去哪考呢?我们还是把这个GTL给它搞进来。JSTL这个里边呢。
08:05
力或者你直接过来考也可以哈,我们省事的话直接拿进来,然后呢在页面上。我来用一下,比方说这个叫KGSP。这样搞。3C我用那核心标库啊。嗯。UI。这个。点它我要的是这款。这部分是固定的。拿过来。有一个结尾,OK,这几分内容呢,需要改第一个。My tag,我的标签版本呢,变成1.2my tag扣。
09:08
版本1.2,好了,这个是建议你在GP页面上使用的前缀艾特恢复。And硅谷点。com。MYOK,好了。这边干什么呀,下边我们来,嗯,对这个标签做一个声明,记做一个配置叫。Name JSP。Fragment。Body content OK,那以前我们写个empty是吧,现在需要写东西了,暂时我告诉你先写这个scriptless,一会我告诉你它表示的是神马意思,先写上。
10:07
再来。还有一个什么呀,下一个class。后来。C、拿过来。这个啊。保存可以了,页面上用一下。And硅谷car。艾,对,不好了,写一个艾特对步好了,这个有标签体,我来写一个哈,Hello word。保存看一下。
11:12
嗯,输出了,我首先的话呢,搞了一个writer,然后呢,我把。我把这个,嗯。标签里的内容输出到这个里边,然后我在sit out给它进行输出,这样的话呢,我们在控制台里边就可以看见这个内容了,然后我们看这张图是没有了,诶我现在要有一个这样的效果,我说我要把。JSP页面里边这个标签体都变成大写,怎么写?我说呀,我还是在JSP页面上把这个内容输出来,不过我要求把里边的这个所有字母都变成大写。
12:02
回来我们看一下过程啊,首先呢,诶第一步利用。什么呀,得到标签体的。内容这已经搞到好了,被搞到之后呢,然后。第二步,把。标签体的内容都变为大写。第三步。获取PP页面的out隐含对象。输出到页面上,好了,变成大写,我写一个吧,Spring content等于SW点。
13:09
点to up大写了,好了,我输出到页面上怎么数啊,Get JSP。Contact get out OK,看效果。没有重新加载呢。好了,哎,这个时候的话呢,全是大写了。到这个页面上你看。ABCDEFG。我本来是。本来是小写的,这样的话呢,就变成大写了。好了,我们回过头来呢,我们把带标签体的自定义标签来做一个小结。
14:11
我们说的是带。标签体的自定义标签。好了,大家需要想一下有哪几个点呢?第一个点。我们说弱一个。标签有标签体,如果要是有的话,样子是个什么样子啊,大约长成这个样子。CTRLC过来,大约上是这个样子,那么我们说,哎,在自定义标。签的标签处理器中使用什么?使用JSP?
15:03
Fragment对象。封装标签体信息,第一个我们找到了一个类是吧,叫JP fra好了第二个。第二个我们需要知道什么呀,我们需要知道,哎,你这个对象什么时候给我传过来呀。什么时候传的呀?于是呢,我们来看这个simple。Textport我们看一下它有什么方法呀,有一个叫set j body方法,哎,这个方法的话呢,是simple tag接口里边定义的,如果有标签体的话,它就会自动的调这个方法,GB引擎哈,调这个方法,把标签体内容对应的这个JP fra对象传到我们这个类里面,传过来,重了之后一接收我这块是不是提供了一个get的方法呀?
16:02
用get方法我就可以来进行引用了,哎,第二个。说。加引擎说吧,若配置啦。配置了标签。含有标签体。则JP引擎会引擎。会要用什么方法呀,用set。JP。对哈,Body方法。把这个对象传递给标志处理器来把它。
17:00
船。递给标签处理。气累,哎,这个是我们看到的,这个的话呢,会传过来,好了,这个传过来之后的话呢,然后我们这边我们来多写一句吧,我们说在哪个类呢?在这个类,在这个simple textport里面。在这个中还定义了一个什么方法,Get JSP body方法。用于返回JP对象,用于返回它,所以说我直接用就可以了,好了,那我们看一下吧,这个里边一共是有两个方法,其中有一个重要的方法叫引work方法的引。
18:00
Book方法里边有个什么呀?有一个writer,好,我们说一下这个方法有什么用啊?这个方法的主要作用是把标签体内容输出到这个write里边,或者说把标签的内容从那个write里边进行输出。说把标签体内容重write中输出。他就是干这个事的书。好了,若为闹,若为闹,则等同于就等同于什么呀也。悟空。叫get gp.get out同学看。等于它是啥意思啊,G直接把标签体内容输出到页面上。G直接把。
19:10
标签体内容书。书,书到。页面上好了。四。呃,这个搞定之后的话呢,我们在这个呃,标签处理器类里边,我们就知道如何去处理这个标签题了,首先啊,我们实际上这块什么呀,这三步就是在搞一个JP fragment就是搞一个它好了,下面我们看一下配置说在TLD文件中使用什么呢?使用。叫。Body content。啊,来描述标签体的类型。
20:02
使用这个。节点来描述标签标签体的类型,好了,那它可以取哪些值呢?它可以取以下的一些值,我们看一下。渐成,那我就直接来了啊好了,可能取值有三种。说第一个我们要说这个是指定标签体类型,可能取值有这样的几种,第一个empty叫没有标签体,第一个没有标签体,那这个不用说了啊,就是。空标签第二个script script是什么意思啊,它什么意思啊,是不是脚本啊。类似。
21:00
没有脚本。没有脚本,那就是说标签体可以包含EL或者是动作,但是不能是JSP的脚本元素,什么意思啊?就是说这个时候啊,如果取这个scriptless的话,我拿过来大家看。对。啊,已经取它了哈通包取这个的话,那这个时候怎么了?这里边的话呢,不能有脚本,但是可以有这个,比方说hello,有个EL是可以的啊,点name保存。回来你看写了。问号name等于。这是可以。没问题,说不能有脚本是什么意思啊。写个他。脚本啊,大家看我这么写,这也是一表达式,比方说啊request点,比方说name。
22:00
请吧。这样写跟刚才写的EL是不是一样啊?嗯,看上去是一样,但实际上是。不行的,回来。再看一遍哈,我这么写X。我们想着跟这么写是不是一码事啊?来,我写一个,你看第二第二。他俩看上去是不是一码事啊?绑一下。没问题啊,一码事啊,好了,但是我现在的话呢,我把这个位置替换成它。再跑这就不行,那为啥不行啊?他说了是吧,他说这个里边啊,不允许包含像这样的元素。
23:00
不行,里边什么什么大于号啊,小于号啊,根本就script。不让包含,所以说这个里边我们就说了啊,这里边儿不允许包含任何脚本元素,包括什么,包括表达式,这里边的话呢,用的最多的实际上就是这个EL好了,最后一个叫t dependent,它是什么意思啊,依赖于把这个标签体。不经处理的交给标签处理器类。不经处理的交过去什么意思呢?我再回来,这个我再改回来,好了,我们取这个给大家看一下。看依靠看。我完全不加处理的给到你。大家看这是个啥问题啊,他是不是根本就没去执行这个液压表达式啊,直接把这个结果给到了标签处理器类。
24:10
那这种的话呢,是我们不希望的,所以说的话呢,一般情况下,我们要是定义一个这个。对对,一般情况下,我们要是定义一个这个body content的话,取值大部分的时候是scriptless,就绝大部分取值。大部分情况下。取值为啊。好了,这时候这里面我们如何配置,我来写一下吧,配置的方式的话呢,就这么配。C。行,这就是我们带标签体的自定义标签。
25:03
好了,那我们来看个练习吧。五、我们把这个标签体和。我们学习的那个属性结合起来来定义。定义一个照相。什么呢?比方说at硅谷点这个time多少次,比方说啊,我写个14。嗯。嗯,对,就是结束啊,我们说print after。啊,然后呢,里边我可以写个值ABC def FB。这个看上去应该是比较这个显然的是吧,他把这个标签体变成大写输出这么多字清楚吧。
26:03
把。标签体内容。转换为大写并。输出。汉姆寺。到流来气上好了,那这个的话呢,这个方法的话,我再多说一句啊,说这个方法呀,有的时候呢,我们可以借助于这样的一个类,说有时。可以借助于哪个倍啊叫那好处是什么呢?啊,可以把可以在标签处理器类中先得到先。
27:01
得到标。虾。第二体哒内容,哎,为了干这个事怎么写呢?写这个代码的话,我这里边我是这么写的哈,先扯到他,然后把这个内容先搞到。嗯,这哎,我这块的话呢,我就是这样来进行使用的。好了,大家把这个练习来完成一下。我们一起来完成这个练习,叫Apple新建一个标签处理器类普卡。Up标签嘛,Play simple。
28:02
Mo。好了,这个属性啊,属性看属性一般都定义为。星,因为这个时候船的话呢,不会出错。SI。好读T方法我们要求是,呃,把这个。什么呢?标签体内容变为大写,而且打印这么多次在JSP页面上,所以说第一步先需要得到标签体的。内容第二步。变为大写。第三步得到。奥眼含。变量。循环。
29:05
输出。那就完了,就这么几步是吧,第一个先得到。我这么写是吧。叫JPG等于get JP。好了,变为大写,用spring writer letter,然后呢,把那刚才那点involve输出到里边去。得到标签体内容上边的应该是哈。等于SW点,因为大写SW。
30:05
Content content等于content to upper。得到out。一起来吧。二循环。In I等于0I,我是不是小于一个数啊,这个数的话你写1COUNT等于一,然后呢,Co等于in.time把这个拆开起来,因为这一步是不可能会有异常啊。有异常的话呢,我们直接就让他输出一次得了。自个儿写吧。
31:08
每部书啊,放弃,然后呢?Get。哎,小没写完是吧。I加加,然后是get JP contact get out点。很悬,这就是整个的这个逻辑,我需要给它配一下print。CTRLC过来。In b。Upper。
32:00
那个class。还有一个什么呀,是不还有个属性啊。属性,属性名叫汉吧,这个决定于谁呀?是不是决定于我们这个里边这个set方法呀。决定于他哈,但这个属性跟这个字段的名字往往是对应的,Required。还有一个。Runtime exception value。写完用一下。爱他归谷。十次好了,大家看一下啊,我这个十次是不是就干打了十次是吧,我希望打完之后的话呢,加一个换行吧。
33:07
看着会清楚一点,第二前边呢,加上一个标记。I加一。加。这个时候最开始这个I加一怎么样,它是不是数字啊,然后再加到它,所以说这么写没问题啊。再回来,跑起来。JP。啊,我们写个ABCDEFG保存。是这个效果吧,输出了十次,这样的话呢,我们这个就下来了。王晨。
34:05
好了,这样的话呢,这就OK了,行了,那这个的话呢,仅是一个howood级别的,我们想写什么呢?我们想写,我们在前面写那个for each可以写了哈,我们前边最开始讲自定义标签的时候呢,讲过一个hellowork,我们hello word级别挺高的,说呀啊,我在页面上对一个集合进行便历的时候,可以用一个标签叫c for each,它很好用。我们现在来看一下这个是如何来进行实现的,首先我写一个卡,写这样的一个召唤,并写写几个属性。选完概算方法。
35:00
债读属性的道理是一样的哈,构造方便的话呢,我们写一个带参的构造器,但是因为它是照化B,一定要提供一个无参的构造器,Ctrl shift的F。写完OK,好了,我还是在这个页面,那我首先呢,喂,我先来做一些准备,做什么准备啊,我往list里边放几个卡,然后再把这个list放在请求域里面。MIS customer customer等于new。看看写完,然后呢,放几个进去。六八什么啊一。
36:16
He has their site attribute。写完我们知道对于这个便利的话呢,我可以用Java代码吧,我们前边的话呢,我们说在gitl里边可以用一个叫c for each,再看一遍怎么用的,因为一会我需要来写一个自个儿去写一个for each看啊。Item里面放的是什么呀?Request范围内的是不是集合呀,然后是个我跟的是个什么呢?跟的是一个字串past,然后啊,我把这个内容进行。
37:08
输出。Past点。ID。past.name。比较那什么哈,回来打一个B2。好,再看我们的视线。是这个效果吧,这个前面这个是ID啊,这不是序列号了,这是它的名字啊abcde好了,这个是用什么呢?是用。C for each完成的control c,我们的下一个任务就是来实现c for each。
38:05
实现。For each标签。好了,那我们研究一下啊,这怎么实现的呢?说呀。这个标签应该有两个属性吧,一个是item,一个是wall,过来看说啊,首先两个属性分别是item,大家看item这个应该是个什么类型啊?什么类型啊,是不是一个集合类型啊,写上哎集合类型。集合类型,集合类型应该是什么类型?这个类型OK,下一个。
39:02
喔喔,是什么类型呢?我告诉你啊,就是一个string类型,就这个字串,OK2个好了,这个我们看如何具体实现呢。怎么具体实现啊,那我一定是在。Do t里面得到这个,然后对进行便利,那跟这个沃有什么关系啊。比方说我这块我改成。C需要改的是哪个?这个变成C吧,是这意思吧。好了,那我下一步的话呢,我把这个写的再明显一点,我这么写,大家看这哈。我捡了一个APA。
40:05
点past点好了再看。这是不是一样啊?这说明什么?我如果要是这么写的话,我们知道我这个我是不是可以省掉啊,我可以这么写CTRLC再复制一遍。这个很关键,什么意思呢?哎,这是cast,这就是cast,我这要是改成cast to的话,是不是改它呀。好了,说do里边怎么处理呢?首先我们知道一定是便利。Itunes集合吧。对应。
41:01
的集合必须的必须的,那我们我们看这个标签体哈,标签体我实际上是不是从这个配置范围内拿到这个属性啊是吧,然后的话呢,打印ID,那你这块能够拿的话,是不是意味着我在这块我得放啊啊把。正在。便利的。对象放入到。配contact中调用page contact set tribute,电是谁呢?见值对,剑是谁呀?就是我直呢,正在。便利的对象好了,那我只有是我在便利的时候给它放进去,我这块我才能获取吧,然后还没完。
42:06
第一步。第二步放里了,放里之后的话呢,然后我肯定是得干什么呀,我这个标签体的话,我也得便历呀,在我每一次变历的时候,我需要把那标题的内容给。打印出来,原声打印说把标签体的内容直接输出到。页面上是不就可以了,看看哈,看看我首先的话呢,我对这个item进行遍历,然后我把我便利之后的。每一个啊,正在变历那个对象放到这个里边,这个是建这个啊,这个是值,是不是意味着我正在便利的时候,比方说哎,我有一个对象叫customer。
43:02
Customer模那个name是AAA,好了,我把AAA对应那个customerma放到了配置context里边,然后的话呢,这个是键,我这样一放的话,我循环的时候,我关注这个标签题,我就是是不是可以获取了,然后标签里直接把这个内容进行打印就可以了,这就是for each标签的整个。底层的流程,当然实际上的话呢,比我们这个要复杂,因为这个it啊,还可以接收map,但还可以便利,我们也可以那么做,你只需要让这个属性是object类型就可以了,然后的话呢,去判断它到底是collection还是map,但这个。并不是我们这块谈的这个重点,我们不想写一功能那么强的,但是我们要写一个,哎,能够实现这个for each功能的。以这样的方式呢,来巩固我们这个,嗯,自定义标签,然后还为我们学习GTL来做准备,好得看一下哈,两个属性,然后do t里边的每一步我都已经写清楚了,大家首先看一下这个五这个有没有问题,五这个没问题的话,把这个六搞定。
44:16
一起看看哈。这个代码的具体实现,我们写一个标签。For each,继承simple tIgEr。Private。那这个时候的话呢,这个一定是一个collection,这个时候我们就不能用什么了,不能用字符串接了。Collection的。
45:05
问号。好set,然后呢,有一个string形的wall态写好,写好之后呢,呃,这个步骤我们刚才已经说了,在这。De。便利集合。Object接。好了,把正在便利的放在我们的。
46:00
配置contact这边看1JP contact电视过直是OB接,然后呢直接输出到页面上。干啥?Body body in now。就完了呗,然后。去。声明一下。我们这也叫负意思啊。看吧。
47:03
What content scriptless?有两个属性。C。有一个叫,还有一个叫保存。不难。这样改就可以。都一样的。保存。是不好了。这样的话呢,就实现成功了,就这么写。
48:00
好,我们来打一个断点啊,我们看看我是不是这样,我这个是一个便利29行打了一个断点,然后的话呢,我们要进行输出,输出的时候我们回到页面上。41行为极大的一个断点,好了,第八个。大家看obj是谁呀?Obj是不是?那customer ID name found过来。啊,每一个放是吧,JSP页面上这个断点的话呢,没起作用,行,那我们就在这边看吧,这个时候的话呢,每一个都放了,所以说在页面上怎么了,在页面上的话呢,我就可以利用这样的方式进行输出,整个这个过程不就可以了吗。
49:00
以上呢,就是我们讲的关于带标签体的标签,那我们可以把这个for each呢进行进一步的增强,比方说我再写一个,大家再看。我写个麦。你有哈希麦?然后呢,我往这个customer map里边放什么呢?哎,我们来放这个一个一个的customer。
50:09
然后我把它放到request里面去。放好,放好以后怎么样啊,放好以后的话呢,我要给它进行便利,这个也可以便利,我们看一下怎么便利哈,我们刚才写了一个c for each,是来便利这个list的,我现在的话呢,我们用c for each来便利一下它,回头大家可以把这个进行进一步的增强,也来便利它,先看效果。Three four four。
51:02
谁呢?直接写他吧。Customer。看这。哎,我这是一个什么呢?这是一个这个叫呃。麦我也来写的,它我写的cast,所以你这个写法啊,上面这个写法跟这块是不是几乎一样啊。拿回来CTRLC还有什么特点啊,这个家伙有一个东西叫。K,还有一个叫Y。Y6.id。再写一个。cast.value点。Name保存,先跑。嗯。
52:01
先过吧。看见了吗?那没有顺序的abcde这样就可以了,大家可以考虑一下,这个时候如果我们自个写这个过程的话,应该怎么写呢?对,来想想自个写的话应该怎么写呢?这是一个map,如果传入的是一个map的话,那这个时候怎么了,这个时候我们靠这样的方式再直接写的话还成吗。什么意思呢?我直接把这个改成爱硅谷,你看一下能不能跑起来。And see。Come for me。很注意,因为我们艾特硅谷里边,我们是不是也有这个,也有这个呀,OK。肯定跑不起来,为什么呀。这个类型是不是个map啊,我这个类型是是个什么呀。
53:01
我是不是是不是一个collection呢,这个是连负都糊不上。你看。什么问题呢?他说不能够进行转换是吧,它是个什么呀,这是一个键值,对不能转换什么呢?不能把它转换成。这是一个哈希map不能转化成collection是吧?这块就不行好了,哈希map不能转化成collection,这是我们的第一步,我们需要改的是啊,把这个比方说我既要接容它,又要接容它,这个时候这个items就应该是一个object,因为我map和collection并没有一个负接口了,所以说是一个object,然后里边呢,里边呢,这个时候我们往。集合里边放的是什么呀?往集合里边放的是一个,呃,叫往集合里边放的是一个,不是集合呀,往配置框材里边放的是一个cost吧,好了,那这个点k.Y6应该怎么处理,这个也需要思考一下。
54:13
行吧,这个课后的话,大家自己来完成吧。行,这样的话呢,关于带标签的这个标签的话呢,我们就说到这儿,把这个发下去,大家也来写一下。
我来说两句