当前位置:文档之家› JSP自定义标签

JSP自定义标签

JSP自定义标签
JSP自定义标签

一、基本概念:

1.标签(Tag):

标签是一种XML元素,通过标签可以使JSP网页变得简洁并且易于维护,还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素,所以它的名称和属性都是大小写敏感的

2.标签库(Tag library):

由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。

3.标签库描述文件(Tag Library Descriptor):

标签库描述文件是一个XML文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的。

4.标签处理类(Tag Handle Class):

标签处理类是一个Java类,这个类继承了TagSupport或者扩展了SimpleTag接口,通过这个类可以实现自定义JSP标签的具体功能

两种标签

可以定义两种类型的标签:

javax.servlet.jsp.tagext.Tag

javax.servlet.jsp.tagext.BodyTag

有标签体的标签必须实现BodyTag 接口。

body

也可能没有标签体:

无标签体的简单标签可以实现Tag 接口。

二、自定义JSP标签的格式:

1.

<% @ taglib prefix=”someprefix”uri=”/sometaglib” %>

为了使到JSP容器能够使用标签库中的自定义行为,必须满足以下两个条件:

1)从一个指定的标签库中识别出代表这种自定义行为的标签

2)找到实现这些自定义行为的具体类

第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(Taglib Directive's Prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如

jsp,jspx,java,servlet,sun,sunw(它们都是在JSP白皮书中指定的保留字)之类的前缀。

uri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位TLD文件。在TLD文件中可以找到标签库中所有标签处理类的名称

2. 当web应用程序启动时,容器从WEB-INF文件夹的目录结构的META-INF搜索所有以.tld结尾的文件。也就是说它们会定位所有的TLD文件。对于每个TLD文件,容器会先获取标签库的URI,然后为每个TLD文件和对应的URI创建映射关系。

在JSP页面中,我们仅需通过使用带有URI属性值的标签库指令来和具体的标签库匹配

三、自定义JSP标签的处理过程:

1.在JSP中引入标签库:

<% @ taglib prefix=”taglibprefix” uri=”tagliburi” %>

2.在JSP中使用标签库标签

3.Web容器根据第二个步骤中的prefix,获得第一个步骤中声明的taglib的uri属性值

4.Web容器根据uri属性在web.xml找到对应的元素(4、5两步可以不要)

5.从元素中获得对应的元素的值

/myTag

/WEB-INF/myTag.tld

对应tld文件中的指出tld文件的位置。

6.Web容器根据元素的值从WEB-INF/目录下找到对应的.tld文件

7.从.tld文件中找到与tagname对应的元素

8.从元素中获得对应的元素的值

9.Web容器根据元素的值创建相应的tag handle class的实例

10. Web容器调用这个实例的doStartTag/doEndTag方法完成相应的处理

四、创建和使用一个Tag Library的基本步骤:

1.创建标签的处理类(Tag Handler Class)

2.创建标签库描述文件(Tag Library Descrptor File)

3.在web.xml文件中配置元素

4.在JSP文件中引人标签库

五、创建标签库描述文件(Tag Library Descriptor):

1.标签库描述文件,简称TLD,采用XML文件格式,定义了用户的标签库。TLD文件中的元素可以分成3类:

A.:标签库元素

B.:标签元素

C.:标签属性元素

2.标签库元素用来设定标签库的相关信息,它的常用属性有:

A.shortname:指定Tag Library默认的前缀名(prefix)

B.uri:设定Tag Library的惟一访问表示符

3.标签元素用来定义一个标签,它的常见属性有:

https://www.doczj.com/doc/a48216343.html,:设定Tag的名字

B.tagclass:设定Tag的处理类

C.bodycontent:设定标签的主体(body)内容

(1)tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被

JSP容器解释,

如下:

select name,age from users

(2)JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指

令和动作。如:

<%=request.getProtocol()%> //②

(3)empty:空标记,即起始标记和结束标记之间没有内容。

下面几种写法都是有效的,

(4)scriptless:接受文本、EL和JSP动作。如上述②使用scriptless

则报错,具体可参考后面附源码。

4.标签属性元素用来定义标签的属性,它的常见属性有:

https://www.doczj.com/doc/a48216343.html,:属性名称

B.required:属性是否必需的,默认为false

C.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于< %=…% >的表达式

例子:WEB-INF\tlds\test.tld

xmlns:xsi="https://www.doczj.com/doc/a48216343.html,/2001/XMLSchema-instance"

xsi:schemaLocation="https://www.doczj.com/doc/a48216343.html,/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">

1.0

test //标签库名,也称为前缀。比如“c:out value=""/”里的“c” /WEB-INF/tlds/test //在jsp页面上引用的路径

out //定义标签的名例如“test:out value=""/”里的"out”, gdufs.tags.OutputTag //指出标签处理程序类记着带包名

empty //如果没有标签体,设置empty , 如果有标签休必须设置JSP

name //属性名字。例如test:out value=""/里的value。名字可任意取,只要类里提供相应的set方法即可。

false //是否必填属性

false //是否支持运行时表达式取值就是是否可以是${}方式传值。"

六、如何创建标签处理类:

1.引入必需的资源:

2.继承TagSupport类并覆盖doStartTag()/doEndTag()方法

TagSupport类简介:

1.处理标签的类必须扩展javax.servlet.jsp.TagSupport.

2.TagSupport类的主要属性:

A.parent属性:代表嵌套了当前标签的上层标签的处理类

B.pageContex属性:代表Web应用中的javax.servlet.jsp.PageContext对象,通过此对象可向jsp页

面中输出信息

3.JSP容器在调用doStartTag或者doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent。因此在标签处理类中可以直接访问pageContext变量

4.在TagSupport的构造方法中不能访问pageContext成员变量,因为此时JSP容器还没有调用setPageContext方法对pageContext进行初始化

七、TagSupport处理标签的方法:

1.TagSupport类提供了两个处理标签的方法:

public int doStartTag() throws JspException

public int doEndTag() throws JspException

2.doStartTag:但JSP容器遇到自定义标签的起始标志,就会调用doStartTag()方法。

doStartTag()方法返回一个整数值,用来决定程序的后续流程。

A.Tag.SKIP_BODY:表示?>…之间的内容被忽略

B.Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行

3.doEndTag:但JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag()方法也返回一个整数值,用来决定程序后续流程。

A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。

B.Tag_EVAL_PAGE:表示按照正常的流程继续执行JSP网页

例子:

package gdufs.tags;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.TagSupport;

public class OutputTag extends TagSupport {

private String name=null; //对应tld中属性,

public void setName(String name) {

https://www.doczj.com/doc/a48216343.html, = name;

}

public int doEndTag() throws JspException

{

try {

JspWriter out = pageContext.getOut(); //如何输出到jsp页面

out.print("Hello! " + name);

} catch (Exception e) { throw new JspException(e); }

return EVAL_PAGE; //EVAL_PAGE 表示tag已处理完毕,返回jsp页面

}

}

在jsp中使用自定义标签:

1.如果Web应用中用到了自定义JSP标签,则必须在web.xml文件中加入元素,它用于声明所引用的标签所在的标签库

/WEB-INF/ltds/test.tld

2.:设定Tag Library的惟一标示符,在Web应用中将根据它来引用Tag Libray

3.:指定和Tag Library对应的TLD文件的位置

4.在JSP文件中需要加入<% @ taglib% >指令来声明对标签库的引用。例如:

<% @ taglib prefix = “somePrefix” uri = "/someuri" %>

5.prefix表示在JSP网页中引用这个标签库的标签时的前缀,uri用来指定Tag Library的标识符

例子:test.jsp

<%@page contentType="text/html"%>

<%@page pageEncoding="UTF-8"%>

<%@ page language="java"%>

<%@ taglib uri="/WEB-INF/tlds/test.tld" prefix="t"%>

Test Tag:


标签后面的内容

八、BodyTagSupport处理标签的方法:

要开发带标签体的标签,可实现BodyTag接口,也可从BodyTag接口的实现类BodyTagSupport继承,为简化开发,推荐从BodyTagSupport类继承开发。

编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag(),他们执行顺序如下:

doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()

doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,如果返回EVAL_BODY_ INCLUDE 则继续执行;如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,而直接执行doEndTag()方法。

setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。

标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY,

EVAL_PAGE或SKIP_PAGE。如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。

【实例】开发带标签体的标签:bodyTag1

本实例将要开发一个带标签体的标签bodyTag1,这个标签有一个属性countNum,用于设置输出标签体内容的次数,输出内容为当前的系统时间。

(1)第一步:开发标签实现类。

BodyTag1.java

package body;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.BodyTagSupport;

public class bodyTag1 extends BodyTagSupport{

private int countNum=0;//循环显示时间的次数

private int currentNum=1;//当前执行次数

//----标签开始时调用此方法-------

public int doStartTag(){

try{

JspWriter out=pageContext.getOut();

out.print("标签开始了:
");

if(countNum>0)

return EVAL_BODY_TAG;

else

return SKIP_BODY;

}catch(Exception e){

System.out.println(e);

return SKIP_BODY;

}

}

//----标签体执行完后调用此方法----

public int doAfterBody(){

try{

JspWriter out=pageContext.getOut();

out.print("第"+currentNum+"次执行标签体。标签体执行完毕。
"); if(countNum>1){//如果还需要执行标签体

countNum--;

currentNum++;

return EVAL_BODY_TAG;

}else return SKIP_BODY;

}catch(Exception e){

System.out.println(e);

return SKIP_BODY;

}

}

//----标签结束时调用此方法-------

public int doEndTag(){

try{

JspWriter out=pageContext.getOut();

//----输出标签体的内容----

bodyContent.writeOut(bodyContent.getEnclosingWriter());

out.print("标签结束了。");

}catch(Exception e){

System.out.println(e);

}

return EVAL_PAGE;

}

public int getCountNum() {

return countNum;

}

public void setCountNum(int countNum) {

this.countNum = countNum;

this.currentNum=1;

}

}

执行标签体并不会直接输出标签体中的内容,因此本实例在doEndTag()方法中一次性把执行的结果输出。

(2)第二步:编写标签描述tld文件。

因为本章所有实例共用一个Web应用,故本例在myTag.tld文件中增加内容。在之间增加的内容如下:

bodyTag1

body.bodyTag1

jsp

countNum

true

true

对于属性countNum的声明中,设置为true,表示此属性为必输项;设置为true,表示标签体支持运行时的表达式取值,如果为false则表示标签体为一个静态文本,默认情况下设置为true。

(3)第三步:在Web应用的web.xml文件中声明标签库引用。(不是必须的)

/myTag

/WEB-INF/myTag.tld

(4)第四步:在JSP页面中声明并调用标签。

UseBodyTag1.jsp

<%@ taglib uri="/myTag" prefix="myTag" %>

<%@ page contentType="text/html;charset=GB2312" %>

<%@ page import="java.util.Date" %>

开发带有标签体的标签

下面是应用这个带有属性的自定义标签的结果:

现在的时间是:<%=new Date()%>

该程序的运行结果如图。

九、SimpleTag标签

JSP2.0中为了简化标签的复杂性,增加了制作Simple Tag的标签类SimpleTagSupport类。SimpleTagSupport 类是实现SimpleTag接口的。它只需要实现一个doTag()方法即可,而不需要一堆回传值例子:

1、处理类

package gdufs.tag;

import javax.servlet.jsp.tagext.SimpleTagSupport;

import javax.servlet.jsp.*;

import java.io.*;

public class SimpleHelloTag extends SimpleTagSupport{

public void doTag() throws JspException,IOException{

JspWriter out=this.getJspContext().getOut();

out.println("hello world");

}

}

package gdufs.tag;

import javax.servlet.jsp.*;

import java.io.*;

import javax.servlet.jsp.tagext.*;

public class SimpleTextProcessTag extends SimpleTagSupport{

//要处理标签体的文本内容,使用StringWriter

public void doTag() throws JspException,IOException{

//标签体内容

JspFragment frag=this.getJspBody();

JspWriter out=this.getJspContext().getOut();

StringWriter sout=new StringWriter();

//1.标签体的内容写到字符串输出流对象sout

frag.invoke(sout);

//2.获得标签体的文本内容

String msg=sout.toString();

//3.处理并输出(逗号转换成空格)

out.println(msg.replaceAll(","," "));

}

}

package gdufs.tag;

import javax.servlet.jsp.*;

import java.io.*;

import javax.servlet.jsp.tagext.SimpleTagSupport;

import javax.servlet.jsp.tagext.JspFragment;

public class SimpleTextTag extends SimpleTagSupport{

public void doTag() throws JspException,IOException{

//fragment封装了标签体

JspFragment fragment=this.getJspBody();

//将标签体的内容写到指定的输出流,null表示写入预设的getJspContext.getOut()取得的输出流对象

fragment.invoke(null);

}

}

2、tld文件

xmlns:xsi="https://www.doczj.com/doc/a48216343.html,/2001/XMLSchema-instance"

xsi:schemaLocation="https://www.doczj.com/doc/a48216343.html,/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"> 1.0

hello

/WEB-INF/tlds/hello

hello

gdufs.tag.SimpleHelloTag

empty

showBody

gdufs.tag.SimpleTextTag

tagdependent

processBody

gdufs.tag.SimpleTextProcessTag

tagdependent

3、jsp页面

SimpleTagSupport

<%--1.无标签体,输出字符串--%>



<%--2.包含标签体,显示标签体文本内容--%>

it is body content



<%--3.处理标签体文本内容--%>

hava,a,nice,day!!!

jsp-servlet题库(附答案)

1.B 编写一个Filter,需要() A. 继承Filter 类 B. 实现Filter 接口 C. 继承HttpFilter 类 D. 实现HttpFilter接口 2.D 自定义标签的配置文件放在________ A. WebRoot B. lib C. classes D. WEB-INF 3. ABC 有关会话跟踪技术描述正确的是( )(多选) A. Cookie是Web服务器发送给客户端的一小段信息,客户端请求时,可以读取该信息发送到服务器端。 B. 关闭浏览器意味着会话ID丢失,但所有与原会话关联的会话数据仍保留在服务器上,直至会话过期。 C. 在禁用Cookie时可以使用URL重写技术跟踪会话。 D. 隐藏表单域将字段添加到HTML表单并在客户端浏览器中显示。 4.C 在J2EE中,重定向到另一个页面,以下()语句是正确的 A. request . sendRedirect(“http :// www . svse . com . cn”); B. request . sendRedirect(); C. response . sendRedirect(“http: // www . svse . com . cn”); D. response .sendRedirect(); 5.B EL表达式,${10 mod 3},执行结果为( ) A. 10 mod 3 B. 1 C. 3 D. null 6. C 自定义标签的作用是( ) A. 编写和使用方便 B. 规定是这样的,如果不用,别人会说我们不专业 C. 可以减少jsp中的java代码,将代码与界面标签分离,简化前台开发 D. 连数据库 7.B request.getRequestDispatcher().forward(request,response)称之为( ) A. 流转 B. 转发 C. 重定向 D. 导航 8. BCD 有关Servlet的生命周期说法正确的有( ) (多选) A. Servlet的生命周期由Servlet实例控制。 B. init()方法在创建完Servlet实例后对其进行初始化,传递的参数为实现ServletContext 接口的对象。 C. service()方法响应客户端发出的请求。 D. destroy()方法释放Servlet实例。 9.B 在J2EE中,给定某Servlet的代码如下,编译运行该文件,以下陈述正确的是()。(选择一项) Public class Servlet1 extends HttpServlet{ public void init() throws ServletException{ } public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("hello!"); } A. 编译该文件时会提示缺少doGet()或者dopost()方法,编译不能够成功通过 B. 编译后,把Servlet1.class放在正确位置,运行该Servlet,在浏览器中会看到输出文字:hello!

在JSP中用自定义标签实现集合的遍历—山寨版cforeach

【文章标题】在JSP中用自定义标签实现集合的遍历——山寨版 【文章作者】曾健生 【作者邮箱】zengjiansheng1@https://www.doczj.com/doc/a48216343.html, 【作者QQ】190678908 ******************************************************************************* 在JSTL中,标签可方便地遍历集合或数组,在了解了自定义标签后,可动手实现标签的功能。 在编写自定义标签前,总要把实验环境搭建好^-^ 首先,定义一个Person类,在实验的集合中就是存放这个类的实例,代码如下:package com.javaeye.newjueqi; /** *实验类Person */ public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { https://www.doczj.com/doc/a48216343.html, = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 既然是遍历集合,那么集合也是必须的,我们在测试页面TestMyELTag.jsp上写下如下的JSP代码,生成一个测试用途的集合ArrayList,集合中有三个元素 <% //第1个人对象 Person p1=new Person(); p1.setName("Tom"); p1.setAge(23); //第2个人对象 Person p2=new Person(); p2.setName("Mike");

JSP的3个编译指令、7个动作指令

JSP的3个编译指令、7个动作指令 3个编译指令:page、include、taglib JSP的编译指令是通知JSP引擎(Tomcat、WebLogic)的消息,它不直接生成输出。 JSP引擎的工作原理: 当一个JSP页面第一次被访问的时候,JSP引擎将执行以下步骤: (1)将JSP页面翻译成一个Servlet,这个Servlet是一个java文件,同时也是一个完整的java程序 (2)JSP引擎调用java编译器对这个Servlet进行编译,得到可执行文件class (3)JSP引擎调用java虚拟机来解释执行class文件,生成向客户端发送的应答,然后发送给客户端 以上三个步骤仅仅在JSP页面第一次被访问时才会执行,以后的访问速度会因为class文件已经生成而大大提高。当JSP引擎街道一个客户端的访问请求时,首先判断请求的JSP页面是否比对应的Servlet新,如果新,对应的JSP需要重新编译。 编译指令都有其默认值,因此无须为每个指令设置其值。 常见的编译指令有3个: (1)、page:是针对当前页面的指令; (2)、include:用于指定包含另一个页面; (3)、taglib:用于定义和访问自定义标签。 使用编译指定的语法格式如下: <%@ 编译指令名属性1="属性值" 属性2="属性值" ...%>

1、page指令: 是针对当前页面的指令,通常位于JSP页面的顶端,一个JSP页面可以使用多page指令。 常用的page指令如下的格式: <%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <%@ page import="java.sql.*" %> 常用的page的属性如下: (1)、contentType:用于设定生成网页的文件格式和编码字符集,即MIME类型和页面字符集类型,默认MIME类型是text/html,默认的字符集类型 为:ISO-8859-1; (2)、language:声明当前JSP页面使用的脚本语言的种类,因为页面是JSP页面,所以该属性的值通常都是java。 (3)、errorPage:指定错误处理页面,如果本页面产生了异常或者错误,而该页面没有对应的处理代码,则会自动调用该属性指定的JSP页面; (4)、pageEncoding:指定生成网页的编码字符集; (5)、import:用于导入包。下面几个包是默认自动导入的,不需要显示导入。默认导入的包有:https://www.doczj.com/doc/a48216343.html,ng.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*; 2、include指令: 语法格式为:<%@ include file="要包含的页面路径" %> jsp中有两种包含模式,一种是<%@ include file="要包含的页面路径" %>,这种叫静态包含; 另一种是 ,这叫做动态包含。

java笔试题127

选择器 第1题. 编写一个Filter,需要() A. 继承Filter 类 B. 实现Filter 接口 C. 继承HttpFilter 类 D. 实现HttpFilter接口 正确答案为:B 第2题. 自定义标签的配置文件放在________ A. WebRoot B. lib C. classes D. WEB-INF 正确答案为:D 第3题. 在J2EE中,重定向到另一个页面,以下()语句是正确的 A. request . sendRedirect(“http :// www . svse . com . cn”); B. request . sendRedirect(); C. response . sendRedirect(“http: // www . svse . com . cn”); D. response .sendRedirect(); 正确答案为:C 第4题. 自定义标签的作用是 A. 编写和使用方便 B. 规定是这样的,如果不用,别人会说我们不专业 C. 可以减少jsp中的java代码,将代码与界面标签分离,简化前台开发 D. 连数据库 正确答案为:C 第5题. request.getRequestDispatcher().forward(request,response)称之为 A. 流转 B. 转发 C. 重定向 D. 导航 正确答案为:B

第6题. 在J2EE中,给定某Servlet的代码如下,编译运行该文件,以下陈述正确的是()。(选择一项) Public class Servlet1 extends HttpServlet{ Publicvoid init() throws ServletException{ } Publicvoid service(HttpServletRequest request,HttpServletResponse response) ThrowsServletException,IOException{ PrintWriterout = response.getWriter(); out.println(“hello!”); } } A. 编译该文件时会提示缺少doGet()或者dopost()方法,编译不能够成功通过 B. 编译后,把Servlet1.class放在正确位置,运行该Servlet,在浏览器中会看到输出文字:hello! C. 编译后,把Servlet1.class放在正确位置,运行该Servlet,在浏览器中看不到任何输出的文字 D. 编译后,把Servlet1.class放在正确位置,运行该Servlet,在浏览器中会看到运行期错误信息 正确答案为:B 第7题. 在Servlet中,response.getWriter()返回的是____________ A. JspWriter对象 B. PrintWriter对象 C. Out对象 D. ResponseWriter对象 正确答案为:B 第8题. 在web.xml中使用___________标签配置过滤器 A. B. C. D. 正确答案为:A 第9题. 自定义标签的描述文件在web.xml中配置正确的

JavaEE自定义标签(DOC)

JavaEE自定义标签:标签类的创建、tld配置文件的创建(位置、如何创建)、Web-XML配置、JSP应用 1、标签 以类似于html标签的方式实现的java代码的封装。 第一:形成了开发标签的技术标准---自定义标签的技术标准。 第二:java标准标签库(sun之前自己开发的一系列的标签的集合)jstl,以及表达式语言E L。 2、自定义标签 (1)理解: 可以允许用户自己根据自己的需要,去开发自己的标签的技术规范。 通俗:在Jsp页面上,以简单的标签封装java代码的操作。 //在自定义标签类中,先调用setPageContext()实例化内置对象: //然后是doStartTag()方法,核心代码放在这个方法里面:

//定义变量,变量的Get、Set方法: private String UserName = "";

//tld配置文件放置在WEB-INF目录下,主要的标记如下,主要的配置如下: //前面tlib-version版本号、Jsp-version JSP的版本号、short-name 命名空间、是必须有的 //uri,注意是uri而不是url,url是访问的路径。 //而uri为访问时候的别名,写在JSP页面上的标签的别名。 //name为此标签类的别名,tag-class 为标签类的存放的物理路径 //body-content 为是否有标签体,如果是/子关闭标签设置为EMPTY //如果涉及到标签属性,可以设置attribute,其中name为属性的名称,而不是别名,required 属性是否必须设置,rtexprvalue 是否程序运行时候为属性赋值。 //如果在tld文件中不设置uri,则在web-xml中必须对talib-uri进行设置。

自定义标签库

JSP标签库(也称自定义库)可看成是一套产生基于XML脚本的方法,它经由JavaBeans来支持。在概念上说,标签库是非常简单和可以重用的代码构造。 自定义标签有着丰富的特点,它们可以: 1.可以通过调用页面传递的属性进行自定义; 2.可以访问对于JSP页面可能的所有对象; 3.可以修改由调用页面产生的响应。 4.可以相互间通信。你可以创建并初始化一个JavaBean组件,创建一个变量引用标签中的bean,接着在其它的标签中引用该bean. 5.可以在一个标签中嵌套另一个,可以在JSP页面中进行复杂的交互。自定义标签为在JSP项目中创建易于重用的代码打开了一扇大门。你所需要的只是标签库和它的文档说明。 通过实现接口或者继承现有的类,我们就可以开发自定义的标签。常用的接口有:

TagSupport类 该类是IterationTag的缺省实现。除了实现原有方法外,本身还增加了一些有用的其他方法和成员变量。下表列出其中重要的几个:

BodyTagSupport类 该类同时继承了TagSupport类,并实现BodyTag接口。除了前表所示方法,该类还提供了一些其它方法便于使用。 实现Tag接口 所有的标签处理器都需要间接或直接的实现这个接口。 下面列出Tag接口定义的方法和常量:

setPageContext()方法 setPageContext()方法是一个定制标签声明周期内第一个要被调用的方法。完整写法是: public void setPageContext(PageContext); jsp引擎会将jsp页转换时隐含创建的pageContext对象,作为参数,调用setPageContext方法。 通常的做法会将这个参数保存为本标记处理器的参数。 setParent()和getParent()方法 当标签嵌套使用时,外层的标签被成为父标签,内部的被称为子标签。完整的写法是: public void setParent(Tag); public Tag getParent(); 其中setParent方法对父标签对象进行设置。而getParent方法用以获得父标签对象。

JSP课后习题答案

JSP课后习题答案 单元3 课本60页课后练习 填空题 1、tomcat服务器的默认端口是:8080 2、静态网页的内容是相对固定的,而动态网页的内容是随着访问时间的访问者发生变化。(填:动态网页或静态网页) 3、在tomcat成功安装和启动后,可以在浏览器中输入http://localhost:8080来测试安装配置是否正常。 4、在WEB-INF下必须有一个XML文件是web.xml 选择题 1、B 2、D 3、A 4、D 单元4 课本87页课后练习 填空题 1、脚本程序是一段在客户端请求时需要先被服务器执行的java 代码,它可以产生输出,同时也是一段流控制语句。 2、在jsp的3种指令中,用来定义与页面相关的指令是Page指令;用于在jsp页面中包含另一个文件的指令是Include指令(静态包含);用来定义一个标签库以及其自定义标签前缀的指令是Taglib指令。 3、动作元素允许在页面被请求时包含一些其他资源,如一个静态的HTML文件和动态的JSP文件。

4、Page指令的MIME类型的默认值为text/html,默认字符集是iso-8859-1 。 5、Jsp的隐藏注释格式为<%-- --%>或者<%--comment--%> Jsp的输出注释的格式是。 选择题 1、A 2、A 3、D 4、C 5、B 6、D 简答题(答案在课本79页) 请查阅资料并结合课堂上所讲内容,阐述include静态包含和动态包含指令的区别。 答:动态include指令是在执行时才将对包含的文件进行处理,要进行编译,可以带参数;静态的include的指令是简单的将两个文件进行合并,使其成为一个新的文件。 单元5 课本130页课后练习 填空题 1、在jsp内置对象中,用于请求相关的对象是Request对象。该对象可以使用getParameter(String s)方法来获取表单元素提交的信息。 2、Response对象中用来动态改变contentType 实型的方法是setContentType() 3、Session对象封装了属于客户会话的所有信息,该对象可以使用setAttribute()方法来设置指定名字的属性。

自定义标签(Custom Tag)

一、概述 JSP中有一块重要的技术:自定义标签(Custom Tag),最近这几天在学习Struts的时候发现Struts中使用了很多自定义标签,如html、bean等。所以我就做了个简单的试验,学习一下这种技术。 首先介绍一下这种技术吧! 1.优点: 取代了JSP中的Java程序,并且可以重复使用,方便不熟悉Java编程的网页设计人员。 2.开发流程: (1)编写JSP,在JSP中使用自定义标签。 (2)在web.xml中指定JSP中使用的标签的.tld(标签库描述文件)文件的位置。 (3) .tld文件中指定标签使用的类。 3. 自定义标签的分类: (1)简单标签:如< mytag:helloworld/> (2)带属性标签:如”/> (3)带标签体的标签: 在自定义标签的起始和结束标签之间的部分为标签体(Body)。Body的内容可以是JSP中的标准标签,也可以是HTML、脚本语言或其他的自定义标签。 ”> (4)可以被Script使用的标签: 定义了id和type属性的标签可以被标签后面的Scriptlet使用。 <%oraDB.getConnection(); %> 4.接口及其他

jsp自定义标签实例

jsp自定义标签实例 JSP自定义标签。在自定义标签的起始和结束标签之间的部分为标签体(Body)。 标签处理程序类:定义标签的行为,并在JSP引擎遇到自定义标签时调用执行。 标签库描述符(TLD)文件:描述标签库的XML文档,向JSP引擎提供有关自定义标签的标签处理程序的信息。tag标签相关属性:实现简单标签处理程序标签处理程序是一个在运行时调用的Java类,它包含在JSP文件中使用的自定义标签的实现代码.标签处理程序必须实现或扩展javax.servlet.jsp.tagext包中的类和接口.javax.servlet.jsp.tagext含有允许标签处理程序类与JSP容器通信的接口和类。 最近在项目中要用到这种技术,所以自己就写一个经典的HelloWorld实例:其实对自定义标签已经早有接触了(Struts中使用了很多自定义标签,如html、bean等)使用这种技术的优点:取代了JSP中的Java程序,并且可以重复使用,方便不熟悉Java编程的网页设计人员。 实现步骤: 首先启动eclipse,新建一个web项目(废话...) 1、修改web.xml文件,增加自定义标签支持。 Java代码 2、创建标签库TLD文件tlds\helloworld.tld 。 Java代码 这里注意:web.xml和xxx.tld这两个XML文件的头信息的版本匹配很重要,否则会导致页面报错找不到标签。

3、创建标签处理程序类HelloWorldTag(重写doStartTag和doEndTag方法)。 Java代码 补充: doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与 SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字。 doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE与SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页。 doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与 SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步。 EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用。 EVAL_PAGE:继续处理页面,doEndTag()函数可用。 SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用。 SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用。 EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法。

自定义标签的整理(新手教程)

在J2EE项目中,JSP页面常常通过在静态页面模板中嵌入scriptlets来插入动态的内容。 然而,随着复杂程序的增加,JSP页面也变得难于管理。虽然用这种方法开发小形项目唾手可得, 但是scriptlets仍然要面对下面的不利情况: Scriptlet难于阅读和修改。带有Scriptlets的JSP 页面混合了两种语言,这使得阅读和维护变得很困难。 Scriptlets鼓励了将数据表现和逻辑处理的混合。JSP 页面主要功能是数据表现而不是逻辑处理。逻辑处理属于Java类的工作,他们应该由程序员维护并能够重用。 Scriptlets不能够被重用。当scriptlets被重用时,常常是鼓励拷贝-粘贴来达到重用的效果,这是一种危险的维护方法。每一次你拷贝-粘贴scriptlets时,将有更多行多余的代码需要维护。 Scriptlets的参数很难进行确定传递. 无论如何,绝大数人简单的拷贝,粘贴、编辑或者类似的增加,使得大部份的多余的代码需要更多的维护。 与其创建充满了scriptlets的巨大的JSP页面,不如考虑使用用户自定义标签。用户自定义标签允许你创建、在JSP中使用你自己定义的类HTML标签。每当JSP引擎遇到用户自定义标签时,就会自动查找标签处理类,并自动调用他。页面中的自定义标签将会被票签处理类的输出所代替。这就

使得JSP页面不用直接在页面写Java代码,就可以指定生成动态的内容的。 用户自定义标签为你的网页设计提供了N种好处:他提高了页面代码的可读性。页面设计人员而不是程序员,能够使用很比使用Scriptlets更容易的使用标签。维护代码的程序员也只需个性标签库面不是JSP页面,这样他就不要再冒着破坏页面美观的风险。在使用标签的每一处,增强或者固定的标签改变了标签了的表现。标签比Scriptlets更容易确定参数,因为他会被作为一种属性或者在标签体内被传达。最后,标签比Scriptlets高度的可重用性,因为你可以创建共享的、可重用的自定义标签库。 JSTL提供的就是这种标准的自定义标签集。 让我们通过看一个简单的JSP页面例子,来看看如何使用自定义标签。下面这个页面使用scriptlet来得到数据: <%@ page import="java.text.SimpleDateFormat" %> <%@ page import="java.util.Date" %> Sample JSP

The date and time at the server are: <% String sformat = "EEEE, d MMMM yyyy 'at' kk:mm:ss z"; SimpleDateFormat format = new SimpleDateFormat(sformat); Date date = new Date(); String sdate = format.format(date); out.print(sdate); %>

JSP自定义标签详细

JSP标签库 在这篇文章中,我们主要讨论: ·什么是自定义tag标签? ·怎么使用tag标签? o 声明要使用的tag库 o 找到与之对应的tag处理类 o tag标签的类型 ·自定义tag标签 o tag处理类 o tag库描述 o tag标签示例 o 带属性的tag o 带body的tag o 定义了脚本变量的tag o 具有协作关系的tag ·自定义tag标签 o 一个迭代tag的例子 o 一个模板tag库 o tag处理类到底是怎样被调用的? 什么是自定义的tag? 一个自定义的tag标签是用户定义的一种JSP标记。当一个含有自定义的tag标签的JSP页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为tag处理类的对象进行的操作。于是当JSP页面被jsp 引擎转化为servlet后,实际上tag标签被转化成为了对tag处理类的操作。 自定义tag标签有很多特色,诸如: ·可以在JSP页面中自定义tag标签的属性 ·访问JSP页面中的所有对象 ·可以动态地修改页面输出 ·彼此这间可以相互通信。你可以先创建一个JavaBeans组件,然后在一个tag中调用此JavaBeans 组件,同时可以在另一个tag中调用它。 ·tag允许相互嵌套,可以在一个JSP页面中完成一些复杂的交互。 使用tag标签 本节主要描述怎样在JSP页面中使用tag标签,以及tag标签的不同类型。 要使用tag标签,JSP程序员必须做2件事: ·声明此tag标签的tag库 ·实现此tag标签 声明tag标签所在的tag库 如果要使用tag标签,则应用JSP的taglib指示符来指定其tag库(注意:taglib要在在使用此tag标

jsp页面符号指令

JSP页面的<%@ ...%> 这表示是指令,主要用来提供整个JSP网页相关的信息,并且用来设定JSP 网页的相关属性。例如:网页的编码方式、语法、信息等。 起始符号为:<%@ 终止符号为:%> 目前有三种指令:page、include和taglib,每一种指令都有各自的属性。 page指令是最复杂的JSP指令,它的主要功能为设定整个JSP网页的属性和相关功能。 include指令表示:在JSP编译时插入一个包含文本或代码的文件,这个包含的过程是静态的,而包含的文件可以是JSP网页、HTML网页、文本文件,或是一段Java程序。 taglib指令能够让用户自定义新的标签。 JSP页面的<% ...%> jsp中如果要写java代码就要用<% %>来给括起来。 这是jsp的语法格式,此外还有很多,如: jsp指令<%@ %> jsp声明<%! %> jsp表达式<%= %> jsp注释<%-- --%> jsp里的java代码<%java代码%> request的常用方法 request.getSchema()可以返回当前页面使用的协议,http 或是https; request.getServerName()可以返回当前页面所在的服务器的名字; request.getServerPort()可以返回当前页面所在的服务器使用的端口,就是8080;

request.getContextPath()可以返回当前页面所在的应用的名字。 清除浏览器中的缓存 清除浏览器中的缓存,三行语句合起来用,就可以使你再次进入曾经访问过的页面时,ie浏览器必须从服务端下载最新的内容,达到刷新的效果。meta是用来在HTML文档中模拟HTTP协议的响应头报文。meta 标签用于网页的与中。 是用于设定禁止浏览器从本地机的缓存中调阅页面内容,设定后一旦离开网页就无法从Cache中再调出;

JSP考试题

针对以下题目请选择正确的答案 1)在JSP中,要定义一个方法,需要用到以下()元素。(选择一项)a) <%= %> b) <% %> c) <%! %> d) <%@ %> 2)JSP页面经过编译之后,将创建一个()。(选择一项) a) applet b) servlet c) application d) exe文件3)当JSP页面执行自定义标签,遇到结束标签时将调用()方法执行处理。 a) doStartTag() b) doEndTag() c) doInitBody() d) doAfterBody() 4) 在J2EE中,test.jsp文件中有如下一行代码:(选择一项) 要使user对象中一直存在于对话中,直至其终止或被删除为止,下划线中应填入()。 a) page b) request c) session d) application 5) 在J2EE中,以下不是JSP隐式对象的是()。(选择一项) a) pageContext b) context c) application d) out 6) Servlet中,HttpServletResponse的()方法用来把一个Http请求重定向到另外的URL。(选择一项) a) sendURL() b) redirectURL() c) sendRedirect() d) redirectResponse() 7) 在JSP中,page指令的()属性用来引入需要的包或类。 a) extends b) import c) languge d) contentType

