JSP:Tag文件的使用

需求:多个JSP页面可能需要使用一些相同的信息     例如:导航栏、标题等。

目标:提高这些相同信息的代码的复用性。

方法:将这些相同的元素形成一种特殊的文件,以便所有页面都可以使用,即:Tag文件

1、Tag对比include    

include指令标记<%@ include file=“...” %>

include动作标记<jsp:include page=“...” />

include缺点:有些情况下处理的是JSP文件,而用户可能通过该文件所在的Web服务目录直接访问到这个JSP文件。

当我们不希望这些文件被用户访问到时,需要采用新的办法:Tag文件——可被JSP动态加载,但不能被用户访问。

2、Tag文件的结构

*.tag文件    结构: 近似JSP的结构+Tag特殊指令标记

AddSum.tag

<p>这是一个Tag文件,负责计算1100内的奇数之和:</p

<% 

     int sum=0, i=l ;

     for(i=l;i<=l00;i++)

    { 

 if(i%2==1)

sum=sum+i ;

 }

out.println(sum);
%>   

3、Tag文件的保存                       

Tag文件的位置必须是:Web服务目录\WEB-INF\tags

比如:webapps\webtest\WEB-INF\tags

其中的WEB-INF和tags部是固定的子目录名称,而tags下的子目录名称可由用户给定。

4、Tag标记与Tag文件的使用

步骤1:引入标记库(对tag的声明)在JSP页面中使用<taglib>指令标记引入tag标记库。

             格式

            <%@ taglib tagdir=“tag标记的位置”  prefix=“前缀” %>

例如: <%@ taglib tagdir=“/WEB-INF/tags”  prefix=“beijing” %>

           <%@ taglib tagdir=“/WEB-INF/tags/tags2”  prefix=“dalian” %>

步骤2:在JSP页面中使用Tag标记来使用Tag。

格式:<前缀: Tag文件名/> 或<前缀: Tag文件名>

标记体</前缀: Tag文件名>

例如:<beijing: AddSum/>  

标记体

JSP页面在调用Tag过程中可通过标记体动态地向Tag传送信息。

在Tag中,通过<jsp:doBody/>来处理JSP传递过来的标记体。

 默认情况下,标记体是一些文本数据

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@taglib prefix="look" tagdir="/WEB-INF/tags" %>

<html>      

<look:Show>北京奥运会圆满成功 </look:Show>

 <look:Show> I Love this Game!</look:Show>

<look:Show>欢迎您!</look:Show>  

</html>

Show.tag

<body bgcolor="yellow"><p>

 <%

 int size=1;

for(int i=1;i<=3;i++)

{

size=size+1;         

%>

 <font size="<%=size %>">

 <jsp:doBody />

 </font>

<% }%>

 <p>

</body>

5、Tag文件中的常用指令

作用:与JSP文件类似,Tag文件中也有一些常用指令,这些指令将影响Tag文件的一些属性和行为。

Tag文件中经常使用的指令有:

1. tag

2.include

3.attribute

4.variable

5.taglib

tag指令

作用:类似于page指令,指定Tag某些属性的值。   

格式:     <%@ tag 属性1=“1” 属性2=“2”...... %>  

或     <%@ tag 属性1=“1” %>

 <%@ tag 属性2=“2” %>   ......

可设置的属性有body-content       language      import       pageEncoding

body-content属性

作用:定义JSP调用Tag时,标记体的格式。

格式<%@ tag body-content=“” %>

可取empty/tagdependent/scriptless三个值,

empty——JSP不能使用标记体;

tagdependent——标记体内容按纯文本处理;

scriptless——标记体中不能有Java程序片。

language属性:定义Tag使用的脚本语言,同JSP一样,目前只能设置为“Java”,无需设置。

import属性:引入Java核心包的类。

pageEncoding属性:指定Tag文件的字符编码,默认是ISO-8859-1

include指令

JSPinclude指令类似,回顾JSPinclude指令。

<%@ include file=“filename” %>

attribute指令

作用:实现JSPTag传送数据。

格式Tag

<%@ attribute name=“对象名字” required=“true” type=“对象类型” %>

在引用TagJSP<前缀: Tag文件名字 对象名字=“对象的引用”  />

<前缀: Tag文件名字 对象名字=“对象的引用” >标记体

</前缀: Tag文件名字 >

例如: tag中定义:<%@ attribute name=“length”  required=“true"%>

 JSP中代码: <beijing: AddSum  length=“1000” />

注意:1. 传送的是一个对象的引用

2. name属性是必须的,对应传送对象的名字。

3. type属性是对象的类型,必须带有包名,如“java.util.Date”不能简写成“Date”。默认值为java.lang.String类型。

4. required属性是可选的,默认值为false,为true时,JSP页面必须在标签中带有指定name属性的对象。

