分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

Servlet和JSP之标签文件学习

发布时间:2023-09-06 01:43责任编辑:林大明关键词:暂无标签

  在上一篇文章中介绍了自定义标签的用法,接下来介绍标签文件的用法啦。


  tag file指令

  tag file简介

  用tag file的方式,无需编写标签处理类和标签库描述文件,也可以自定义标签。tag file从两个方面简化了自定义标签的开发。首先,tag file无须提前编译,直到第一次调用才会编译;其次,标签库描述文件也不再需要了,使用tag file的方式,tag file名和action相同,因此不需要标签库描述文件了。

  一个tag file和JSP页面一样,它拥有指令、脚本、EL表达式、动作元素以及自定义的标签。一个tag file以tag和tagx为后缀,它们可以包含其他资源文件。一个被其他文件包含的tag file应该以tagf为后缀。

  tag文件必须放在应用路径的WEB-INF/tags目录下才能生效。和标签处理类一样,tag文件可以被打包到jar包里。

  以下是tag file中可用的隐藏对象(其实跟文章JSP隐藏对象类似):

对象

类型

说明

request

javax.servlet.http.HttpServletRequest

每当客户端请求一个JSP页面时,JSP引擎就会制造一个新的reuqest对象来代表这个请求。request对象提供了一系列方法来获取HTTP头信息、cookies、HTTP方法等等。

response

javax.servlet.http.HtpServletResponse

当服务器创建request对象时会同时创建用于响应这个客户端的response对象。response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的cookies、时间戳、HTTP状态码等等。

out

javax.servlet.jsp.JspWriter

out对象用来在response对象中写入内容。

session

javax.servlet.http.HttpSession

session对象用来跟踪在各个客户端请求间的会话。

application

javax.servlet.ServletContext

application对象在JSP页面的整个生命周期中都代表着这个JSP页面。这个对象在JSP页面初始化时被创建,随着jspDestory()的调用而被移除。通过向application中添加属性,则所有组成web应用的JSP文件都能访问到这些属性。

config

javax.servelt.ServletConfig

config对象允许开发者访问Servlet或者JSP引擎的初始化参数,比如文件路径等。

pageContext

javax.servlet.jsp.PageContext

pageContext对象主要用来访问页面信息,同时过滤大部分实现细节。该对象除了pageContext、page、exception对象的属性不能导出,其余内置对象的属性都能导出,而且该对象包含了传给JSP页面的指令信息,也定义了一些字段。

page

javax.servlet.jsp.HttpJspPage

page对象就是页面实例的引用,可以被看做是整个JSP页面的代表(与this对象同义)

exception

java.lang.Throwable

exception对象包装了从先前页面中抛出的异常信息,通常被用来产生对出错条件的适当响应。

   

  接下来是创建一个标签文件并且使用的例子:

  创建标签文件并使用只有两步:

  ① 编写标签文件.tag(例如firstTag.tag),记住要在/WEB-INF/tags中创建此文件哦。

<%@ tag import="java.util.Date" ????import="java.text.SimpleDateFormat" ???import="java.io.IOException"%><% ???SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd ?HH:mm:ss"); ???String dateStr = simpleDateFormat.format(new Date()); ???JspWriter jspWriter = getJspContext().getOut(); ???jspWriter.write(dateStr);%>

  ② 编写jsp测试页面。

<%@ page language="java" contentType="text/html; charset=UTF-8" ???pageEncoding="UTF-8"%><%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> ???Today is <easy:firstTag/></body></html>

  出来的页面效果就跟自定义标签展现出来的样子是类似的哦。

  

  tag file指令

  tag file的指令不多,也就那么几个:

指令

说明

tag

作用与JSP页面中的page指令类似

include

用于将其他资源导入tag file中

taglib

用于将自定义标签库导入tag file中

attribute

用于将自定义标签库导入tag file中

variable

用于将自定义标签库导入tag file中

  看着有点懵?没事儿,接下来会挨个儿解释。

  ① tag指令

  语法:<%@ tag attribute="value" attribute2="value2" %>

  属性(除了import属性,其他所有的属性在一个tag指令或一个tag file中都只能出现一次。):

属性

描述

display-name

在XML工具中显示的名称。默认值是不包含后缀的tag file名

body-content

指定标签body的类型, body-content属性值有empty、tagdependent、scriptless,默认值是scriptless。

dynamic-attributes

指定tag file动态属性的名称。当dynamicattributes值被设定时,会产生一个Map来存放这些动态属性的名称和对应的值。

small-icon

指定一个图片路径,用于在XML工具上显示小图标。一般不会用到。

large-icon

制定一个图片路径,用于在XML工具上显示大图标。一般不会用到。

description

标签的描述信息。

example

标签使用实例的描述。

language

tag file中使用的脚本语言类型。当前版本的JSP中,该值必须设为”java”。

import

用于导入一个java类型,和JSP页面中的import相同。

pageEncoding

指定tag file使用的编码格式,可以使用“CHARSET”中的值。和JSP页面中pageEncoding相同。

  include指令

  tag file中的include指令和JSP页面中的include指令是一样的。可以使用这个指令来将外部文件导入到tag file中。当你有一个公共资源文件有可能用在多一个tag file中时,include指令将能够发挥它的作用。这个公共资源文件可以是静态文件(如HTML文件),也可以是动态文件(如tag file)。

  接下来是一个例子~(除了jsp页面文件,其余的文件都要放到tags文件夹中哦)。

  ① 创建一个tag file(如includeDemoTag.tag)。

Here is the content of included.html:<%@ include file="included.html" %><br/><br/>The second include directive includes another dynamic resource:included.tagf.<br/><%@ include file="included.tagf" %>

  

  ② 创建一个.html文件(如included.html),用于展示实现include导入,html等静态文件的功能。

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><table> ???<tr><td><b>Menu</b></td></tr> ???<tr><td>CDs</td></tr> ???<tr><td>DVDs</td></tr> ???<tr><td>Others</td></tr></table></body></html>

  ③ 创建一个.tagf文件(如included.tagf),用于展示实现include导入.tagf等动态文件的功能。

<% ???out.print("Hello from included.tagf");%>

  ④ 创建一个.jsp页面文件,用于测试include指令的作用。

<%@ page language="java" contentType="text/html; charset=UTF-8" ???pageEncoding="UTF-8"%><%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> ???<easy:includeDemoTag/></body></html>

  出来的页面效果是这样子哒~

  taglib指令

  可以通过taglib指令在tag file中使用自定义标签。

  语法:<%@ taglib uri="tagLibraryURI" prefix="tagPrefix" %>

  属性:uri属性---用来指定与前缀相关联的标签库描述文件的绝对路径或相对路径;prefix属性---用来定义自定义标签的前缀。

  使用taglib指令,既可以使用不包含content body的自定义标签:

<prefix:tagName/>

  也可使用包含content-body的自定义标签:

<prefix:tagName>body</prefix:tagName>

  使用taglib指令的例子如下:

  ① 先创建一个.tag的文件(如taglibDemo.tag,此例中会用到上述的第一个例子中的firstTag.tag文件)

<%@ taglib prefix="simple" tagdir="/WEB-INF/tags"%>The server‘s date : <simple:firstTag/>

  ② 然后再创建一个.jsp(如taglibDemoTest.jsp)页面文件,用来测试taglib指令。

<%@ page language="java" contentType="text/html; charset=UTF-8" ???pageEncoding="UTF-8"%><%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> ???<easy:taglibDemo/></body></html>

  测试出来的效果是这样的。

  attribute指令

  attribute用于设定tag file中标签的属性。它和标签库描述文件中的attribute元素等效。

  语法:<%@ attribute attribute1="value1" attribute2="value2" %>

  属性(这些属性中,只有name属性是必选的):

属性

描述

name

用于设定该属性的名称,在一个tag file中,每个属性的名称必须是唯一的。

required

用于设定该属性是否是必须的。值可以去true或false,默认值为false。

fragment

用于设定该属性是否是fragment。默认值为false。

rtexprvalue

用于设定该属性的值是否在运行时被动态计算。值可以取true或false,默认值为true。

type

用于设定该属性的类型,默认值为java.lang.String。

description

用于设定该属性的描述信息。

  以下是关于attribute指令的例子~

  ① 创建一个.tag文件(如encode.tag)

<%@ attribute name="input" required="true"%><%! ????private String encodeHtmlTag(String tag){ ???????if(tag==null){ ???????????return null; ???????} ???????int length = tag.length(); ???????StringBuilder encodedTag = new StringBuilder(2*length); ???????for(int i=0;i<length;i++){ ???????????char c = tag.charAt(i); ???????????if(c==‘<‘){ ???????????????encodedTag.append("&lt"); ???????????}else if(c==‘>‘){ ???????????????encodedTag.append("&gt"); ???????????}else if(c==‘&‘){ ???????????????encodedTag.append("&amp"); ???????????}else if(c==‘"‘){ ???????????????encodedTag.append("&qout"); ???????????}else if(c==‘ ‘){ ???????????????encodedTag.append("&nbsp"); ???????????}else{ ???????????????encodedTag.append(c); ???????????} ???????} ???????return encodedTag.toString(); ???}%><%=encodeHtmlTag(input)%>

  

  ② 创建一个.jsp页面进行测试(如encodeTagTest.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" ???pageEncoding="UTF-8"%><%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> ???<easy:encode input="<br/> means changing line."/></body></html>

  

  完成上述的步骤之后,得到的效果就是这样的:

  variable指令

  tag file中的variable指令是用于定义那些需要传递到JSP页面的变量。

  tag file支持多个variable指令,这意味着可以传递多个值到JSP页面。相对而言,attribute指令的作用与variable相反,它用于将值从JSP页面传递到tag file。

  语法:<%@ variable attribute1="value" attribute2="value2" %>

  属性:

属性

描述

name-given

变量名。在JSP页面的脚本和EL表达式中,可以使用该变量名。如果指定了name-from-attribute属性,那么name-given属性就不能出现了,反之亦然。name-given的值不能和同一个tag file中的属性名重复。

name-from-attribute

和name-given属性类似,由标签属性的值来决定变量的名称。如果name-from-attribute和name-given属性同时出现h或者都不出现的话会出现错误。

alias

设定一个用来接收变量值的局部范围。

variable-class

变量的类型。默认为java.lang.String。

declare

设定该变量是否声明。默认值是false。

scope

用于指定该变量的范围。可取的值为AT_BEGIN、AT_END和NESTED。默认值为NESTED。

description

用于描述变量。

  

  以下是对variable指令的示例:

  ① 创建.tag文件(如varDemo.tag)

<%@ tag import="java.util.Date" import="java.text.DateFormat"%><%@ variable name-given="longDate" %><%@ variable name-given="shortDate"%><% ???Date now = new Date(System.currentTimeMillis()); ???DateFormat longFormat = DateFormat.getDateInstance(DateFormat.LONG); ???DateFormat shortFormat = DateFormat.getDateInstance(DateFormat.SHORT); ???jspContext.setAttribute("longDate", longFormat.format(now)); ???jspContext.setAttribute("shortDate", shortFormat.format(now));%><jsp:doBody/>

  ② 创建一个用于测试的.jsp页面(如varDemoTest.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" ???pageEncoding="UTF-8"%><%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> ???Today‘s date: ???<br/> ???<tags:varDemo> ???????In long format:${longDate } ???????<br/> ???????In short format:${shortDate } ???????<br/> ???</tags:varDemo></body></html>

  

  通过以上的步骤得到的页面效果就是下图所示啦:

  

  doBody

  doBody动作元素只能在tag file中使用,它用来调用一个标签的本体内容。doBody动作元素也可以有属性。你可以通过这些属性来指定某个变量来接收主体内容,如果不使用这些指令,那么doBody动作元素会把主体内容写到JSP页面的JspWriter上。

  doBody动作元素的属性如下(这些属性都是非必须的哦):

属性

描述

var

用于保存标签主体内容的变量值,主体内容就会以java.lang.String的类型保存这个变量内。var和varReader属性只能出现一个。

varReader

用于保存标签主体内容的变量值,主体内容就会以java.io.Reader的类型保存这个变量内。var和varReader属性只能出现一个。

scope

变量保存到的作用域。

  

  接下来是doBody动作元素的例子:

  ① 创建一个.tag文件(如doBodyDemo.tag)。

<jsp:doBody var="referer" scope="session"></jsp:doBody><!-- 意思是,一个doBody动作元素,指定了一个叫做referer的session属性来保存标签本体内容 -->

  

  ② 创建一个.jsp文件(如main.jsp),用于加载头信息并且对referer变量的值进行赋值。

<%@ page language="java" contentType="text/html; charset=UTF-8" ???pageEncoding="UTF-8"%><%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> ???Your referer header:${header.referer } ???<br/> ???<tags:doBodyDemo> ???????${header.referer } ???</tags:doBodyDemo> ???<a href="viewReferer.jsp">View</a> the referer as a Session attribute.</body></html>

  ③ 创建一个.jsp页面(如viewReferer,jsp),用于把在main.jsp存储的referer值打印出来。

<%@ page language="java" contentType="text/html; charset=UTF-8" ???pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>The referer header of the previous page is ${sessionScope.referer }</body></html>

  ④ 创建一个.html页面(如searchEngine.html),用于打开main,jsp页面查看测试结果。

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body>Please click <a href="main.jsp">here</a></body></html>

  

  接下来是测试结果的展示~

  ① searchEngine.html

  ② main.jsp

  ③ viewReferer.jsp

  invoke动作元素

  invoke动作元素和doBody类似,在tag file中,可以使用它来调用一个fragment。invoke动作元素中有多个属性,其中只有fragment属性是必须的。

  invoke动作标签的属性:

  

属性

描述

fragment

要调用的fragment的名称。

var

用于保存片段主体内容的变量值,主体内容就会以java.lang.String的类型保存这个变量内。var和varReader属性只能出现一个。

varReader

用于保存标签主体内容的变量值,主体内容就会以java.io.Reader的类型保存这个变量内。var和varReader属性只能出现一个。

scope

变量保存到的作用域。

  接下来是关于invoke动作元素的例子:

  ① 创建一个.tag文件(如invokeDemo.tag)。

<%@ attribute name="productionDetails" fragment="true" %><%@ variable name-given="productName" %><%@ variable name-given="description" %><%@ variable name-given="price" %><% ???jspContext.setAttribute("productName", "Pelesonic DVD Player"); ???jspContext.setAttribute("description", "Dolby Digital output through coaxial digital-audio jack,"+ ???????"500 lines horizontal resoluction-image digest viewing"); ???jspContext.setAttribute("price", "65"); ???%><jsp:invoke fragment="productionDetails"></jsp:invoke>

  ② 创建一个.jsp文件(如invokeTest.jsp)。

<%@ page language="java" contentType="text/html; charset=UTF-8" ???pageEncoding="UTF-8"%><%@ taglib prefix="easy" tagdir="/WEB-INF/tags" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body> ???<easy:invokeDemo> ???????<jsp:attribute name="productionDetails"> ???????????<table width="220" border="1"> ???????????<tr> ???????????????<td><b>Product Name</b></td> ???????????????<td>${productName }</td> ???????????</tr> ???????????<tr> ???????????????<td><b>Description</b></td> ???????????????<td>${description }</td> ???????????</tr> ???????????<tr> ???????????????<td><b>Price</b></td> ???????????????<td>${price }</td> ???????????</tr> ???????????</table> ???????</jsp:attribute> ???</easy:invokeDemo></body></html>

  以上代码编写完之后,测试的结果是:

  好啦,以上就是关于JSP的标签文件,谢谢大家。

Servlet和JSP之标签文件学习

原文地址:https://www.cnblogs.com/NYfor2018/p/8464916.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved