使用传统和简单模式开发标签,简单标签开发案例,使用JSTLJSTLJSTLJSTL核心标签库作者:吕鹏时间:2011-08-092011-08-092011-08-092011-08-09一、传统标签开发模式1111、使用实现了tagtagtagtag接口的类---六个方法(执行流程)setPageContext传递页面pageContext对象(这个对象可以获取其它八大隐含对象)setParent设置父标签,没有父标签传nullgetParentdoStartTag遇到开始标签执行这个方法doEndTag遇到结束标签执行这个方法release释放资源---继承子类TagSupport只重写自己感兴趣的方法2222、执行流程IE请求jsp页面到服务器,转换为Servlet后,由Servlet执行,遇到标签以后,创建标签对应的标签处理器实例对象,调用标签的setPageContext方法,把页面的pageContext对象传递给标签处理器,然后再调用setParent方法,把父标签传递给标签处理器,如果没有父标签,传null,遇到开始标签,调用doStartTag方法,一般情况下还会执行标签体,遇到结束标签调用doEndTag,最后一般情况下调用realease方法释放资源。3333、使用步骤自定义一个类,使其继承TagSupport方法,重写doStartTag方法,方法体中获取request对象和out对象,写相关方法;在WEB-INF目录下建立一个.tld的文件,写以下内容:?xmlversion=1.0encoding=UTF-8?taglibxmlns=:xsi=:schemaLocation=://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsdversion=2.0descriptionAtaglibraryexercisingSimpleTaghandlers./descriptiontlib-version1.0/tlib-versionshort-nameSimpleTagLibrary/short-name!--资源名称--uri/itcast-tags/uritagnameviewIP/nametag-classcn.itcast.web.tag.ViewIpTag/tag-classbody-contentempty/body-content/tagtag!--标签的名字--namefor/name!--标签的处理器--tag-classcn.itcast.web.tag.SimpleTagTest/tag-class!--是否有标签体内容--body-contentscriptless/body-contentattribute!--用于指定属性的名称--namecount/name!--是否默认设置这个属性--requiredtrue/required!--是否可以使用运行时表达式--rtexprvaluetrue/rtexprvalue/attribute/tag/taglib在jsp页面中导入资源包:%@taglibprefix=suri=/itcast-tags%4444、自定义标签的作用:1111、将jspjspjspjsp页面中的javajavajavajava代码移除2222、控制页面某一内容是否输出3333、整个jspjspjspjsp是否执行4444、控制页面内容重复输出5555、修改jspjspjspjsp内容输出5555、JspTagJspTagJspTagJspTag接口空实现的标识类型模式serializable和cloneable都是这样的标识类型规范。目的就是给特殊的类以特殊的权限,就比如cloneable,实现它就表示可以被克隆了。二、使用简单标签模式开发1.1.1.1.执行过程首先实例化实现了simpleTag的类实例,首先调用标签处理类对象的setJspContext方法,将代表jsp页面的pageContext对象传递给标签处理器对象,然后调用setParent方法,将父标签处理器对象传递给这个标签处理器对象(只有父标签存在的情况下才会调用这个方法),如果调用标签时间设置了属性,容器将调用每个输赢对应的setter方法把属性值传递给标签处理器对象,如果标签的属性值是EL表达式或者脚本表达式则web容器首先计算表达式的值然后把值传递给标签处理器对象。如果简单标签有标签体容器将调用setJspBody方法把代表标签体的JspFragment对象传递进来。这样就完成了标签的初始化工作。执行标签体调用doTag方法,开发人员在方法体内通过操作jspFragment对象,就可以完成是否执行迭代,修改标签提的目的。2222、invokeinvokeinvokeinvoke方法详解Invoke方法是jspFragment最重要的方法,利用这个方法可以控制是否执行和输出标签提的年日哦那个是否迭代执行标签提的内容或者对执行结果进行修改再输出。3333、开发带属性的标签1、首先在标签处理器中编写每个属性对应的setter方法lv:forcount=5aaabr/lv:for//声明属性变量privateprivateprivateprivateintintintintcount;//提供set方法供服务器调用publicpublicpublicpublicvoidvoidvoidvoidsetCount(intintintintcount){thisthisthisthis.count=count;}2、在TLD文件中描述标签的属性tag!--标签的名字--namefor/name!--标签的处理器--tag-classcn.itcast.web.tag.SimpleTagTest/tag-class!--是否有标签体内容--body-contentscriptless/body-contentattribute!--用于指定属性的名称--namecount/name!--是否默认设置这个属性--requiredtrue/required!--是否可以使用运行时表达式--rtexprvaluetrue/rtexprvalue/attribute/tag4444、使用简单标签做一个简单的例子控制页面内容转换成大写然后输出五次(1)在jsp中引入资源,写标签体内容%@pagelanguage=javaimport=java.util.*pageEncoding=utf-8%%@taglibprefix=lvuri=/itcast-tags%htmlheadtitle简单标签/title/headbodylv:forcount=5aaabr/lv:for/body/html(2)定义标签处理器packagepackagepackagepackagecn.itcast.web.tag;importimportimportimportjava.io.StringWriter;importimportimportimportjavax.servlet.jsp.tagext.JspFragment;importimportimportimportjavax.servlet.jsp.tagext.SimpleTagSupport;publicpublicpublicpublicclassclassclassclassSimpleTagTestextendsextendsextendsextendsSimpleTagSupport{//声明属性变量privateprivateprivateprivateintintintintcount;//提供set方法供服务器调用publicpublicpublicpublicvoidvoidvoidvoidsetCount(intintintintcount){thisthisthisthis.count=count;}/***覆盖doTag方法,逻辑内容在方法体内完成*/@OverridepublicpublicpublicpublicvoidvoidvoidvoiddoTag(){//首先获取jsp的标签体内容JspFragmentjf=thisthisthisthis.getJspBody();//初始化一个String的带缓冲的写入流StringWritersw=newnewnewnewStringWriter();//执行count次的循环forforforfor(intintintinti=0;icount;i++){trytrytrytry{//将标签体中的内容读入到这个缓冲流当中jf.invoke(sw);//取出这个缓冲流的内容赋值给StringBufferStringBuffersb=sw.getBuffer();//将值赋值给ContentStringcontent=sb.toString();//获取out流,打印被转换为大写的内容count次thisthisthisthis.getJspContext().getOut().write(content.toUpperCase());}catchcatchcatchcatch(Exceptione){throwthrowthrowthrownewnewnewnewRuntimeException(e);}}}}(3)在tld文件中注册tag!--标签的名字--namefor/name!--标签的处理器--tag-classcn.itcast.web.tag.SimpleTagTest/tag-class!--是否有标签体内容--body-contentscriptless/body-contentattribute!--用于指定属性的名称--namecount/name!--是否默认设置这个属性--requiredtrue/required!--是否可以使用运行时表达式--rtexprvaluetrue/rtexprvalue/attribute/tag三、简单标签开发案例1111、开发防盗链标签所谓防盗链就是指如何防止自己的网站非别的网站非法链接,比如说想自己的网站不能别的超链接连接,当有外部连接连接到我的网站的时候,首先判断其来源是不是自己的内部站点,如果是就可以继续浏览网页,如果不是就转到我的主页,这个判断一句可以使用http头信息的referer来判断,具体方法使用request.getHeader(referer),具体怎么实现呢,我们使用我们的防盗锁标签。(1)我们想我们的这个标签一定要有两个参数,一个是site指我们的web应用,用以判断客户的地址来源是否来源于我们的应用地址,第二个就是重定向的地址page。所以我们的标签可以这么写:%@pagelanguage=javaimport=java.util.*pageEncoding=utf-8%%@%@%@%@taglibtaglibtaglibtaglibprefix=prefix=prefix=prefix=ssssuri=uri=uri=uri=/lv-tags/lv-tags/lv-tags/lv-tags