jsp简答题

1.JSP的特点及工作原理(执行过程) JSP运行原理解释:JSP 的执行过程主要包括以下步骤: 1.客户端发出Request请求; 2.JSP 容器将JSP 转译成Servlet 的源代码; 3.将产生的Servlet 的源代码经过编译后,并加载到内存执行; 4.把结果Response 响应至客户端。 5. JSP页面首次访问速度慢,之后访问速度快(直接将内存中首次加载的结果返回) 2.JSP指令标签有哪些及作用 指令标记是为JSP引擎而设计的,它向JSP引擎发送消息,告诉引擎如何处理其余JSP页面,它并不会直接产生任何看得见的输出。 指令的语法形式为:<%@ 指令%> 指令主要包括:page 指令、include 指令和taglib指令。 (1<%@page %>指令用来设置整个JSP页面的相关属性和功能 page指令可以在JSP页面的任何地方、以任何顺序出现,而且一个页面可以包含任意数量的page指令。 为了程序的可读性以及好的编程习惯,最好还是把它放在JSP页面的顶部。 (2 include指令的语法形式为: <%@ include file="relativeURL" %> 该指令的作用是在JSP页面中该指令出现的位置静态插入一个文件。 所谓静态插入,是指当前的JSP页面和被嵌入的文件合并成一个新的JSP页面,然后JSP 引擎再将这个新页面转换成Servlet。 include指令能让页面内容分成几个组成部分分别管理。实现多个文件共享同一个文件。(3taglib指令:代码复用是衡量软件可维护性的重要标志之一。 一个web应用中可能有许多JSP页面需要使用某些相同的信息 JSP页面可以通过自定义标记使用一种特殊的文件Tag文件(标记文件),将需要重复使用的代码编写成Tag文件就可以实现代码复用 Tag文件的结构和JSP文件相同,只是文件扩展名为.tag 3.在JSP文件中注释种类及区别 (1)客户端注释使用HTML标签“”创建的 语法形式: 客户端注释类似于普通的HTML注释,唯一的不同在于,可以在这种JSP注释中加入特定

JSP的三大指令 七大动作 九大对象

JSP的三大指令七大动作九大对象 JSP的三个编译指令 Page:该指令是针对当前页面的指令<%@ page [Attribute="Value"] %> language:声明当前jsp页面使用的脚本语言的种类,通常是java,默认是java,无需设置 extends:指定jsp编译产生的类继承的父类,或者实现的接口 import:用于导入包,默认已经导入的包有 https://www.doczj.com/doc/a48216343.html,ng.*,javax.servlet.*,javax.servlet.jsp.*,javax.servlet.http.* session:设定这个jsp页面是否需要HttpSession buffer:指定输出缓冲区的大小 autoflush:当缓冲区即将溢出时,是否自动强制输出缓冲区的内容 info:设置该JSp程序的信息,采用Servlet.getServletInfo()获取该值 errorPage:指定错误处理页 isErrorPage:设置本JSp是否为错误处理程序 ContentType:用于设定生成网页的文件格式和编码格式 include:用于指定包含另一个页面<%@include file="path"%> taglib:用于定义和访问自定义标签 JSP的7个动作指令 jsp:forward 执行页面转向,将请求的处理交给下一个页面 常和param指令一起 jsp:param 用于传递参数,必须与其他支持参数的标签一起使用 jsp:include 用于动态引入一个jsp页面 也可以在标签内向引用页面传递param jsp:plugin 用于下载javaBean 或Applet到客户端执行 jsp:useBean 创建一个javaBean实例 scope属性:page:该javaBean实例仅在本页面有效 request: 仅本次请求有效 session:在本次session有效

JSP技术基础习题

第一章 JSP技术基础习题 一、选择题 1.当用户请求jsp页面时,JSP引擎就会执行该页面的字节码文件响应客户的请求,执行字节码文件的结果是() A)发送一个JSP源文件到客户端 B)发送一个Java文件到客户端 C)发送一个HTML页面到客户端 D)什么都不做。 2.当多个用户请求同一个JSP页面时,Tomcat服务器为每个客户启动一个()A)进程 B)线程 C)程序 D服务。 3.下列动态网页和静态网页的根本区别描述错误的是。() A)静态网页服务器端返回的HTML文件是事先存储好的 B)动态网页服务器端返回的HTML文件是程序生成的。 C)静态网页文件里只有HTML标记,没有程序代码。 D)动态网页中只有程序,不能有HTML代码。 4.不是JSP运行必须的是() A)操作系统 B)JavaJDK C)支持Jsp的Web服务器 D)数据库 5.URL是Internet中资源的命名机制,URL由三部分构成。() A)协议、主机DNS名或IP地址和文件名 B)主机、DNS名或IP地址和文件名、协议 C)协议、文件名、主机名 D)协议、文件名、IP地址 6.下列说法哪一项是正确的() A)Apache用于ASP技术所开发网站的服务器 B)IIS用于CGI技术所开发网站的服务器 C)Tomcat用于JSP技术所开发网站的服务器 D)WebLogic用于PHP技术所开发网站的服务器 7.Tomcat服务器的默认端口号是:() A)80 B)8080 C)21 D)2121 二、判断题 1.动态网页和静态网页的根本区别在于服务器端返回的HTML文件是事先存储好的还是由动态网页程序生成的。() 2.Internet和intranet的含义意义相同。() 3.互联网起源于美国国防部高级研究计划管理局建立的ARPA网。() 4.Web开发技术包括客户端和服务器端的技术。() 5.Tomcat和JDK都不是开源的。()

