JavaEE自定义标签(DOC)
JavaEE自定义标签:标签类的创建、tld配置文件的创建(位置、如何创建)、Web-XML配置、JSP应用
1、标签
以类似于html标签的方式实现的java代码的封装。
第一:形成了开发标签的技术标准---自定义标签的技术标准。
第二:java标准标签库(sun之前自己开发的一系列的标签的集合)jstl,以及表达式语言E L。
2、自定义标签
(1)理解:
可以允许用户自己根据自己的需要,去开发自己的标签的技术规范。
通俗:在Jsp页面上,以简单的标签封装java代码的操作。
//在自定义标签类中,先调用setPageContext()实例化内置对象:
//然后是doStartTag()方法,核心代码放在这个方法里面:
//定义变量,变量的Get、Set方法: private String UserName = "";
//tld配置文件放置在WEB-INF目录下,主要的标记如下,主要的配置如下:
//前面tlib-version版本号、Jsp-version JSP的版本号、short-name 命名空间、是必须有的
//uri,注意是uri而不是url,url是访问的路径。
//而uri为访问时候的别名,写在JSP页面上的标签的别名。
//name为此标签类的别名,tag-class 为标签类的存放的物理路径
//body-content 为是否有标签体,如果是/子关闭标签设置为EMPTY
//如果涉及到标签属性,可以设置attribute,其中name为属性的名称,而不是别名,required 属性是否必须设置,rtexprvalue 是否程序运行时候为属性赋值。
//如果在tld文件中不设置uri,则在web-xml中必须对talib-uri进行设置。
//在JSP页面中,用taglib指令导入自定义标签。
//JSP页面上的使用,前面my为tld文件中为标签类定义的命名空间、hello为tld文件中指定标签类的别名:
(2)技术组成
A:标签处理类:实现所有信息显示功能的Java类
B:标签配置文件(标签描述文件、库文件):是一个遵守xml规范的tld文件(扩展名为TLD)
C:配置web.xml:告诉web应用,需要引用其他的标签信息
D:jsp页面上,调用标签
3、标签的特点
(1)分类
A:成对出现的标签
B:自关闭的标签
(2)特点
A:标签必须正确的关闭
B:标签不能出现重名
C:标签可以有标签体也可以没有
D:标签可以有属性,但是一个标签不能出现同名属性最简单的标签:没有标签体也没有属性的标签
4、自定义标签的开发流程(上面的插图)
A:明确要实现的功能:要在页面显示具体什么内容B:开发标签处理类
C:创建以及配置标签描述文件:TLD文件
D:配置web.xml
E:jsp页面调用标签
5、开发标签处理类
(1)父类
一个接口两个类
接口:Tag接口javax.servlet.jsp.tagext.Tag
类:
自关闭:TagSupport
成对出现:BodyTagSupport
(2)开发标签类
集成自指定的类,重写setPageContext(),doStartTag(),doEndTag()。
重点:标签开始操作doStartTag()方法★
6、创建标签配置文件(TLD文件)
(1)作用
是用来统一管理多个标签处理类的xml文件。
(2)创建
具有自己的格式和规范的(和XML文件一样)
推荐在WEN-INF目录下,创建自己的tld文件。
(3)文件格式
A:根元素:taglib
B:taglib的四个起始子元素
<tlib-version>标签库的技术标准的版本1.0</tlib-version>
<jsp-version>支持的jsp的技术标准版本1.2</jsp-version>
<short-name>标签库文件的命名空间:缩写</short-name>
<uri>当前标签库文件的唯一标记的符号(别名)</uri>
命名空间:用来区分当前标签是属于哪个标签库的名称简写。
<jsp:useBean>
说明:uri子元素是可有可无的,但是会对后期的调用产生影响。
C:tag子元素
每个标签处理类都必须在tld文件中进行配置。
每个标签类都对应一个tag元素,描述自己的配置信息。
<tag>
<name>标签处理类的别名</name>
<tag-class>标签类的物理地址</tag-class>
<body-content>是否有标签体</body-content>
</tag>
body-content:值默认的是jsp。
如果是自关闭标签,需要制定成empty。
如果标签有属性,还有attribute子元素。
7、配置web.xml
(1)作用
在web.xml中进行标签配置文件的设置,告诉web应用程序,需要调用的自定义标签在哪里。
(2)前提
在标签配置文件中,如果没有进行<uri>的配置,则必须进行web.xml的配置。
如果已经配置了uri元素的值,就不需要进行web.xml的配置,可以直接在jsp上调用。
uri表现在JSP 页面引入标签时候,需为taglib指令指定uri,注意和TLD文件中的标签类的别名name
区分,那个是在JSP页面中调用标签时候命名空间后面写入。
(3)配置(如上图在WEB.XML中的配置)
所有的标签配置文件的配置,都必须在<jsp-config>元素中。
每个配置文件有自己<taglib>元素。
<taglib>
<taglib-location>标签配置文件的物理地址</taglib-location>
<taglib-uri>标签配置文件的调用别名</taglib-uri>
</taglib>
8、jsp调用标签
(1)引入标签库
利用taglib指令实现引入
<%@ taglib uri="标签库的别名" prefix="标签库的前缀(命名空间)"%>
uri:如果tld文件中已经配置了uri,必须与tld的uri一致。
如果tld中没有配置,必须与web.xml中的taglib-uri一致。
prefix:前缀,如果在tld文件中设置了short-name,则必须与short-name保持一致。
(2)调用标签
<前缀:标签类的别名>
(3)标签处理类的生命周期
A:加载
根据标签类的别名,定位标签处理类,加载到容器上
B:实例化
根据默认无参构造函数,进行实例化
C:设置上下文
设置页面上下文,获得内置对象
D:设置父标签
E:执行标签开始的操作
F:执行标签结束的操作
G:资源释放
9、jsp和标签处理类的信息交互方式
两种:
A:借助session属性,由jsp向标签处理类传递值
B:借助于标签的属性,实现传值。
10、属性
(1)理解
用来附加说明标签基本信息的名称与值的集合。
(2)分类
必须有的属性
可有可无的属性
(3)特点
A:是名称与值的集合
B:如果有属性,属性必有值
C:属性的值必须用引括起来
D:一个标签不允许有同名属性
(4)设置
A:在标签处理类中,创建代表属性的变量以及对应的set/get方法(见上图)。
在标签处理类中,属性是以变量的方式存在的。
B:在标签开始动作中,直接使用变量
C:在标签配置文件上,在相应的tag中,添加属性配置。
每个属性都有自己的<attribute>标签
<attribute>
<name>属性的名称(与类中变量同名)</name>
<required>属性是否是必须的(true/false)</required>
<rtexprvalue>属性的值是否通过运行时加以赋值(程序动态赋值)</rtexprvalue> </attribute>
D:jsp页面上的标签中,使用属性
注意:属性名必须与类中的变量同名。
J2EE JSP自定义标签技术及应用实例
库描述文件(*.tld)和web.xml等的配置上; JSP标签实现的功能相对比较单一,同时不及 JavaBean编程方便。
(4)标签库的应用场合
对由“美工和程序员”所构成的开发团队,在表示层中则 更多地采用标签技术
5、对标签的处理过程说明
6、定制标签的编程实现步骤
(1)设计标签所对应的功能处理的JavaBean类
它是标签库用来执行所分配任务的基础代码模块
(2)编写标签库所需要的描述符(TLD)文件
这是一种XML文件,TLD文件描述和说明了标签的属性、
信息和标签处理器的Java类文件位置等信息。 JSP 容器使用这一文件来映射被调用标签库的位置和用 法。
(2)编写标签库描述符TLD文件(Tag Library Descriptor,文件扩展名为*.tld) (3)修改WEB-INF目录下的web.xml文件以定位标签的 *.tld文件(对JSP2.0技术可以不需要它) (4)在JSP页面中使用以上自定义的标记
9、标签的内部转换机制
(1)应用服务器容器首先调用JSP引擎把JSP页面翻译成对应的 Servlet,然后再编译该Servlet。 (2)与标记库相关联的方法都被包含在该Servlet中并一起编译, 合成在一起
BodyTagSupport类并重写doStartTag方法
一个标签能接受输入参数,只需要在该标签所对应的 Java类程序
中增加setXXX()方法即可,其中xxx为该标签的属性名称
修改*.tld文件 编写标签库描述符TLD文件并在tag之间加入 <attribute>标签
12、成对的标签并且不需要处理标签对间的信息 <userTag:JSPTagTest >这是成对的标签正文内容 </userTag:JSPTagTest> 设计要点
JAVA操作WORD可操作书签
Element node = (Element)
oldBookStart.getNextSibling();// 获取兄弟节点w:r
// 如果书签处无文字,则在书签处添加需要替换的内
容,如果书签处存在描述文字,则替换内容,用w:r NodeList wtList =
TransformerException, TransformerConfigurationException {
// 使用java.util打开文件
File file=new File("D:test.docx"); boolean exist=file.exists(); boolean read=file.canRead(); boolean write=file.canWrite(); System.out.println(exist); System.out.println(read); System.out.println(write); ZipFile docxFile = new ZipFile(file);
现在新建一个 word,在请输入用户名处添加书签 userName,请输入年龄处添加书签 age
Word2007 版本其实就是 zip 格式,将新建 word 后缀名改.zip,解压会发现,里面全是文 件夹,打开 word 文件夹会有一个 document.xml 文件,在 word 所有内容,都在这 xml 文件中,
node.getElementsByTagName("w:t");// 获取w:r标签下的显示书签处
内容标签w:t
if (wtList.getLength() == 0) { // 如果不存
Java自定义标签用法实例分析
Java⾃定义标签⽤法实例分析本⽂实例讲述了Java⾃定义标签⽤法。
分享给⼤家供⼤家参考,具体如下:简单例⼦实现⼀个标签分为两步:(1)继承SimpleTagSupport或TagSupport实现⼀个控制器(2)创建⼀个描述标签的tld⽂件。
下⾯是⼀个简单例⼦:(1)实现⼀个标签控制器,向页⾯输出“hello”:public class Test extends SimpleTagSupport{public void doTag() throws IOException{JspWriter out = getJspContext().getOut();out.write("hello");}}(2)在WEB-INF⽂件夹下创建⼀个custom.tld⽂件:<?xml version="1.0" encoding="UTF-8"?><taglib version="2.0" xmlns="/xml/ns/j2ee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"><tlib-version>1.0</tlib-version><jsp-version>2.0</jsp-version><short-name>my</short-name><!-- 直接显⽰hello --><tag><name>Hello</name><tag-class>com.huanle.utils.tags.Test</tag-class><body-content>empty</body-content></tag></taglib>上⾯代码通过<tag>标签描述⼀个⾃定义标签,<body-content>empty</body-content>表⽰这个标签没有标签体,也就是开始标签和结束标签之间没有内容。
Java自定义简单标签实例
Java自定义简单标签实例Java自定义简单标签实例引导语:当jsp的内置标签和jstl标签库内的标签都满足不了需求,这时候就需要开发者自定义标签。
以下是店铺分享给大家的Java自定义简单标签实例,欢迎阅读!下面将以权限的控制为例自定义一个标签:一、标签类型步骤:1.自定义一个类PerssionTag 继承SimpleTagSupport(自定义标签一般都会继承这个类)package .liveuc.privilege.tag;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.Set;import javax.servlet.jsp.JspException;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.tagext.SimpleTagSupport;import .liveuc.privilege.model.Privilege;import .liveuc.privilege.model.Resource;import .liveuc.privilege.model.Role;import er;/**** @说明自定义标签*/public class PerssionTag extends SimpleTagSupport {//自定义标签属性,用于标签传入参数private String uri;//接收标签传入的参数public void setUri(String uri) {this.uri = uri;}@Overridepublic void doTag() throws JspException, IOException {//获取用户登陆后保存的.SessionPageContext page = (PageContext) this.getJspContext(); User user = (User) page.getSession().getAttribute("login"); //如果用户登陆if(user != null) {//用户登陆判断用户权限List list = new ArrayList();//获取用户的角色Set role = user.getRole();for(Role r:role) {//获取角色对应的权限Set privilege = r.getPrivilege();for(Privilege p:privilege) {//获取权限对应的资源Set res = p.getResource();for(Resource re:res) {list.add(re.getUri());}}}for(String ur:list) {//判断用户的权限if(ur.equals(uri)) {this.getJspBody().invoke(null); //有权限输出标签体内容}}}}}2.在WEB-INF下创建tld文件描述标签。
Java自定义标签
27
ACCP V4.0
指令<%@ attribute %>
这个指令只能用于标签文件中。它声明了标签文 这个指令只能用于标签文件中。 只能用于标签文件中 件所支持的属性。 件所支持的属性。 语法 <%@ attribute name="attrName" [description ="description"] [required="true|false"] [fragment="true|fal se" | [type="attrDataType"] [rtexprvalue="true|false"]] %>
23
ACCP V4.0
24
ACCP V4.0
标签文件
标签文件是一个扩展名为.tag的文本文件,必须 存储在Web应用程序的WEB-INF/tags文件夹或其 子文件夹中。可在标签文件中使用所有的JSP元 素,但不能使用page指令 其作用类似于标签处理程序,当JSP页面遇到自 定义标签时,它会转到标签文件执行标签的定义
22
ACCP V4.0
标记处理程序示例
import java.io.*; import javax.servlet.jsp.tagext.*; public class Greeting extends TagSupport { public int doStartTag() { try {pageContext.getOut().print(“<b>Hello!</b>”);} “ ” catch (IOException e) { e.printStackTrace(); } return SKIP_BODY; } public int doEndTag() { try { pageContext.getOut().print(“<br>”); } “ ” catch (IOException e) { e.printStackTrace(); } return EVAL_PAGE; } }
自定义标签的整理(新手教程)
在J2EE项目中,JSP页面常常通过在静态页面模板中嵌入scriptlets来插入动态的内容。
然而,随着复杂程序的增加,JSP页面也变得难于管理。
虽然用这种方法开发小形项目唾手可得,但是scriptlets仍然要面对下面的不利情况:Scriptlet难于阅读和修改。
带有Scriptlets的JSP 页面混合了两种语言,这使得阅读和维护变得很困难。
Scriptlets鼓励了将数据表现和逻辑处理的混合。
JSP 页面主要功能是数据表现而不是逻辑处理。
逻辑处理属于Java类的工作,他们应该由程序员维护并能够重用。
Scriptlets不能够被重用。
当scriptlets被重用时,常常是鼓励拷贝-粘贴来达到重用的效果,这是一种危险的维护方法。
每一次你拷贝-粘贴scriptlets时,将有更多行多余的代码需要维护。
Scriptlets的参数很难进行确定传递. 无论如何,绝大数人简单的拷贝,粘贴、编辑或者类似的增加,使得大部份的多余的代码需要更多的维护。
与其创建充满了scriptlets的巨大的JSP页面,不如考虑使用用户自定义标签。
用户自定义标签允许你创建、在JSP中使用你自己定义的类HTML标签。
每当JSP引擎遇到用户自定义标签时,就会自动查找标签处理类,并自动调用他。
页面中的自定义标签将会被票签处理类的输出所代替。
这就使得JSP页面不用直接在页面写Java代码,就可以指定生成动态的内容的。
用户自定义标签为你的网页设计提供了N种好处:他提高了页面代码的可读性。
页面设计人员而不是程序员,能够使用很比使用Scriptlets更容易的使用标签。
维护代码的程序员也只需个性标签库面不是JSP页面,这样他就不要再冒着破坏页面美观的风险。
在使用标签的每一处,增强或者固定的标签改变了标签了的表现。
标签比Scriptlets更容易确定参数,因为他会被作为一种属性或者在标签体内被传达。
最后,标签比Scriptlets高度的可重用性,因为你可以创建共享的、可重用的自定义标签库。
JavaEE-自定义标签
File动态属性的名 称,当设定时,将会产生一个Map类型的对象来存放属 性的名称和值 • import:同page指令中的import • pageEncoding:同page指令中的pageEncoding • isELIgnored:同page指令中的isELIgnored
Java EE讲义 讲义V1.0 讲义
Java EE讲义 讲义V1.0 讲义
4
标签处理器示例
… … … public class HelloTag extends TagSupport { public int doStartTag() throws JspException { try { pageContext.getOut().println("Hello World"); } catch (IOException e) { e.printStackTrace(); } return SKIP_BODY; } } … … …
Java EE讲义 讲义V1.0 讲义 6
HelloTag的TLD示例
<taglib xmlns="/xml/ns/j2ee" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/xml/ns/j2ee /xml/ns/j2ee/webjsptaglibrary_2_0.xsd" version="2.0"> <description>自定义标签库 <description>自定义标签库</description> 自定义标签库</description> <display-name>Custom Tag</display-name> <tlib-version>1.1</tlib-version> <short-name>c</short-name> <uri>/mytld</uri> <tag> <name>hello</name> <tag-class>demo.javaee.tag.HelloTag</tag-class> <body-content>empty</body-content> </tag> </taglib>
自定义标签使用基本步骤
1、创建自己的.tld 标签文件(直接copy模板里的)empty表示空标签元素<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"version="2.1"><description>JSTL 1.1 core library</description><display-name>JSTL core</display-name><tlib-version>1.1</tlib-version><short-name>Mytaglib</short-name>//一组标签<uri>/jsp/jstl/core</uri><tag><name>helloTag</name>//标签名<tag-class>com.jstl.tag.Hello</tag-class>//标签处理类<body-content>empty</body-content></tag></taglib>2、web.xml 中配置标签(.tld文件可放到web 项目/WEB-INF目录下新建的tlds文件夹里)<jsp-config><taglib><taglib-uri>/hello</taglib-uri><taglib-location>/WEB-INF/tlds/hello.tld</taglib-location> </taglib></jsp-config>3、编写标签处理类,继承TagSupport类4、使用<%@taglib uri="/hello" prefix="h" %><h:helloTag/>。
自定义标签——精选推荐
⾃定义标签2 ⾃定义标签2.1 引⼊需求:向浏览器输出当前客户的IP地址(只能使⽤jsp标签)2.2 第⼀个⾃定义标签开发步骤1)编写⼀个普通的java类,继承SimpleTagSupport类,叫标签处理器类/*** 标签处理器类* @author APPle* 1)继承SimpleTagSupport**/public class ShowIpTag extends SimpleTagSupport{private JspContext context;/*** 传⼊pageContext*/@Overridepublic void setJspContext(JspContext pc) {this.context = pc;}/*** 2)覆盖doTag⽅法*/@Overridepublic void doTag() throws JspException, IOException {//向浏览器输出客户的ip地址PageContext pageContext = (PageContext)context;HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();String ip = request.getRemoteHost();JspWriter out = pageContext.getOut();out.write("使⽤⾃定义标签输出客户的IP地址:"+ip);}}2)在web项⽬的WEB-INF⽬录下建⽴itcast.tld⽂件,这个tld叫标签库的声明⽂件。
(参考核⼼标签库的tld⽂件)<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-jsptaglibrary_2_1.xsd"version="2.1"><!-- 标签库的版本 --><tlib-version>1.1</tlib-version><!-- 标签库前缀 --><short-name>itcast</short-name><!-- tld⽂件的唯⼀标记 --><uri></uri><!-- ⼀个标签的声明 --><tag><!-- 标签名称 --><name>showIp</name><!-- 标签处理器类的全名 --><tag-class>gz.itcast.a_tag.ShowIpTag</tag-class><!-- 输出标签体内容格式 --><body-content>scriptless</body-content></tag></taglib>3)在jsp页⾯的头部导⼊⾃定义标签库<%@taglib uri="" prefix="itcast"%>4)在jsp中使⽤⾃定义标签<itcast:showIp></itcast:showIp>2.3 ⾃定义标签的执⾏过程前提: tomcat服务器启动时,加载到每个web应⽤,加载每个web应⽤的WEB-INF⽬录下的所有⽂件例如。
轻松学Java Web开发之用户自定义标签
release()
由标签处理类引起,来释放状态
BodyTag子接口类又重新定义了两个新方法,如表 6.4所示。
方法名 setBodyContent(BodyContent b) doInitBody() 为体中代码作初始化 为标签体中的内容设置属性 方法描述
6.1.4 标签处理器
在标签处理器中定义了标签处理方法doStartTag()和 doEndTag(),这两个方法分别在标签开始和结束时执 行处理和输出动作。这两个方法都要求分别返回一 个状态码,通知JSP容态码一共有四种,具体 作用如图6.3所示。
6.1.4 标签处理器
Tag接口类中所定义的方法如表6.3所示。
方法名 setPageContext(PageContext pc) setParent(Tag t) getParent() doStartTag() doEndTag() 设置当前页面的上下文 设置这个标签处理类的父类 获得父类 处理这个实例中的开发标签 处理这个实例中的结束标签 方法描述
web.xml文件配置
配置文件,用来描述自定义标签的TLD文件位置信息
标签库声明
使用自定义标签,首先要使用标签库声明命令进行声明
JavaBean、web.xml文件配置比较简单。以下仅对标签库 声明、标签库描述和标签处理器进行简要介绍。
6.1.2 自定义标签声明
我们在第2章中介绍过taglib指令。该指令就是当JSP 页面中引用自定义标签时,用来在页面上对自定义 标签进行声明的。taglib编译指令的作用主要是定义 一个标签库路径及其前缀。taglib指令的语法格式如 图6.2所示。
EVAL_BODY_INCLUDE 当doStartTag()返回时,指明servlet应对标签体进行评估 SKIP_BODY EVAL_PAGE SKIP_PAGE 当doStartTag()返回时,指明servlet应忽视标签体 当doEndTag()返回时,指明页面其余部分应被评估 当doEndTag()返回时,指明页面其余部分就被跳过
