[原创]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)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
随机推荐
- 【SpringMVC学习04】Spring、MyBatis和SpringMVC的整合
前两篇springmvc的文章中都没有和mybatis整合,都是使用静态数据来模拟的,但是springmvc开发不可能不整合mybatis,另外mybatis和spring的整合我之前学习mybati ...
- nginx根据目录反向代理到后端服务器
nginx根据目录反向代理到后端不同的服务器 server { listen 80; server_name demo.domain.com; #通过访 ...
- [译]GLUT教程 - 修改菜单
Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Modifying Menus 肯定会有菜单需要被修改的状 ...
- 【ubantu】Ubuntu的一些常用快捷键
Ubuntu操作基本快捷键* 打开主菜单 = Alt + F1* 运行 = Alt + F2* 显示桌面 = Ctrl + Alt + d* 最小化当前窗口 = Alt + F9* 最大化当前窗口 = ...
- 【windows7 + Appium】之Appium安装以及其他工具安装配置
首先感谢虫师总结的教程:<appium新手入门>.以及:<appium新手入门(2)—— 安装 Android SDK> 目录: 安装Appium&安装node.js ...
- subject相关信息
记录一下我的错误信息 在ssm+shiro整合的时候,发现这样一个问题,第一次登录进去之后,然后再登录,输入错误的用户名和密码,竟然仍然登录成功,突然想起来了,是不是login之后,logout之后这 ...
- 那不是Bug,是新需求
原文作者:Jeff Atwood 自从我干上软件开发这一行.而且使用了Bug跟踪系统.我们在每个项目里都会纠结一个主要的问题:你怎么能把Bug与功能需求区分开来? 当然,假设程序崩溃了,这毫无疑问是B ...
- Android 浏览器文本垂直居中问题
问题描述 在开发中,我们常使用 line-height 属性来实现文本的垂直居中,但是在安卓浏览器渲染中有一个常见的问题,就是对于小于12px的字体使用 line-height 属性进行垂直居中的时候 ...
- c#脚本控制shader
如图所示,c#脚本控制shader颜色. public class ControlColor : MonoBehaviour { , , , ); public Material mat; publi ...
- Linux时间时区详解与常用时间函数
时间与时区 整个地球分为二十四时区,每个时区都有自己的本地时间. Ø UTC时间 与 GMT时间 我们可以认为格林威治时间就是时间协调时间(GMT = UTC),格林威治时间和UTC时间都用秒数来计 ...