-
这节课使用SimpleTagSupport写一些案例。 一,JSP2.0和1.0的标签库文件的区别也就是约束头的不同,以及相应属性的支持略有不同 首先新建一个包,来存放这节课的代码。com.imooc.tag2 接下来新建一个标签库的文件,imooctag2.tld 创建jsp2.0的标签库文件,要使用jsp2.0的xml的约束头, 2.0和1.0的标签库文件的区别也就是约束头的不同,以及相应属性的支持略有不同 1.0的约束头可以在tomcat的 C:\apache-tomcat-7.0.68\webapps\examples\WEB-INF\jsp中找到,example-taglib.tld 也就是这个 <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> 在这里我们直接使用2.0的约束头 C:\apache-tomcat-7.0.68\webapps\examples\WEB-INF\jsp2 jsp2-example-taglib.tld 也就是这个: <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> 其实我们不必关心两者的差别,我们直接使用2.0的就可以了查看全部
-
什么是标签处理器?就是标签处理类,java文件。查看全部
-
为了开发方便,JSP规范为我们提供了SimpleTag接口的实现类,SimpleTagSupport那么我们在今后的自定义标签 开发中呢,可以直接继承SimpleTagSupport类就可以了,这个类除了对SimpleTag接口进行实现外,还增加了两个 方法。getJspContext()和getJspBody() getJspContext()返回的是代表当前页面的JspContext对象, getJspBody()返回代表标签体的JspFragment对象。也就是标签体的内容, 这节课对SimpleTag的方法进行了大概的了解,下节课会对这些方法的使用进行举例说明。查看全部
-
经过前面的学习,发现实现自定义标签的过程有点复杂,那么多的接口和方法很容易让人头晕,为了 更为简单快捷的开发自定义标签,在JSP2.0的规范中,提供了SimpleTag接口 什么是标签处理器?就是标签处理类,java文件。 来看一下SimpleTag接口提供的一些方法 在源码中可以看到SimpleTag接口有5个方法 doTag()方法是核心方法,我们可以将所有的标签处理逻辑都写在这个方法中,这个方法 会抛出一个JspException,然后我们可以通过这个异常通知WEB容器,不再执行此标签后面的内容。 setParent(JspTag),这个方法呢,由WEB容器所调用的,是将父标签处理器对象传递给标签处理器, getParent()是获取当前标签的父标签对象,比如在标签嵌套时,可以用此方法得到当前标签的父标签, setJSPContext(JspContext)这个方法也是由容器调用的,这个方法是将JSP页面中的pageContext对象 传递给标签处理器对象 setJspBody(JspFragment)这个方法也由web容器调用,意思是将代表当前标签体的JspFragment对象 传递给标签处理器对象,这里的参数可以理解为标签体的内容 JSP引擎在处理简单标签的标签时,会将标签体中的内容封装到JspFragment这个参数中,并 调用setJspBody(JspFragment)将该对象传递给标签处理器,我们就可以根据需求来控制是否输出标签体 或者循环标签体 来看下JspFragment的源码:它是一个抽象类,有一个invoke(Writer)这个方法。这个方法用于执行 JspFragment对象所代表的代码段,也就是说,我们要在标签体中输出一段话,我们可以用invoke(Writer) 这个方法中的参数是一个输出流,使用这个方法就可以将我们想要输出的数据输出到JSP页面中, getJspContext()这个方法用于返回代表JSP页面的JspContext对象,查看全部
-
jsp引擎是什么?是什么工作原理? 1、JSP引擎: 执行JSP代码需要在服务器上安装JSP引擎,比较常见的引擎有WebLogic和Tomcat。把这些支持JSP的web服务器配置好后。就可以再客户端通过浏览器来访问JSP页面了. 2、JSP引擎的工作原理 当一个JSP页面第一次被访问的时候,JSP引擎将执行以下步骤: (1)将JSP页面翻译成一个Servlet,这个Servlet是一个java文件,同时也是一个完整的java程序 (2)JSP引擎调用java编译器对这个Servlet进行编译,得到可执行文件class (3)JSP引擎调用java虚拟机来解释执行class文件,生成向客户端发送的应答,然后发送给客户端 以上三个步骤仅仅在JSP页面第一次被访问时才会执行,以后的访问速度会因为class文件已经生成而大大提高。 当JSP引擎街道一个客户端的访问请求时,首先判断请求的JSP页面是否比对应的Servlet新,如果新,对应的JSP需要重新编译。查看全部
-
接下来在标签库中注册一个标签, <tag> <name>bodyTag</name> <tag-class>com.imooc.tag.BodyTagSupportDemo</tag-class> <body-content>scriptless</body-content> </tag> 然后创建一个页面,使用这个注册好的标签,demo6.jsp <body> <imooc:bodyTag> hello World! </imooc:bodyTag> </body> 启动tomcat,访问demo6.jsp 可以看到页面上输出的是修改过的值,而在控制台上得到的是之前的值, 这样就达到了修改标签体中内容的需求查看全部
-
下面我们来写个例子:首先我们创建一个标签处理类,BodyTagSupportDemo继承BodyTagSupport 然后复写doEndTag()方法 在这里由于要得到标签体中的内容, 所以这里需要声明一个BodyContent类型的变量 然后呢,再来复写一下setBodyContent(BodyContent b)这个方法,这个方法是由容器进行调用的 然后this.bodyContent=b; 然后我们将处理逻辑写在doEndTag()方法中, String content=bodyContent.getString();//得到标签体中的内容 这里我们将其打印一下, 接下来创建一个字符串String newString="www.imooc.com"; 然后使用bodyContent来得到一个输出流,它返回一个JspWriter 然后将这个修改后的字符串写回到页面中,jspWriter.write(newString); 最后return EVAL_PAGE;//EVAL_PAGE是告诉WEB容器接着执行自定义标签后面的代码,查看全部
-
这节课学习BodyTag接口和BodyTagSupport类的使用 简介BodyTag接口: BodyTag接口可以将标签体中的内容修改后再输出, BodyTag接口除了继承自IterationTag接口的内容之外呢,它还增加了两个方法和两个常量 分别是:setBodyContent(BodyContent b) doInitBody() 一个常量 EVAL_BODY_BUFFERED 而EVAL_BODY_TAG是一个已经过时的常量,这里不再讨论它 前面使用的doStartTag方法,除了返回EVAL_BODY_INCLUDE和SKIP_BODY之外呢, 它还会返回EVAL_BODY_BUFFERED 当返回EVAL_BODY_BUFFERED时,JSP引擎会创建一个bodyContent对象,然后依次调用 setBodyContent(BodyContent b) doInitBody() 接着执行标签体中的内容,并且 将标签体中的内容通过setBodyContent(BodyContent b)方法中的BodyContent参数,传递过来, 也就是BodyContent封装了标签体中的内容,这样就可以控制标签体内容的输出了, 那doInitBody()会在setBodyContent(BodyContent b)之后被调用 我们再来看一下BodyContent BodyContent继承了JspWriter,根据名字,知道它是个输出流,不同的是,它提供了一个 缓冲区来存放数据,它也为我们提供了一些比较方便的方法供我们使用 比如这节课例子中所要使用到的getString()还有getEnclosingWriter() getString()用于返回BodyContent中的一个string,也就是它会返回缓冲区中缓存的数据 而这个getEnclosingWriter()这个方法可以得到一个BodyContent所关联的JspWriter对象查看全部
-
接下啦创建一个jsp页面来使用这个标签 首先引入标签库<%@ taglib prefix="imooc" uri="/imooc-tag" %> 在body中: <imooc:iteration items="" var=""></imooc:iteration> 这里需要个数组,为了方便起见 在body中直接写java代码: <body> <% String[] nbastar={"jordan","kobe","t-mac"}; /* 我们将nbastar存储在pageContext的这个范围中, 这样便于我们使用EL表达式将其取出, */ pageContext.setAttribute("nbastar", nbastar); %> <imooc:iteration items="${nbastar }" var="name"> ${name } </imooc:iteration> </body> 启动tomcat,查看demo5.jsp 这样的话,我们的数据就循环出来了, 这里的items这个属性存放的是要循环迭代的数组或是集合 var这个属性指定了迭代变量的名称,也就是每次从集合中或是数组中呢,取出元素都会赋值给这个变量name 这样在标签体中就可以引用该变量使用集合或者数组中的元素了,那么当我们再次刷新jsp页面的时候呢 这里只会取到第一个元素也就是下标为0的元素,这是由于tomcat对自定义标签运用了缓存的技术, 后面我们会介绍一种更好的办法来替代它, 老师这节的var变量其实没用用到,在标签类中是直接写死的name属性,应该用var的值, 老师应该是故意留的一个埋点让同学们试试的吧,用心良苦啊查看全部
-
第二步: 记下来在标签库中对其进行注册 <tag> <name>iteration</name> <tag-class>com.imooc.tag.IterationTagDemo</tag-class> <body-content>scriptless</body-content> <attribute> <name>var</name> <required>true</required> </attribute> <attribute> <name>items</name> <required>true</required> <!--允许使用表达式作为属性值 --> <rtexprvalue>true</rtexprvalue> </attribute> </tag>查看全部
-
如何使自定义标签具有循环功能?jsp规范提供了IterationTag接口,从字面意思上看这是个实现标签循环的接口 我们来看一下这个接口IterationTag是继承于Tag接口(TagSupport整个类实现了IterationTag整个接口) 在Tag接口的基础上,它增加了EVAL_BODY_AGAIN的常量,和doAfterBody()方法,那这个方法和这个常量有什么用呢? 在执行完自定义标签体后,容器将会调用doAfterBody()方法,这个方法会向容器返回常量EVAL_BODY_AGAIN或者SKIP_BODY 容器会根据返回的常量来决定是否将标签体的内容再次执行,这里来举一个循环数组的案例, 第一步:新建标签的处理类,IterationTagDemo extends TagSupport 重写doStartTag()方法和doAfterBody()方法 接下来为该类添加两个标签属性 private String var; private String[] items; 并为其提供set方法 这里还需要一个计数器,定义一个int类型的i=1; 接下来重写doStartTag()方法。 首先判断items数组是否为空,且items长度大于0,当条件成立,将数组中第一个元素,也就是下标为0的元素放到 pageContext中,并且定义其key值为name if(items != null && items.length>0){ pageContext.setAttribute("name", items[0]); } 此时返回一个return EVAL_BODY_INCLUDE;也就是说让其执行标签体。否则就SKIP_BODY 接下来重写一下doAfterBody()方法 首先来判断i是否小于数组的长度,如果这个条件成立,我们将剩余的元素放在键为name的pageContext中,i++,然后 return EVAL_BODY_AGAIN;就是让其再次执行标签体查看全部
-
这里可以看到页面并没有正常运行(返回http状态码是500) 跑出了一个错误: According to TLD or attribute directive in tag file, attribute password does not accept any expressions 属性password你能设置为任意的表达式 这是什么原因呢? 这里再回到标签库描述文件中,这里要修改attribute标签, 在此标签中加上<rtexprvalue>标签: <attribute> <name>driver</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> 这个属性表示可以在运行时接收表达式的值作为属性值,将其设置为true,下面的类似。 修改这个tld文件不需要重启tomcat, 再次访问demo4.jsp可以看到页面上显示出了我们想要的结果 有一点要注意:jsp动态元素的结果类型必须与属性的类型相同,否则编译器会报错查看全部
-
使用这种直接写出自变量的属性叫做静态属性,当然也可以将其属性值设置为动态的, 这里再来创建一个JSP,demo4.jsp 这里使用动态赋值的方式来创建属性标签的值, 这里为了显示方便,我直接将连接数据库的代码写在jsp页面中, <body> <% String driver="com.mysql.jdbc.Driver"; String url="jdbc:mysql://localhost:3306/test"; String sql="select * from students"; String username="root"; String password="root"; /*这里使用 pageContext 来将变量值设置到页面中 */ pageContext.setAttribute("driver", driver); pageContext.setAttribute("url",url); pageContext.setAttribute("sql",sql); pageContext.setAttribute("username",username); pageContext.setAttribute("password", password); %> <!--之后使用EL表达式的形式为标签中的属性赋值 --> <imooc:dbConnection password="${password}" url="${url}" driver="${driver }" sql="${sql }" username="${username }"/> </body> 我们再来访问一下demo4.jsp 这里可以看到页面并没有正常运行(返回http状态码是500) 跑出了一个错误: According to TLD or attribute directive in tag file, attribute password does not accept any expressions查看全部
-
下面来新建一个JSP页面demo3.jsp 首先引用该标签库 <%@ taglib prefix="imooc" uri="/imooc-tag" %> 在body中: <body> <imooc:dbConnection password="root" url="jdbc:mysql://localhost:3306/test" driver="com.mysql.jdbc.Driver" sql="select * from students" username="root"/> </body> 然后启动tomcat,访问这个jsp 这样呢,在页面中呢,就可以看到用这种方式将数据库中的数据取了出来, 使用这种直接写出自变量的属性叫做静态属性,当然也可以将其属性值设置为动态的查看全部
-
由于这里要连接数据库,所以在项目中要将mysql的驱动拷入进去, 第二步:在标签类描述文件中注册该标签,并配置属性标签 然后修改一下标签库描述文件imooctag.tld 这里新加入一个tag <tag> <name>dbConnection</name> <tag-class>com.imooc.tag.DBConnectionTag</tag-class> <body-content>empty</body-content> <attribute> <name>driver</name> <required>true</required> </attribute> <attribute> <name>url</name> <required>true</required> </attribute> <attribute> <name>username</name> <required>true</required> </attribute> <attribute> <name>password</name> <required>true</required> </attribute> <attribute> <name>sql</name> <required>true</required> </attribute> </tag> 其中: <attribute> <name>driver</name> <required>true</required> </attribute> 的name的值是标签处理类中的成员变量driver required意思是这个属性是必须的,要设置为true 然后其他的属性的设置方法都和它相似。 这样我们的标签就注册成功了查看全部
举报
0/150
提交
取消