第 3 步:在标签处理程序 Java 类中创建属性
我们希望为 mapDefine
标签指定三个属性,如下所示:
属性说明
id |
新 scriptlet 变量的名字。 |
scope |
新 scriptlet 变量所在的范围。 |
type |
新 scriptlet 变量的类型 (HashMap 、FastHashMap 、TreeMap 或者 FastTreeMap )。 如果 type 设置为 hash ,那么就会创建一个 HashMap 。如果 type 设置为 fasthash ,那么将创建 FastHashMap 。 |
在 JSP 页中使用这个标签时,它看起来将像下面这样:
<map:mapdefine type="hash" scope="session" id="editParams"> ... </map:mapdefine>
这个标签将在会话范围内创建一个名为 editParams
的 HashMap
。
为了在标签处理程序中创建属性,需要定义相应的 JavaBean 属性。 因此,每一个属性在标签处理程序中都有对应的 setter 方法,如下所示:
public class MapDefineTag extends TagSupport { ... private String type = FASTTREE; private String id; private String scope; public void setType(String string) { type = string; } public void setId(String string) { id = string; } public void setScope(String string) { scope = string; }
转换引擎将用硬编码的配置数据或者运行时表达式设置这个标签的属性。 我们将在 第 4 步:在 TLD 文件中定义属性 中对此做更详细的讨论。
在 第 5 步:实现 doStartTag() 方法 中,我们将在标签处理程序的 doStartTag()
方法中使用这些属性。
第 4 步:在 TLD 文件中定义属性
就 像上一小节中所做的那样,通过声明 JavaBean 属性定义自定义属性,然后在 TLD 文件中声明这些属性。 每一个 JavaBean 属性都必须与相应的自定义标签属性相匹配。 在 TLD 中定义的属性必须匹配 JavaBean 属性,不过却可以有与标签属性不匹配的 JavaBean 属性。
下面是 MapDefineTag
的属性声明:
<tag> <name>mapDefine</name> <tag-class>trivera.tags.map.MapDefineTag</tag-class> <body-content>JSP</body-content> ... <attribute> <name>id</name> <required>true</required> <rtexprvalue>false</rtexprvalue> <description>The id attribute</description> </attribute> <attribute> <name>scope</name> <required>false</required> <rtexprvalue>false</rtexprvalue> <description>The scope attribute</description> </attribute> <attribute> <name>type</name> <required>false</required> <rtexprvalue>false</rtexprvalue> <description> Specifies the type of map valid values are fasttree, fasthash, hash, tree </description> </attribute> </tag>
name
元素指定属性的名字。required
元素指定属性是否是必需的(默认值是 false
)。rtexprvalue
元素表明属性是硬编码了转换时的值还是允许使用运行时 scriptlet 表达式。
记住,MapDefineTag
类必须为前面描述的每一个属性定义一个 JavaBean 属性,我们在 第 3 步:在标签处理程序 Java 类中创建属性 中完成这个任务。
第 5 步:实现 doStartTag() 方法
标签开始时调用 doStartTag()
方法 —— 从开发人员的角度看,这是当引擎遇到 <map:mapdefine></map:mapdefine>
时发生的。如果 doStartTag()
返回 SKIP_BODY
,那么将不处理标签正文。 如果它返回一个 EVAL_BODY_INCLUDE
,那么将处理正文。
MapDefine
类的 doStartTag()
方法完成以下工作:
- 根据
type
属性确定要创建的 map 的属性。
- 根据
scope
属性确定新的 map 对象放在什么范围内。
- 根据
id
属性确定新 map 对象要放入的范围的名字。
让我们更详细地分析这个过程。MapDefine
类检查 type
属性是设置为 FASTTREE
、HASH
、TREE
还是 FASTHASH
。然后创建相应的 map,如下所示:
/* String constants for the different types of maps we support */ public static final String FASTHASH = "FASTHASH"; public static final String FASTTREE = "FASTTREE"; public static final String HASH = "HASH"; public static final String TREE = "TREE"; /** The map we are going to create */ private Map map = null; /** The member variable that holds the type attribute */ private String type = FASTTREE; ... public int doStartTag() throws JspException { /** Based on the type attribute, determines which type of Map to create */ if (type.equalsIgnoreCase(FASTTREE)) { map = new FastTreeMap(); } else if (type.equalsIgnoreCase(HASH)) { map = new HashMap(); } else if (type.equalsIgnoreCase(TREE)) { map = new TreeMap(); } else if (type.equalsIgnoreCase(FASTHASH)) { map = new FastHashMap(); }
然后,用 id
和 scope
属性将 hashmap 以一个给定的名字设置到一个给定范围中:
private String id; private String scope; public int doStartTag() throws JspException { ... if (scope == null){ pageContext.setAttribute(id, map); }else if("page".equalsIgnoreCase(scope)){ pageContext.setAttribute(id, map); }else if("request".equalsIgnoreCase(scope)){ pageContext.getRequest().setAttribute(id, map); }else if("session".equalsIgnoreCase(scope)){ pageContext.getSession().setAttribute(id, map); }else if("application".equalsIgnoreCase(scope)){ pageContext.getServletContext().setAttribute(id, map); } return EVAL_BODY_INCLUDE; }
如果范围属性是 null
,那么 map 将放入页范围。否则,参数将放入通过 scope
属性传递的范围名所对应的范围中。
到目前为止,我们已经有一个非常简单的标签,它有三个属性:id
、scope
和 type
。 我们将用给定的名字将 map 放到一个范围中。但是,我们还有一件事没做,就是声明 scriptlet 变量。 为了做到这一点,需要向 TLD 再添加一项,这就是我们在下一小节中所要做的事。
第 6 步:声明 scriptlet 变量
要 理解 scriptlet 变量,必须理解 TLD 文件的作用。这个文件基本上是元数据的一个储存库,当 JSP 页转换为 servlet 时,标签会使用这些元数据。 在生成的 servlet 中,scriptlet 变量成了本地变量。 要让 JSP 转换引擎知道这些变量应当声明的类型,需要像下面这样在 TLD 文件中增加项:
<variable> <name-from-attribute>id</name-from-attribute> <variable-class>java.util.Map</variable-class> <scope>AT_BEGIN</scope> </variable>
将上面的代码片断放在 TLD 文件中 body-content
元素之后、attribute
元素之前。 在 variable
元素下面,我们声明了三个子元素:name-from-attribute
、variable-class
和 scope
。 name-from-attribute
指定 id
属性的值是转换引擎将要定义的 scriptlet 变量的名字。variable-class
是转换将要定义的变量的类类型。scope
指定变量什么时候可用:它可以嵌套到标签的正文中 (NESTED
)、在标签结束后 (AT_END
)、或者在标签的开始时 (AT_BEGIN
)。我们使用 AT_BEGIN
这一范围,它意味着变量的范围将是从标签的开始到当前 JSP 页的结束。
现在了解了如何构建简单自定义标签。在下一小节中,我们将分析标签的生存周期方法,以了解 JSP 页实际运行时所发生的情况。
分享到:
相关推荐
WinForm开发框架源码 权限管理系统源码 功能描述:01.登录界面 02.系统配置 03.申请账户 04.即时通讯 05.发送消息 06.广播消息 07.软件频道 - 内部通讯录 08.软件频道 - 名片管理 09.软件频道 - 代码生成器 10.系统后台管理 - 用户审核 11.系统后台管理 - 用户管理 12.系统后台管理 - 组织机构管理 13.系统后台管理 - 角色管理 14.系统后台管理 - 员工管理 15.系统后台管理 - 岗位管理 16.系统后台管理 - 用户权限设置 17.系统后台管理 - 角色权限设置 18.系统后台管理 - 组织机构权限设置 19.系统后台管理 - 菜单权限项设置 20.系统后台管理 - 选项管理 21.系统后台管理 - 序号(流水号)管理 22.系统后台管理 - 系统日志 - 按用户访问情况 23.系统后台管理 - 系统日志 - 按用户查询 24.系统后台管理 - 系统日志 - 按菜单查询 25.系统后台管理 - 系统日志 - 按日期查询 26.系统后台管理 - 系统日志 - 系统异常情况记
超级常用的甘特图-项目管理.xlsx
Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
.f2812.acid
沟通的人性之光——AI 难以取代的人际交流能力.pdf
# 基于Spring Boot和Redis的分布式数据访问系统 ## 项目简介 本项目是一个基于Spring Boot和Redis的分布式数据访问系统,旨在提供高效、可靠的数据库访问和缓存管理功能。系统通过集成Spring Boot框架和Redis数据库,实现了对数据库的读写操作、数据分片、缓存管理等功能,适用于需要高性能和高可用性的分布式应用场景。 ## 项目的主要特性和功能 1. 数据库访问对象(DAO)基类提供通用的数据库访问对象基类,简化数据库操作的配置和管理。支持只读模式和分片数据源的配置。 2. 数据源上下文持有者管理和切换数据库连接,适用于数据库分片的环境。 3. 动态数据源管理实现多数据库的动态管理,支持切换数据库连接。 4. 数据库访问接口(DAO)定义了与数据库交互的基本操作,如增删改查等。 5. 读写分离提供只读和可写的数据访问对象,确保读操作和写操作在不同的环境中进行。
cnpdf_down.php
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
简介这个资源是一个用Java实现的贪吃蛇小游戏,旨在帮助初学者和有经验的开发者学习和提升编程技能。项目基于Java Swing库开发,包含完整的源代码、资源文件和文档。通过本项目,学习者可以深入理解Java编程基础、面向对象设计、图形用户界面开发、事件处理机制和游戏逻辑开发等核心概念。该贪吃蛇项目经过严格测试,确保代码可以正常运行,并且已经通过了答辩评审,获得高分评价,证明了其质量和完成度。项目适合作为课程设计、毕业设计或自我提升的实践练习。通过分析与实践这个项目,用户可以加深对Java语言的理解,提高编程能力,并获得宝贵的软件开发经验。
AI智能聊天小程序开源版本,目前支持对接阿里通义千问、百度千帆文心一言、讯飞星火大模型. 基于ruoyi-vue-plus的java8版本,有一些优化改动,主要技术栈: 后端:springboot2.7.18、mybatisplus、mysql、redis web前端:vue2、element ui、markdown编辑器cherry-markdown 小程序:微信原生语法、vant ui组件
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
<项目介绍> - 在本次设计中,将运用到MATLAB平台来对语音信号进行处理及识别。通过ATLAB平台建立一个GUI界面,接着输入数字语音信号,对输入进行预处理及端点检测,提取特征参数(MFCC),形成参考模块。与参考模块进行DTW算法进行匹配,输出匹配后的识别结果。 所制作GUI界面,制作成一个九宫格界面,点击对应0-9十个数字,可以播放对应语音,并且显示路径,波形,和结果的文本输出。可以进行二次改造成,属于一串数字,如数字正确,则触发另一个界面GUI,实现发射端和接收端的对话 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 -----
一阶倒立摆模型推理和matlab仿真
# 基于Arduino的汽车事故预警系统 ## 项目简介 本项目旨在设计一个基于Arduino的汽车事故预警系统,通过实时监测汽车的振动和加速度数据,预测可能的事故并发出警报。系统利用Arduino板、Esp8266模块、ADXL345加速度计等硬件设备,并通过手机或电脑应用程序接收警报信息。 ## 项目的主要特性和功能 1. 实时数据监测系统能够实时监测汽车的振动和加速度数据。 2. 数据传输通过Esp8266模块将数据传输到手机或电脑应用程序。 3. 警报通知应用程序接收警报信息,提醒驾驶员可能发生的事故。 4. 调试与分析提供串口监视器读数功能,方便调试和数据分析。 ## 安装使用步骤 1. 准备硬件确保所有硬件设备(如Arduino板、Esp8266模块、ADXL345加速度计等)已准备齐全。 2. 硬件连接按照说明书正确连接硬件设备,并配置Arduino IDE环境。 3. 上传代码下载并上传源代码文件到Arduino板。
# 基于Qt框架的兵棋进攻游戏系统 ## 项目简介 本项目是一个兵棋进攻游戏系统,通过图形界面展示兵棋对战的过程。玩家通过操作棋子,克服障碍和防守点,将棋子移动到进攻目标区。游戏具有随机生成棋子和障碍物的功能,以及实时更新游戏界面的能力。玩家可以通过鼠标点击和移动来操作棋子,游戏简单易懂,充满挑战性和趣味性。 ## 项目的主要特性和功能 1. 图形界面通过Qt框架实现图形界面,展示游戏棋盘、棋子、障碍物、防守点和目标区域。 2. 游戏逻辑实现兵棋进攻的游戏逻辑,包括棋子的移动、攻击、生命值管理,以及游戏的胜负判断。 3. 随机生成随机生成棋子和障碍物的位置,增加游戏的随机性和挑战性。 4. 实时更新实时更新游戏界面,包括棋子的位置、生命值、子弹的更新等。 5. 用户交互处理鼠标按下事件,实现棋子的选中、移动、生命值更新等操作。 6. 防守点机制设置防守点,棋子进入攻击范围时,防守点会进行射击。 7. 胜负判断判断游戏是否胜利或失败,并显示相应的提示信息。
2024116比亚迪张家口成焊新线RF01生产线项目PLC和HMI屏幕程序,SEW IPOS SEW_MoviDrive RFID读写 博途项目
正点原子lvgl开发资料
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值