详细介绍JSP技术的两种架构模型

JSP和JavaBean模型将页面显示和业务逻辑处理分开。JSP实现页面显示,JavaBean对象用来保存数据和实现商业逻辑。 运用JSP/Servlet实现的web动态交互,主要采用JSP和JavaBean模型还有JSP和JavaBean+Servlet模型。本文分别介绍这两种模型,并比较它们的优缺点。 一。JSP和JavaBean模型 模型的结构如下图所示,称之为JSP和JavaBean模型。其工作原理是:当浏览器发出请求时,JSP接收请求并访问JavaBean.若需要访问数据库或后台服务器,则通过JavaBean 连接数据库或后台服务器,执行相应的处理。JavaBean将处理的结果数据交给JSP.JSP提取结果并重新组织后,动态生成HTML页面,返回给浏览器。用户从浏览器显示的页面中得到交互的结果。 JSP和JavaBean模型充分利用了JSP技术易于开发动态网页的特点,页面显示层的任务由JSP(但它也含事物逻辑层的内容)承担,JavaBean主要负责事务逻辑层和数据层的工作。JSP和JavaBean模型依靠几个JavaBean组件实现具体的应用功能,生成动态内容,起最大的特点就是简单。 二。JSP和JavaBean+Servlet模型 JSP和JavaBean+Servlet模型的体系结构如下图所示,称之为JSP和JavaBean和Servlet 模型。它是一种采用基于模型视图控制器(Model和View和Controller)的设计模型,即MVC模型。 该模型将JSP程序的功能分为3个层次:Model(模型)层、View(视图)层、Controller (控制器层)。Model层实现业务逻辑,包括了Web应用程序功能的核心,负责存储与应用程序相关的数据;View层用于用户界面的显示,它可以访问Model层的数据,但不能更改这些数据;Controller层主要负责Model和View层之间的控制关系。 具体实现时,JavaBean作为模型层,Servlet作为控制层,JSP作为视图层。每层的作用如下: 1.JavaBean作为Model层,实现各个具体的应用逻辑和功能。 2.Servlet作为Controller层,负责处理HTTP请求,包括: 对输入数据的检查和转换。 通过JavaBean访问数据库。 初始化JSP页面中要用到的JavaBean或对象。 根据处理中不同的分支和结果,决定转向那个JSP等。 3.JSP作为View层,负责生成交互后返回的界面。它主要通过信息共享,获取Servlet生成的对象或JavaBean,从中取出数据,插入到HTML页面中。 该模型的工作原理是:所有的请求都被发送给作为控制器的Servlet.Servlet接收请求,并

TLD文件配置详解jsp自定义标签

TLD文件配置详解(jsp自定义标签) TLD文件配置详解 write org.apache.struts.taglib.bean.WriteTag empty bundle false true 其中: write:这个Tag的名字 org.apache.struts.taglib.bean.WriteTag:这个Tag 是由那个类实现的(这个class可以在struts.jar包中找到) empty:这个Tag可以直接结尾,不需要填写内容 这里bodycontent有三个可选值 jsp 标签体由其他jsp元素组成 如果其有jsp元素,那么标签会先解释,然后将元素的实际值传入。比如标签体里含有<%=attributeName%>这样子的jsp元素,此时标

签会按attributeName的实际值是什么就传入什么。这个是最常用的一个。 empty 标签体必须为空 在引用这个Tag的时候,可以,而不必 tagdependent 由标签解释,不带jsp转换 这里标识的是这个Tag的一个参数 bundle这个参数的名字 false这个参数是否是必填相 如果为true则必须写这个参数,否则会报错 true是说这个标签的值可以写入 rtexprvalue:"RUN-TIME EXPRESSION VALUE",是否可以动态赋值,在jsp中如value="<%=attributeName%>"

相关主题
文本预览
相关文档 最新文档