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表达式当做字符串处理
相关文章推荐
- JSP自定义标签控制JSP内容显示&&自定义标签详解
- Head First Servlets&Jsp 读书摘记8——【自定义标签】
- JSP---¬自定义标签库开发
- JSP:自定义标签之<c:if>标签
- JSP:自定义标签之开发<c:if><c:else>标签
- jsp自定义标签
- 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签
- jsp 自定义分页标签
- JSP自定义标签开发流程
- jsp自定义标签开发
- 自定义JSP标签详解------简单标签
- 完成你的自定义JSP Tag标签-Basic Coustom Tag
- 深入分析JavaWeb 23 -- jsp自定义标签开发入门
- JavaWeb之 JSP:自定义标签
- JSP:自定义标签的实现步骤及小例
- 自定义JSP中的Taglib标签之三简单仿JSTL中带标签体的ForEach循环
- JSP自定义标签开发(八)—— xx.tag自定义标签开发之分页标签(jquery + div +css 美化)
- jsp的自定义标签补充
- JSP实现自定义标签Taglib重点总结
- JSP 自定义标签---动态属性标签