如何在JavaWeb程序js中使用自定义标签签

1205人阅读
javaweb(12)

前几天博客被黑了,导致博客登陆不上,把前几天应该发的东西的东西重新发一遍
今天来讲javaweb的第六阶段学习。
EL表达式与JSTL及自定义标签是对上篇文章介绍的JSP的扩展,不能说是很重要的东西,但是也要了解。
老规矩,首先先用一张思维导图来展现今天的博客内容。
ps:我的思维是用的xMind画的,如果你对我的思维导图感兴趣并且想看到你们跟详细的备注信息,
另外:如果图看不清的话请右击---在新窗口中打开会清楚很多。
一、EL表达式
&&&&1,EL简介
&&&&&&&&Expression Language。它不是一种语言,只是一个表达式。
&&&& 用于将数据显示到JSP上。它的出现是替代java表达式的,从jsp2.0开始。
&&&& 特点就是简单易用:
&&&&&&&&&&&&java表达式
&&&&&&&&&&&&&&&&&%List&Book& list = new ArrayList();%&
&&&&&&&&&&&&&&&&&%=list.get(0).getBookName() %&
&&&&&&&&&&&&EL表达式:
&&&&&&&&&&&&&&&&${list[0].bookname}E
&&&&2,EL表达式基本语法
&&&&&&&&&&&&${表达式}
&&&&&&&&&&&&注意:EL表达式是从四大域对象中获取数据(application,session,request,pagecontext);
&&&&&&&&&&&&细节:EL表达式中没有空指针异常,没有数组下标越界,没有字符串拼接。
&&&&3,EL表达式的数据获取
&&&&3.1获取数据
&&&&&&&&&&&&
&&&&3.2 EL运算符
3.21empty运算符:
&&&&判断一个字符串是否为&&或其他对象是否为null,同时还能判断集合中是否有元素。
&&&&&&&&&&&&&&&&
3.22三元运算符:
&&&&&&&&&&&&
4 EL中的隐式对象(共11个)
EL中的隐式对象
对应JSP隐式对象
PageContext
Javax.serlvet.jsp.PageContext
PageContext
ApplicationScope
Java.util.Map
应用层范围
SessionScope
Java.util.Map
RequestScope
Java.util.Map
Java.util.Map
页面层范围
Java.util.Map
请求消息头key,值是value(一个)
HeaderValues
Java.util.Map
请求消息头key,值是数组(一个头多个值)
Java.util.Map
请求参数key,值是value(一个)
ParamValues
Java.util.Map
请求参数key,值是数组(一个名称多个值)
Java.util.Map
全局参数,key是参数名称,value是参数值
Java.util.Map
Key是cookie的名称,value是cookie对象
5 EL表达式定义和使用函数
&&&&&&&&EL不支持字符串操作。
&&&&&&&&定义和使用函数的四步:
a.写一个普通的java类
(注意,普通Java类实现功能的方法必须是静态的,因为EL只能调用静态的方法)
&&&&&&&&&&&&&&&&
b.在WEB-INF下创建一个xml,文件的扩展名为.tld
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&c.在jsp中使用taglib指令引入
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&d.在jsp中使用
&&&&&&&&&&&&&&&&
&&&&1 JSTL简介
&&&&&&&&JSP Standard Tag Libary:JSP中标准的标签库。
&&&&&&&&该标签库是由Apache实现的。
&&&&&&&&导入jar包:JavaEE的jar包中包含。
&&&&2 JSTL的组成
&&&&&&&&Core:核心标签库。通用逻辑处理
&&&&&&&&Fmt:国际化有关。
&&&&&&&&Functions:EL函数
&&&&&&&&SQL:操作数据库。不用
&&&&&&&&XML:操作XML。不用
&&&&3 JSTL的Core
&&&&&&&&&&&&分类
表达式操作
&&&&&&&&&&&&&&&&详情请参考【CORE核心标签.doc】
&&&&4 JSTL的Functions介绍
&&&&&&&&使用taglib指令导入:详情请看【第18章JSTL Functions标签库.doc】
&&&&fn:contains函数:用于判断在源字符串中是否包含目标字符串。
&&&&fn:containsIgnoreCase函数:用于判断在源字符串中是否包含目标字符串,并且在判断时忽略大小写。
&&&&fn:startsWith函数:用于判断源字符串是否以指定的目标字符串开头。
&&&&fn:endsWith函数:用于判断源字符串是否以指定的目标字符串结尾。
&&&&fn:indexOf函数:用于在源字符串中查找目标字符串,并返回源字符串中最先与目标字符串匹配的第一个字符的索引。
&&&&fn:replace函数:用于把源字符串中的一部分替换为另外的字符串,并返回替换后的字符串。
&&&&fn:substring函数:用于获取源字符串中的特定子字符串。
&&&&fn:substringBefore函数:用于获取源字符串中指定子字符串之前的子字符串。
&&&&fn:substringAfter函数:用于获取源字符串中指定子字符串之后的子字符串
&&&&fn:split函数:用于将源字符串拆分为一个字符串数组。
&&&&fn:join函数:用于将源字符串数组中的所有字符串连接为一个字符串。
&&&&fn:toLowerCase函数:用于将源字符串中的所有字符改为小写。
&&&&fn:toUpperCase函数:用于将源字符串中的所有字符改为大写。
&&&&fn:trim函数:用于将源字符串中的开头和末尾的空格删除。
&&&&fn:escapeXml函数:用于将源字符串中的字符&&&、&&&、&&&和&&&等转换为转义字符。
&&&&fn:length函数:用于返回字符串中的字符的个数,或者集合和数组的元素的个数
三、自定义标签
&&&&1自定义标签的作用
&&&&&&&&&&&&自定义Jsp中的程序处理,替换掉JSP中的Java脚本。
&&&&2自定义标签的编写步骤
&&&&&&&&&&&&实现标签自定义需要实现javax.servlet.jsp.tagext.SimpleTag或者继承javax.servlet.jsp.tagext.SimpleTagSupport
&&&&&&&&&&&&javax.servlet.jsp.tagext.SimpleTag中的方法:
&&&&&&&&&&&&void doTag():遇到自定义标签时由服务器调用执行。
&&&&&&&&&&&&JspTag getParent():得到父标签的引用。
&&&&&&&&&&&&void setJspBody(JspFragment jsp):由服务器调用,传入JSP的片段
&&&&&&&&&&&&void setJspContext(JspContext jc):由服务器调用,传入当前页面的PageContext
&&&&&&&&&&&&void setParent(JspTag parent):由服务器调用,传入他的父标签
&&&&&&&&&&&&&&&&第一步:写一个类继承SimpleTagSupport
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&第二步:创建一个.tld的xml文件在里面配置tag的信息。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&第三步:在jsp中引入自定义标签
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&3自定义标签的作用4个
&&&&&&&&a、控制主体内容是否显示。
&&&&&&&&&&&&&&&&
&&&&&&&&b、控制结束标签后的JSP内容不执行。
&&&&&&&&&&&&&&&&
&&&&&&&&c、控制主体内容重复执行。
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&
&&&&&&&&d、改变主体内容后再输出。
&&&&&&&&&&&&
&&&&&&&&&&&&
&&&&4自定义标签配置的body-cotent说明
&&&&&&&&&&&&&body-content&取值:
&&&&&&&&&&&&JSP:jsp中能出现啥,标签主体内容就能出现啥。给传统标签用的。简单标签一用就报错。
&&&&&&&&&&&&empty:没有主体内容。简单和传统标签都能用。
&&&&&&&&&&&&scriptless:给简单标签用的,说明主体内容是非脚本。
&&&&&&&&&&&&&&&&tagdependent:把主体内容的EL表达式当做普通字符串对待。
&&&&5自定义标签的案例
&&&&&&&&a.模拟for
&&&&&&&&&&&&
&&&&&&&&&&&&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:125569次
积分:2974
积分:2974
排名:第11976名
原创:114篇
转载:11篇
评论:452条
(1)(2)(1)(3)(2)(2)(1)(1)(1)(2)(1)(2)(1)(5)(3)(1)(1)(2)(2)(7)(24)(6)(7)(1)(8)(3)(2)(5)(3)(4)(5)(4)(2)(3)(3)(1)(2)(1)当的内置标签和标签库内的标签都满足不了需求,这时候就需要开发者自定义标签。
自定义标签
下面我们先来开发一个自定义标签,然后再说它的原理吧!
自定义标签的开发步骤
编写一个普通的类,继承类
package com.vmaxtam.
import javax.servlet.jsp.tagext.TagS
public class MyTagTest extends TagSupport {
重写父类的方法,用于得到当前页面的对象。
public class MyTagTest extends TagSupport {
private PageContext pageC
public void setPageContext(PageContext pageContext) {
this.pageContext=pageC
重写父类的方法,里面写上你定义的标签的操作,这里我定义的标签用作向浏览器输出一大段信息:
public int doStartTag() throws JspException {
pageContext.getResponse().getWriter().write("这是我写的一大段信息:ABCDEFGHIJKLMNOPQRSTUVWXYZ");
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
return super.doStartTag();
这样就完成一个标签处理程序了别着急,写完程序我们还需要注册它。
在你的应用目录下,找到文件夹,在里面新建一个类型的文件
然后再里面注册你的标签吧:
&?xml version="1.0" encoding="ISO-8859-1" ?&
&!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"/dtd/web-jsptaglibrary_1_2.dtd"&
&tlib-version&1.0&/tlib-version&&!-- 代表标签库的版本号 --&
&jsp-version&1.2&/jsp-version&&!-- 代表jsp的版本 --&
&short-name&mtt&/short-name&&!-- 你的标签库的简称 --&
&uri&/mytag&/uri&&!-- 你标签库的引用uri --&
&name&mytah&/name&&!-- 你定义的标签的名称 --&
&tag-class&com.vmaxtam.dotest.MyTagTest&/tag-class&&!-- 对应的标签处理程序:包名+类名 --&
&body-content&JSP&/body-content&&!-- 标签体内容的格式 --&
如果你忘记了怎么写,可以参考里的文件
你要在使用你定义的标签的页面导入你的标签库就像导入类包一样
只需在页面写上下面内容:
&%@taglib uri="/mytag" prefix="mmt" %&
以上步已经把准备工作都做好了下面我们来使用标签吧!
&title&My JSP 'testit.jsp' starting page&/title&
&mmt:mytag&&/mmt:mytag&
浏览器效果如下:
这样,我们就完成了一次自定义标签了,虽然我们知道步骤,但是不知道为什么这样就行,所以,下面来说一下它的原理:
自定义标签的原理
1)当服务器打开时,就会加载下的资源文件,包括和&tld文件,把它们加载到内存
2)我们在浏览器输入来访问页面
3)服务器读取里的内容,当读到
&%@taglib&uri="/mytag"&prefix="mmt"&%&&
这一句的时候,就会在内存中找是否存在为的文件,找不到就会报错
4)继续读取页面,读到这个标签的时候,就会通过去找到文件,在文件中找到是否被定义,是的话就得到它的的内容,然后去找到它对应的标签处理程序
5)实例化标签处理程序,利用生成的对象调用它里面的方法
这里服务器对标签处理程序里的方法也有一定的调用顺序 &&&&&A)void&setPageContext(PageContext&pc)&&--传入对象
B)void&setParent(Tag&t)&&&&&&&&&&&&&&--如果有父标签,传入父标签对象,如果没有,则传入
C)int&doStartTag()&&&&&&&&&&&&&&&&&--开始执行标签时调用。
D)int&doEndTag()&&&&&&&&&&&&&&&&--结束标签时调用
E)void&release()&&&&&&&&&&&&&&&&&&--释放资源
如果你没有重写上面的方法,系统将会调用它的父类里的方法
为什么会是这个顺序调用,是有证据的,下面我们来看看被翻译为源文件里的截取:
private boolean _jspx_meth_itcast_005fshowIp_005f0(PageContext _jspx_page_context)
throws Throwable {
PageContext pageContext = _jspx_page_
JspWriter out = _jspx_page_context.getOut();
itcast:showIp
1) 实例化ShowIpTag对象
gz.itcast.tag.ShowIpTag _jspx_th_itcast_005fshowIp_005f0 = (gz.itcast.tag.ShowIpTag) _005fjspx_005ftagPool_005fitcast_005fshowIp_005fnobody.get(gz.itcast.tag.ShowIpTag.class);
2)调用setPageContext方法
_jspx_th_itcast_005fshowIp_005f0.setPageContext(_jspx_page_context);
3)调用setParent方法
_jspx_th_itcast_005fshowIp_005f0.setParent(null);
4)调用doStartTag方法
int _jspx_eval_itcast_005fshowIp_005f0 = _jspx_th_itcast_005fshowIp_005f0.doStartTag();
5)调用doEndTag方法
if (_jspx_th_itcast_005fshowIp_005f0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE) {
_005fjspx_005ftagPool_005fitcast_005fshowIp_005fnobody.reuse(_jspx_th_itcast_005fshowIp_005f0);
return true;
_005fjspx_005ftagPool_005fitcast_005fshowIp_005fnobody.reuse(_jspx_th_itcast_005fshowIp_005f0);
return false;
控制标签体内容&与&结束标签后的内容
自定义标签可以可控制标签体内的文本&和&结束标签后的文本是否输出
@Override//遇到开始标签时执行的方法
public int doStartTag() throws JspException {
//return Tag.SKIP_BODY; //标签体内容不向浏览器输出
return Tag.EVAL_BODY_INCLUDE;//标签体内容向浏览器输出
@Override//遇到结束标签后执行的方法
public int doEndTag() throws JspException {
//return Tag.EVAL_PAGE;//结束标签后的内容输出到浏览器
return Tag.SKIP_PAGE;//结束标签后的内容不输出到浏览器
那么如何重复输出标签体内的文本内容呢?还提供了一个方法,我们只需要这样做:
int i = 4;
@Override//每输出一次标签体的内容都会调用一次这个方法
public int doAfterBody() throws JspException {
while(true)
return IterationTag.EVAL_BODY_AGAIN;//再执行一次便签体内的内容
return Tag.SKIP_BODY;//不输出标签体的内容
以上的内容都是控制标签体的内容输出的问题,那么能不能改变标签体力的内容呢?
很可惜,用是不行,但是我们可以用它的子类那么久写一个类继承类吧
public class MyTagTest extends BodyTagSupport {
private PageContext pageC
public void setPageContext(PageContext pageContext) {
this.pageContext = pageC
public int doStartTag() throws JspException {
//返回BodyTag.EVAL_BODY_BUFFERED,表示输出标签体内容
//返回Tag.SKIP_BODY,表示不输出内容
return BodyTag.EVAL_BODY_BUFFERED;
//return Tag.SKIP_BODY;
public int doEndTag() throws JspException {
//得到BodyContent对象,它包装了标签体里的内容
BodyContent bodyContent = this.getBodyContent();
//利用getString方法得到字符串
String content = bodyContent.getString();
//改变字符串内容,将小写改为大写
String change = content.toUpperCase();
//输出到浏览器
this.pageContext.getResponse().getWriter().write(change);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return Tag.SKIP_PAGE;
以上就是自定义标签的创建步骤会原理,还有一些标签体内容的处理方法,大家觉得容易吗?
对,十分的不容易啊,用这种方法定义的标签我们称为传统标签,所以这是一个社会问题,是时候就会有人站出来,写出一组代码来解决这个问题了,这组代码称为:简单标签
为什么要学习传统标签
学习传统标签是为了以后维护到一些旧系统!!
简单标签比传统标签简单在标签处理器类的编写简单了!!!
简单便签的开发步骤
同样的,我们先学习简单标签的开发步骤,然后再说说它的原理
编写标签处理器类,也就是一个普通的类,继承类。然后重写它的方法:
public class MySimpleTag extends SimpleTagSupport {
@Override//当遇到标签时就会执行这个方法
public void doTag() throws JspException, IOException {
System.out.println("执行了简单标签里的doTag()方法~");
在文件内注册这个标签吧这个过程和传统标签一样
&name&simpletag&/name&
&tag-class&com.vmaxtam.dotest.MySimpleTag&/tag-class&
&body-content&scriptless&/body-content&&!--这里要用这个处理--&
在文件中导入标签库这个过程和传统标签一样)
使用该标签这个过程和传统标签一样)
以上就是简单标签的定义过程了,和传统标签相比,他简单就简单在不用重写很多方法。
简单标签的原理
一)和传统标签一样,得到tag-class字符串,找到标签处理程序类
二)实例化标签处理程序类
三)利用对象调用方法。。。。
和传统标签相比,简单标签调用的方法不相同:
SimpleTag接口的方法执行过程:
&1)&void&setJspContext(JspContext&pc)&&--设置对象,传入对象。是的父类。在标签处理器类中通过this.getJspContext()方法得到对象。
&2)void&setParent(JspTag&parent)&&&&&& &--传入父标签对象,如果没有父标签,则不调用次方法。通过方法得到父标签对象
&3)void&setJspBody(JspFragment&jspBody)&&&--传入标签体内容。标签体内容封装到方法中。通过方法得到标签体内容。如果没签体,不调用次方法。
&4)void&doTag()&&&&&&&&&&&&&&&&&&&&& &--开始标签和结束标签都执行次方法。
为什么是这样调用方法呢,也是有证据的:
private boolean _jspx_meth_itcast_005fsimpleDemo_005f0(PageContext _jspx_page_context)
throws Throwable {
PageContext pageContext = _jspx_page_
JspWriter out = _jspx_page_context.getOut();
itcast:simpleDemo
1)实例化SimpleDemo对象
gz.itcast.b_simple.SimpleDemo _jspx_th_itcast_005fsimpleDemo_005f0 = new gz.itcast.b_simple.SimpleDemo();
org.apache.jasper.runtime.AnnotationHelper.postConstruct(_jsp_annotationprocessor, _jspx_th_itcast_005fsimpleDemo_005f0);
2)调用setJspContext方法,传入PageContext对象
_jspx_th_itcast_005fsimpleDemo_005f0.setJspContext(_jspx_page_context);
3)调用setParent方法,如果没有父标签,不执行。
4)调用setJspBody方法,传入标签体内容
_jspx_th_itcast_005fsimpleDemo_005f0.setJspBody(new Helper( 0, _jspx_page_context, _jspx_th_itcast_005fsimpleDemo_005f0, null));
5)调用doTag方法,执行标签
_jspx_th_itcast_005fsimpleDemo_005f0.doTag();
org.apache.jasper.runtime.AnnotationHelper.preDestroy(_jsp_annotationprocessor, _jspx_th_itcast_005fsimpleDemo_005f0);
return false;
控制标签体文本&与&结束标签后内容&是否输出
我们可以通过对象来控制的
标签体内容:
要输出:&在方法中执行方法
不输出:&什么都不做!!
结束标签后的内容:
要输出:什么都不做!
不输出:在方法中抛出一个异常~!
public void doTag() throws JspException, IOException {
JspFragment jspBody = this.getJspBody();
jspBody.invoke(null);
throw new SkipPageException();
那么如何循环输出标签体内容呢,在简单标签中实现十分简单,在方法中写上
for(int i=1;i&=5;i++){
jspBody.invoke(null);//默认写出都浏览器
改变标签体里的内容
在方法中写上:
//4.1 创建一个临时的Writer输出流(容器)
StringWriter writer = new StringWriter();
//4.2 把标签体内容拷贝到临时的Writer流中
JspFragment jspBody = this.getJspBody();
jspBody.invoke(writer);
//4.3 从临时的Writer流中取出标签体内容
String content = writer.toString();
//4.4 改变标签体内容
content = content.toUpperCase();
//4.5 把改变后的内容写出到浏览器中
//jspBody.invoke(null);如果这样写,那么还是输出原来的内容
this.getJspContext().getOut().write(content);
标签体内容的输出格式
除了能设置标签体内容是否输出,还能够设置它的输出格式,那么它有什么样的输出格式呢?
可以有以下输出格式:
JSP:&表示输出的标签体内容可以包含脚本,且可以执行此脚本。此值只能用在传统标签中。
scriptless:&表示输出的标签体内容不能包含脚本,如果包含则报错。&&
empty:表示没有标签体内容。即是空标签。如果不是空标签,则报错。
tagdependent:&表示输出的标签体内容可以包含脚本。但不执行脚本(直接原样输出)
那么我们要在文件内设置文本的输出格式:
&name&tagDemo&/name&
&tag-class&gz.itcast.a_tag.TagDemo1&/tag-class&
&body-content&JSP&/body-content&&!--在这里设置--&
上面都是在讨论标签体内容的输出,标签里还可以设置属性的,那么自定义标签如何定义标签的属性呢?
自定义标签的属性
这个过程我们在简单标签内实现,以下是操作步骤
在标签处理器类内声明一个成员变量,,这个成员变量就用来接受标签属性的值,然后再标签处理器类内为这个成员变量生成一个方法:
public class MySimpleTag extends SimpleTagSupport {
public void setNum(Integer num) {
this.num =
要到文件注册这个属性,属性药注册在响应标签的标签内
&name&simpletag&/name&
&tag-class&com.vmaxtam.dotest.MySimpleTag&/tag-class&
&body-content&scriptless&/body-content&
&attribute&
&name&num&/name& &!-- ??? --&
&required&true&/required&&!-- ???????????????? --&
&rtexprvalue&true&/rtexprvalue&&!-- ???????EL??? --&
&/attribute&
这样就可以去使用属性了
&mmt:simpletag num="1001"&我是标签里的内容&/mmt:simpletag&我是标签后的内容
上面的内容就可以创建一个基本功能的自定义标签了
阅读(...) 评论()}

我要回帖

更多关于 js中使用自定义标签 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信