5. tag中不可再定义与name具有相同名字的变量,否则会使attribute对象失效。           

variable指令

作用:实现TagJSP返回数据。

格式1.Tag中首先声明:

<%@ variable name-given=“对象名字” variable-class=“对象类型” scope=“有效范围” %>

2.然后调用jspContext内置对象的setAttribute()将对象存储到jspContext中,以便JSP调用。如:

jspContext.setAttribute(“time”, new Date());

3.那么在JSP中,可以直接通过对象名来使用这个对象。如:

int year=time.getYear()+1900

该代码使用Date的getYear()方法,将Tag传送的time对象中记录的时间年赋给year变量。          

注意:1. 返回的是一个对象。

2. JSP中不可再定义与name具有相同名字的变量,否则会出现编译错误。

3. scope定义了variableJSP中的使用范围,可取值为AT_BEGINNESTEDAT_ENDAT_BEGIN: JSP页面一旦使用Tag,就可以使用variable给出的对象。

NESTED: JSP页面只可以在Tag标记的标记体中使用variable给出的对象。

AT_END: JSP页面在Tag标记结束后才可以使用variable给出的对象。

6、Tag标记的嵌套

当我们使用Tag标记时,可以带有标记体,标记体还可以是一个Tag标记,这就实现了Tag标记的嵌套。Tag标记中的标记体由Tag文件的<jsp:doBody/>标记负责处理,而在Tag文件中,<jsp:doBody />标记被替换成对“标记体”进行处理后所得到的结果。

7、JSP引擎与Tomcat服务器

将安装JSP引擎的计算机称作一个支持JSP的Web服务器。这个服务器负责运行JSP,并将运行结果返回给用户。

JSP的核心内容之一就是编写JSP页面,JSP页面是Web应用程序的重要组成部分。一个简单Web应用程序可能只有一个JSP页面,而一个复杂的Web应用程序可能由许多JSP页面、Javabean和servlet组成。当用户请求Web服务器上的JSP页面时,JSP引擎负责运行JSP,并将运行结果返回给用户。

  attribute指令

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/156402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库入门到大牛_基础_10_创建和管理表(创建和管理数据库;创建表;修改表;重命名表;删除表;清空表,内容扩展)

前面我们完成了查询结构的介绍&#xff0c;本章介绍DDL和DCL中的COMMIT和ROLL BACK。 文章目录 1. 基础知识1.1 一条数据存储的过程1.2 标识符命名规则1.3 MySQL中的数据类型 2. 创建和管理数据库2.1 创建数据库2.2 使用数据库2.3 修改数据库2.4 删除数据库 3. 创建表3.1 创建…

猫罐头哪个牌子好吃?精选5款好评率高的猫罐头推荐!

很多新手养猫的姐妹们都会为选罐头感到焦虑&#xff01;因为每种猫罐头都有优缺点&#xff0c;每只猫咪的胃口也都不同&#xff0c;所以只有综合考虑选择适合自家猫咪的猫罐头的才是最好的。所以姐妹们在选罐头之前可以先做好功课&#xff0c;了解一下怎么选好的猫罐头。 作为开…

Jmeter监听器

Jmeter监听器 一、监听器介绍二、监听器的类型三、监听器详解3.1 察看结果树3.2 Summary Report3.3 聚合报告3.4 后端监听器3.5 Aggregate Graph3.6 Comparison Assertion Visualizer&#xff08;比较断言可视化器&#xff09;3.7 JSR223 Listener3.8 Response Time Graph3.9 S…

欧科云链研究院:从香港SFC最新文件看链上交易合规必备之选

出品&#xff5c;欧科云链研究院 作者&#xff5c;Hedy Bi 近日&#xff0c;香港证监会在其官网发布“致持牌法团、获证监会发牌的虚拟资产服务提供者及有联系实体的通函 - 打击洗钱&#xff0f;恐怖分子资金筹集经更新的《打击洗钱&#xff0f;恐怖分子资金筹集的自我评估查…

CICD 持续集成与持续交付(2)

目录 gitlab 部署 jenkins 部署 配置 实时触发 自动化构建docker镜像 通过ssh插件交付任务 添加jenkins节点 RBAC pipeline jenkins结合ansible参数化构建 安装ansible 新建gitlab项目 jenkins新建项目playbook gitlab 部署 虚拟机最小需求&#xff1a;4G内存 4核cpu 下载&…

【智能优化算法】从蚁群到动物园

目录 引言蚁群优化算法&#xff08;ACO&#xff09;ACO 机理ACO 模型描述ACO 移动策略 粒子群优化算法&#xff08;PSO&#xff09;PSO 机理PSO 模型描述 萤火虫群优化算法&#xff08;GSO&#xff09;GSO 机理GSO 模型描述 群智能优化算法 引言 21世纪&#xff0c;人类社会已经…

ElementUI用el-table实现表格内嵌套表格

文章目录 一、效果图二、使用场景三、所用组件元素&#xff08;Elementui&#xff09;四、代码部分 一、效果图 二、使用场景 &#x1f6c0;el-form 表单内嵌套el-table表格 &#x1f6c0;el-table 表格内又嵌套el-table表格 三、所用组件元素&#xff08;Elementui&#xff…

Kubeadm部署Kubernetes Containerd集群

文章目录 概述一、硬件系统二、基础配置设置主机名配置主机名与IP地址解析关闭防火墙与selinux时间同步(ntp)升级系统内核配置内核转发及网桥过滤*安装ipset及ipvsadm关闭SWAP分区 三、Containerd准备Containerd获取下载解压Containerd配置文件生成并修改Containerd启动及开机自…

5年经验之谈 —— 性能测试如何定位分析性能瓶颈?

你好&#xff0c;我是小牛&#xff0c;目前在一家准一线互联网大厂做测试开发工程师。 对于一般公司普通测试工程师来说&#xff0c;可能性能测试做的并不是很复杂&#xff0c;可能只是编写下脚本&#xff0c;做个压测&#xff0c;然后输出报告结果&#xff0c;瓶颈分析和调优…

【Hello Go】Go语言复合类型

复合类型 分类指针基本操作new函数指针作为函数的参数 数组概述操作数据数组初始化数组比较在函数之间传递数组 slice概述切片的创建和初始化切片操作切片和底层数组关系内建函数appendcopy 切片作为函数传参 map概述创建和初始化常用操作赋值遍历 删除map作函数参数 结构体结构…

Python (十三) 输出

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

基于Python+TensorFlow+Django的交通标志识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 随着交通网络的不断扩展和智能交通系统的发展&#xff0c;交通标志的自动识别变得愈发重要。本项目旨在利用Python编…

利用SVD对图像进行压缩

利用SVD对图像进行压缩 使用SVD能够对数据进行降维&#xff0c;对图像进行SVD&#xff0c;降维之后然后重构数据&#xff0c;还原后的图像就是压缩后的图像。 SVD SVD进行图像压缩所依据的数学原理就是矩阵的近似表示&#xff1a; A m n ≈ U m k ∑ k k V k n T A_{m\…

基于晶体结构算法优化概率神经网络PNN的分类预测 - 附代码

基于晶体结构算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于晶体结构算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于晶体结构优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

[Docker]八.Docker 容器跨主机通讯

一.跨主机通讯原理 在主机192.168.31.140上的docker0(172.17.0.0/16)中有一个容器mycentos( 172.17.0.2/16), 在主机192.168.31.81上的docker0(172.17.0.0/16)中有一个容器mycentos( 172.17.0.2/16),然后在主机192.168.31.140上ping主机192.168.31.81,发现ping不通要实现两个主…

vite构建项目不能使用require解决方案

在utils文件夹下创建一个getImgUrl.ts文件 /** vite的特殊性, 需要处理图片 */ export const require (imgPath: string) > {try {const handlePath imgPath.replace(, ..)console.log(handlePath::, imgPath)return new URL(handlePath, import.meta.url).href} catch (…

如何入驻抖音本地生活服务商,附上便捷流程!

抖音作为一款短视频社交媒体应用&#xff0c;已经成为全球范围内数以亿计的用户的首选。而在普及的同时&#xff0c;短视频领域也在不断拓展自身的业务领域&#xff0c;其中之一就是本地生活服务。继抖音本地生活服务之后支付宝、视频号也相继开展了本地生活服务&#xff0c;用…

Linux(5):Linux 磁盘与文件管理系统

认识 Linux 文件系统 磁盘的物理组成&#xff1a; 1.圆形的磁盘盘(主要记录数据的部分); 2.机械手臂&#xff0c;与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据)&#xff1b; 3.主轴马达&#xff0c;可以转动磁盘盘&#xff0c;让机械手臂的读取头在磁盘盘上读写数据。 4…

python接口自动化-参数关联

前言 我们用自动化发帖之后&#xff0c;要想接着对这篇帖子操作&#xff0c;那就需要用参数关联了&#xff0c;发帖之后会有一个帖子的id&#xff0c;获取到这个id&#xff0c;继续操作传这个帖子id就可以了 &#xff08;博客园的登录机制已经变了&#xff0c;不能用账号和密…

【算法设计实验三】动态规划解决01背包问题

请勿原模原样复制&#xff01; 01背包dp具体解释详见链接 ↓ 【算法5.1】背包问题 - 01背包 &#xff08;至多最大价值、至少最小价值&#xff09;_背包问题求最小价值_Roye_ack的博客-CSDN博客 关于如何求出最优物品选择方案&#xff1f; 先在递归求dp公式时&#xff0c;若…