[原创]java WEB学习笔记41:简单标签之带属性的自定义标签(输出指定文件,计算并输出两个数的最大值 demo)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 带属性的自定义标签
1)先在标签处理器类中定义 setter 方法:建议把所有的属性的类型都设置成 String 类型
private String value;
private String count; public void setValue(String value) {
this.value = value;
} public void setCount(String count) {
this.count = count;
}
2)在 tld 描述文件中来描述属性
<!-- 描述当前的标签的属性 -->
<attribute>
<!-- 属性名 需要和标签处理类的setter 方法定义的属性相同-->
<name>value</name>
<!-- 该属性名是必须的 -->
<required>true</required>
<!-- rtexprvalue :runtime expression value 当前属性是否可以运行时表达式的动态值-->
<rtexprvalue>true</rtexprvalue>
</attribute> <attribute>
<!-- 属性名 -->
<name>count</name>
<!-- 该属性名是必须的 -->
<required>false</required>
<!-- rtexprvalue :runtime expression value 当前属性是否可以运行时表达式的动态值-->
<rtexprvalue>false</rtexprvalue>
</attribute>
3)在页面中使用标签,并且加入属性,属性名同 tld 文件中定义的名字
<jason:hell value="${param.name }" count="10"/>
2.练习
demo1. 定制一个带有两个属性的标签<max>, 用于计算并输出两个数的最大值
MaxTag.java
package com.jason.tag.mytag; import java.io.IOException; import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag; public class MaxTag implements SimpleTag { private PageContext pageContext;
private String num1;
private String num2; public void setNum1(String num1) {
this.num1 = num1;
} public void setNum2(String num2) {
this.num2 = num2;
} @Override
public void doTag() throws JspException, IOException {
int b = 0;
int a = 0; JspWriter out = pageContext.getOut();
try {
a = Integer.parseInt(num1);
b = Integer.parseInt(num2); out.print(a > b ? a : b);
} catch (Exception e) {
out.print("输入有问题");
} } @Override
public JspTag getParent() {
// TODO Auto-generated method stub
return null;
} @Override
public void setJspBody(JspFragment arg0) {
// TODO Auto-generated method stub } @Override
public void setJspContext(JspContext pageContext) {
this.pageContext = (PageContext) pageContext; } @Override
public void setParent(JspTag arg0) { } }
mytag.tld
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0"> <!-- 描述 tld 文件 -->
<description>jaosn's first DIY jsp tag</description>
<display-name>jason tag</display-name>
<tlib-version>1.0</tlib-version> <!-- 建议在 JSP 页面上使用的标签的前缀 -->
<short-name>jason</short-name> <!-- 作为 tld 文件的 id ,用来唯一标识当前的 tld 文件,多个 tld 文件的 uri 不能重复,通过 JSP 页面的 taglib 指令的 uri 属性引用 -->
<uri>http://www.jason.com/jason/diy/tag/core</uri> <tag>
<name>max</name>
<tag-class>com.jason.tag.mytag.MaxTag</tag-class>
<body-content>empty</body-content> <attribute>
<name>num1</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute> <attribute>
<name>num2</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute> </tag>
testmytag.jsp
<body>
<jason:max num2="${param.a }" num1="${param.b }"/>
</body>
注意:通常在开发中,将标签处理类 继承 SimpleTagSupport 类,更加方便,简洁。 直接调用对应的getter方法 得到对应的 API
package javax.servlet.jsp.tagext; import java.io.IOException; import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException; public class SimpleTagSupport implements SimpleTag { public SimpleTagSupport() {
} public void doTag() throws JspException, IOException {
} private JspTag parentTag;
public void setParent( JspTag parent ) {
this.parentTag = parent;
} public JspTag getParent() {
return this.parentTag;
} private JspContext jspContext;
public void setJspContext( JspContext pc ) {
this.jspContext = pc;
} protected JspContext getJspContext() {
return this.jspContext;
} private JspFragment jspBody;
public void setJspBody( JspFragment jspBody ) {
this.jspBody = jspBody;
} protected JspFragment getJspBody() {
return this.jspBody;
} public static final JspTag findAncestorWithClass(
JspTag from, Class<?> klass)
{
boolean isInterface = false; if (from == null || klass == null
|| (!JspTag.class.isAssignableFrom(klass)
&& !(isInterface = klass.isInterface()))) {
return null;
} for (;;) {
JspTag parent = null;
if( from instanceof SimpleTag ) {
parent = ((SimpleTag)from).getParent();
}
else if( from instanceof Tag ) {
parent = ((Tag)from).getParent();
}
if (parent == null) {
return null;
} if (parent instanceof TagAdapter) {
parent = ((TagAdapter) parent).getAdaptee();
} if ((isInterface && klass.isInstance(parent))
|| klass.isAssignableFrom(parent.getClass())) {
return parent;
} from = parent;
}
}
}
demo2.定制一个带有一个属性的标签<atgiugu: readFile src=“”>, 用于输出指定文件的
ReadFileTag.java
package com.jason.tag.mytag; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport; public class ReadFileTag extends SimpleTagSupport{ //相对于当前 web应用的根路径的文件名
private String src; public void setSrc(String src) {
this.src = src;
} @Override
public void doTag() throws JspException, IOException {
PageContext pageContext = (PageContext) getJspContext();
InputStream in = pageContext.getServletContext().getResourceAsStream(src); BufferedReader br = new BufferedReader(new InputStreamReader(in));
String str = null;
while((str = br.readLine()) != null){
pageContext.getOut().write(str);
pageContext.getOut().write("<br>"); } }
}
mytag.tld
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0"> <!-- 描述 tld 文件 -->
<description>jaosn's first DIY jsp tag</description>
<display-name>jason tag</display-name>
<tlib-version>1.0</tlib-version> <!-- 建议在 JSP 页面上使用的标签的前缀 -->
<short-name>jason</short-name> <!-- 作为 tld 文件的 id ,用来唯一标识当前的 tld 文件,多个 tld 文件的 uri 不能重复,通过 JSP 页面的 taglib 指令的 uri 属性引用 -->
<uri>http://www.jason.com/jason/diy/tag/core</uri> <tag>
<name>readFile</name>
<tag-class>com.jason.tag.mytag.ReadFileTag</tag-class>
<body-content>empty</body-content> <attribute>
<name>src</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
testmytag.jsp
<jason:readFile src="/note.txt"/>
[原创]java WEB学习笔记41:简单标签之带属性的自定义标签(输出指定文件,计算并输出两个数的最大值 demo)的更多相关文章
- [原创]java WEB学习笔记16:JSP指令(page,include),JSP标签(forwar,include,param)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记95:Hibernate 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记62:Struts2学习之路--表单标签:form,表单标签的属性,textfield, password, hidden,submit ,textarea ,checkbox ,list, listKey 和 listValue 属性,select ,optiongroup ,checkboxlist
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- [原创]java WEB学习笔记40:简单标签概述(背景,使用一个标签,标签库的API,SimpleTag接口,创建一个自定义的标签的步骤 和简单实践)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
随机推荐
- Java Learning Path(三)过程篇
Java Learning Path(三)过程篇 每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法.因为我学习Java是完全自学的,从来没有问过别人,所以学习的过程基 ...
- smali文件内容具体介绍
大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看到的是(Google Play下载的完整版版 ...
- php序列化&反序列化坑
一: 在php中如果我们统一编码是没有什么问题了,但是很多朋友会发现一个问题就是utf8和gbk编码中返回的值会有所区别: php 在utf8和gbk编码下使用serialize和unserializ ...
- hibernate之6.one2many单向
表结构: 实体类图: CRUD: Student: package com.demo.model; import java.io.UnsupportedEncodingException; impor ...
- 浅谈BloomFilter【上】基本概念和实现原理
在日常生活中.包括在设计计算机软件时,我们常常要推断一个元素是否在一个集合中. 比方在字处理软件中,须要检查一个英语单词是否拼写正确(也就是要推断 它是否在已知的字典中).在 FBI. ...
- 【转】Lua 操作系统库
转老帖子备份 转自:http://www.cnblogs.com/whiteyun/archive/2009/08/10/1542913.html os.clock () 功能:返回一个程序使用C ...
- hdu 1398 Square Coins 分钱币问题
Square Coins Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- 转:什么是Node.js?
Node不是万能药!但的确能解决一些关键问题 学习Node不是一件轻松事儿,但你所收到的回报是对得起你的付出的.因为当下Web应用开发中的诸多难题唯有JavaScript才能解决. 目录 专家们的警告 ...
- 利用SQL server 的复制功能分散用户访问服务器的负载
先来了解一下一个基本的关于复制的概念. 什么是复制? 复制就是把数据的多个拷贝(复制品)分发到公司中的各个服务器中,通过复制为多台服务器提供相同的数据.这样用户就可以在不同服务器中访问同样的信息. 对 ...
- 【WPF学习笔记】之WPF基础:依赖关系属性和通知
这些天来,对象似乎已经忙得晕头转向了.每个人都希望它们做这做那.Windows® Presentation Foundation (WPF) 应用程序中的典型对象会接到各种各样不同的请求:有要求绑定到 ...