您的位置:首页 > Web前端 > JavaScript

jsp&自定义标签

2018-01-28 15:29 465 查看

3自定义标签

当现有的标签无法满足需求的时候,就需要开发者自行开发标签

需求:获取客户端得IP地址
<%
String ip=request.getRemoteHost();
out.write("当前客户端的IP为"+ip);
%>
使用自定义标签替代以上脚本
1)导入自定义标签
<%@ taglib uri="http://dxq.cn" prefix="dxq"%>
showIp标签:作用可以显示客户的IP地址
<dxq:showIp>        </dxq:showIp>


3.1自定义标签出来程序:

1)开发一个普通的java类,继承 SimpleTagSupport 重写doTage方法
public class ShowIP extends SimpleTagSupport{
//

public void doTag() throws JapException,IoException{
1获取客户的IP
public class ShowIpTag  extends SimpleTagSupport{
private JspContext jspContext;
@Override
//用于设置PageContext对象
//JspContext 是PageContext的父类实际是传入PageContext对象
public void setJspContext(JspContext pc) {
this.jspContext=pc;
}
@Override
public void doTag() throws JspException, IOException {
//1获取客户端IP
PageContext pageContext=(PageContext)this.getJspC
4000
ontext();
//2通过pageContext获取其8个内置对象
HttpServletRequest request= (HttpServletRequest)pageContext.getRequest();
String ip=request.getRemoteHost();
//3把IP地址输入到浏览器
JspWriter out = pageContext.getOut();
out.write("当前客户的IP为"+ip);
}
}
自定义tld文件
2)在项目WEB-INF目录下建立一个tld文件
<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1">

<description>JSTL 1.2 core library</description>
<display-name>JSTL core</display-name>
<!-- 标签库版本号 -->
<tlib-version>1.2</tlib-version>
<!-- 简单的名称,用于标签库名的前缀 -->
<short-name>dxq</short-name>
<!-- 是标签库名的唯一标识 -->
<uri>http://dxq.cn</uri>

<!-- 定义一个标签 -->

<tag>
<!-- 标签名称    -->
<name>showIp</name>
<!-- 标签处理程序的全名 包名+类名 -->
<tag-class>dxq.ListUser.ShowIpTag</tag-class>
<!-- 标签输出的格式 -->
<body-content>scriptless</body-content>
</tag>
3)在jsp页面顶部导入自定义标签库
<%@ taglib uri="http://dxq.cn" prefix="dxq"%>
4)使用标签库的标签
<dxq:shoIp></dxq:showIp>


3.2自定义标签的执行过程

访问:http://localhost:8080/day12/07.tag.jsp
前提:Tomcat启动的时候,会读取day12项目下的WEB-INF的文件,包括,web.xml和tld文件
1)翻译成Java文件-》编译成class文件-》构造方法-》调用jspService()方法
2)在内存的tld文件查询是否存在一个URI名称为http://dxq.cn的tld文件
3)得到对应的tld文件内容、
4)读到<dxq:showIp>内容时,截取showIp名称(就是标签),到tld文件中查询是否存在name为showIp
的tag标签
5)取出<tag>标签的内容 <tag-class>字符串dxq.ListUser.ShowIpTag


3.3自定义标签的生命周期

由Tomcat服务器调用
1)构造方法:构造标签器对象
2)void setJspContext(pc )  传入PageContext对象 JspContext是PageContext的父类
可以使用getJSPContext()方法获取PageContext对象
3)void setParent(JspTag parent) 传入父标签对象,如果没有父标签,则不调用此方法
使用getParent()方法获取父标签
4)setJspBody(jspBody)       传入标签体内容,如果没有标签体,则不调用此方法
使用getJspBody()获取标签体内容:标签体的内容
封装到JspFragment中
5)void doTage()         调用标签时执行此方法,我们的业务逻辑就卸载这个方法中
可以调用getJSPContext()getParent()getJspBody()


3.4自定义标签的作用:

1)控制标签体内容是否输出
/**
* 1)控制标签内容是否输出
*  输出 :jspbody.invoke(null)
* 不输出:什么都不做
*/
//得到标签体内容
JspFragment jspBody= this.getJspBody();
//输出标签体内容
//invoke(Writer writer)执行此方法,可以把标签体内容往指定的writer输出
JspWriter writer = this.getJspContext().getOut();
//向浏览器输出标签体内容
jspBody.invoke(writer);

//第二种方式
JspFragment jspbody= this.getJspBody();
jspBody.invoke(this.getJspContext().getOut());//等价于
jspbody.invoke(null);//默认情况下就是我那个浏览器输出

2)控制标签后面的内容是是否输出
/**
* 控制标签后面的内容
*  输出:什么都不做
* 不输出: 抛出一个SkipPageException异常
*
*/
throw new   SkipPageException();

3)重复控制标签体内容的输出
/**
* 控制重复输出标签体内容
*
*/
JspFragment jspBody = this.getJspBody();
for(int i=0;i<5;i++){
jspBody.invoke(null);
}

4)改变标签体内容
/**
* 改变标签体内容
*/
//1得到标签体内容
JspFragment jspBody = this.getJspBody();
//创建一个StingWriter,用来存储标签内容
StringWriter sw = new StringWriter();
//把标签体内容拷贝到StringWriter中
jspBody.invoke(sw);
//得到StringWriter的内容
String content= sw.toString();
//2修改内容
content =content.toUpperCase();
//3.输出修改后的内容
this.getJspContext().getOut().write(content);


3.5带有属性的自定义标签:

1)在标签处理程序,添加一个setXXX方法,用于给属性赋值
private int num;
public void setNum(int num){
this.num=num;
}
2.在tld文件中进行配置
<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1">

<description>JSTL 1.2 core library</description>
<display-name>JSTL core</display-name>
<!-- 标签库版本号 -->
<tlib-version>1.2</tlib-version>
<!-- 简单的名称,用于标签库名的前缀 -->
<short-name>dxq</short-name>
<!-- 是标签库名的唯一标识 -->
<uri>http://dxq.cn</uri>

<!-- 定义一个标签 -->

<tag>
<!-- 标签名称    -->
<name>showIp</name>
<!-- 标签处理程序的全名 包名+类名 -->
<tag-class>dxq.ListUser.ShowIpTag</tag-class>
<!-- 标签输出的格式 -->
<body-content>scriptless</body-content>
<!-- 配置属性 -->
<attribute>
<!--属性名称  -->
<name>num</name>
<!-- 属性是否必须的:true必须;false可选的 -->
<required>true</required>
<!-- 该属性是否可以写EL表达式的内容
true:可以写EL
false不可以写EL表达式
-->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>


3.6标签体内容的输出格式

<body-content>scriptless</body-content>
jsp:表示标签体内容可以支持和输出jsp表达式内容(注意:这个配置只能在传统标签中使用)
scriptless:标签提内容不支持jsp表达式内容
empty:标签体内容是空的
tagdependent:标签体内容支持jsp表达式,不输出jsp表达式内容,吧jsp表达式当做字符串处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: