JSP自定义标签入门学习_JSP编程

本文为大家分享了JSP自定义标签入门学习教程,希望大家喜欢。

1.JSP自定义标签:

自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面。 JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记。你可以继承SimpleTagSupport类并重写的doTag()方法来开发一个最简单的自定义标签。

2.开发自定义标签

下面的步骤建立一个自定义标签用于战术客户端的ip地址:

编写一个普通的java类,继承SimpleTagSupport类,

public class ShowIp extends SimpleTagSupport {
/**
 * 以下屏蔽的代码在SimpleTagSupport代码中已经做了!这里不需要重复再做!
 */
/*private JspContext context;
*//**
 * 传入pageContext
 *//*
@Override
public void setJspContext(JspContext pc) {
 this.context = pc;
}*/
@Override
public void doTag() throws JspException, IOException {
 PageContext pageContext=(PageContext)this.getJspContext();
 ServletRequest request = pageContext.getRequest();
 String ip=request.getRemoteHost();
 JspWriter out = pageContext.getOut();
 out.write("使用自定义标签展示客户ip地址"+ip);
 List<String> a=null;
}
}

在web项目的WEB-INF目录下建立mytaglib.tld文件,这个tld叫标签库的声明文件。(参考核心标签库的tld文件)

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<description>A tag library exercising SimpleTag handlers.</description>
<!-- 标签库的版本 -->
<tlib-version>1.0</tlib-version>
<!-- 标签库前缀 -->
<short-name>rlovep</short-name>
 <!-- tld文件的唯一标记 -->
 <uri>http://rlovep.com</uri>
 <!-- 定义标签,标签要放在方法前面 -->
 <tag>
 <!-- 标签名 -->
 <name>showIp</name>
 <!-- 标签处理类 -->
 <tag-class>com.rlovep.tags.ShowIp</tag-class>
 <body-content>empty</body-content>
 </tag>
 <tag>
</taglib>

在jsp页面的头部导入自定义标签库:url为你在tld中写的url,前缀也是你在tld文件中定义的

<%@ taglib uri="http://rlovep.com" prefix="rlovep" %>

在jsp中使用自定义标签

<%-- 测试简单的自定义标签,标签体(我是你)不显示 --%>
<rlovep:showIp>我是你
</rlovep:showIp>

3.自定义标签的执行过程

当访问:http://localhost:8080/stuJsp/Hellotags.jsp 时;要重启Tomcat使服务器启动时,加载每个web应用的WEB-INF目录下的所有文件!!!例如。web.xml, tld文件!!!
步骤如下:

  • 检查jsp文件的taglib指令,是否存在一个url为http://rlovep.com的tld文件。如果没有,则报错。
  • 执行jsp文件的转化:把jsp文件翻译成java源文件->编译class->构造类对象->调用_jspService()方法
  • 读到到mytaglib.tld文件中查询是否存在为showIp的标签
  • 找到对应的标签,则读到内容,得到com.rlovep.tags.ShowIp
  • 构造ShowIp对象,然后调用ShowIp里面的方法:dotag方法;

4.访问标签体

你可以像标准标签库一样在标签中包含消息内容。如我们要在我们自定义的中包含内容

格式如下:

<rlovep:showIp>我是你
</rlovep:showIp>

但要文字显示需要修改处理类和tld文件:
修改处理类在doTag方法中增加如下内容:

JspContext jspContext2 = this.getJspContext();
//显示标签体的两种方法
//方法1直接调用
//jspBody.invoke(null);
//方法2通过输出到out
//jspBody.invoke(jspContext2.getOut());

修改tld文件:

 <tag>
 <!-- 标签名 -->
 <name>showIp</name>
 <!-- 标签处理类 -->
 <tag-class>com.rlovep.tags.ShowIp</tag-class>
 <!-- 输出标签体的内容格式标签体不可以写jsp的java代码 -->
 <body-content>scriptless</body-content>
 </tag>

现在你可以将标签体的内容显示了;

<%-- 标签提会显示 --%>
<rlovep:showIp>我是你
</rlovep:showIp>

输出标签体的内容格式:
JSP: 在传统标签中使用的。可以写和执行jsp的java代码。
scriptless: 标签体不可以写jsp的java代码
empty: 必须是空标签。
tagdependent : 标签体内容可以写jsp的java代码,但不会执

5.给标签体带属性:

你可以在自定义标准中设置各种属性,要接收属性,值自定义标签类必须实现setter方法;

格式如下:

<!-- 测试带属性的标签,标签体显示通过类处理 -->
<rlovep:AttributeTags name="peace" value="12345

定义属性步骤如下:
编写处理类:AttributeTags extends SimpleTagSupport

添加俩个属性:
//声明属性的成员变量
private Integer value;
private String name;
并为两个成员属性写setter方法;
public void setValue(Integer value)
public void setName(String name)

在标签库文件tld注明此标签和属性:

<!-- 标签名 -->
 <name>AttributeTags</name>
 <!-- 标签处理类 -->
 <tag-class>com.rlovep.tags.AttributeTags</tag-class>
 <!-- 输出标签体的内容格式标签体不可以写jsp的java代码 -->
 <body-content>scriptless</body-content>
 <!-- 配置属性name -->
 <attribute>
 <name>name</name>
 <!-- 是否必填 -->
 <required>true</required>
 <!-- 是否支持EL表达式 -->
 <rtexprvalue>true</rtexprvalue>
 </attribute>
 <!-- 配置属性value -->
 <attribute>
 <name>value</name>
 <!-- 是否必填 -->
 <required>true</required>
 <!-- 是否支持EL表达式 -->
 <rtexprvalue>true</rtexprvalue>
 </attribute>
 </tag>

现在就可以用带属性的标签了
在tld配置属性时你可以配置下面的属性:

6.带有子标签的自定义标签:

就像核心标签库的choose标签一样我们也可以定义嵌套的自定义标签,这部分我们主要讲解自己创建一个类似核心标签库的choose标签。步骤如下:

建立处理类,处理类还是与前面一样的方法。需要介绍的是用到了一个getParent()方法,从名字上就可以知道是为了获得父标签,对就是获得父标签类;
建立三个处理类文件: ChooseTag,OtherWiseTag,whenTag

//ChooseTag类:
public class ChooseTag extends SimpleTagSupport{
//此去时变量不是标签属性,由when标签更改;othewise获得;
private boolean flag;
public boolean isFlag() {
 return flag;
}
public void setFlag(boolean flag) {
 this.flag = flag;
}
@Override
public void doTag() throws JspException, IOException {
 // Choose标签作用显示标签体,以及作为其他两个标签的父标签;
 getJspBody().invoke(null);
}
}
//whenTag类
public class whenTag extends SimpleTagSupport{
//增加test属性
private boolean test;
public boolean isTest() {
 return test;
}
public void setTest(boolean test) {
 this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
 //如果标签属性为true,显示标签体
 if(test){
  getJspBody().invoke(null);
 }
 //设置父标签给otherwise用
 ChooseTag parent=null;
 if(getParent() instanceof ChooseTag){
  parent=(ChooseTag)getParent();
  parent.setFlag(test);
 }
}
}
//OtherWiseTag类:
public class OtherWiseTag extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
 boolean test=true;
 //获取父标签的test,由他的上一个when设置
 if(getParent() instanceof ChooseTag)
 {
  //获取父标签的test,由他的上一个when设置
  ChooseTag parent=(ChooseTag)getParent();
  test=parent.isFlag();
 }
 if(!test){
  getJspBody().invoke(null);
 }
}
}

编写tld文件:与其他的标签定义一模一样

<!-- 定义标签,choose-->
 <tag>
 <!-- 标签名 -->
 <name>choose</name>
 <!-- 标签处理类 -->
 <tag-class>com.rlovep.tags.ChooseTag</tag-class>
 <!-- 输出标签体的内容格式标签体不可以写jsp的java代码 -->
 <body-content>scriptless</body-content>
 </tag>
 <!-- 定义标签,when-->
<tag>
 <!-- 标签名 when -->
 <name>When</name>
 <!-- 标签处理类 -->
 <tag-class>com.rlovep.tags.whenTag</tag-class>
 <!-- 输出标签体的内容格式标签体不可以写jsp的java代码 -->
 <body-content>scriptless</body-content>
 <!-- 配置属性name -->
 <attribute>
 <name>test</name>
 <!-- 是否必填 -->
 <required>true</required>
 <!-- 是否支持EL表达式 -->
 <rtexprvalue>true</rtexprvalue>
 </attribute>
 </tag>
 <!-- 定义标签,Otherwise-->
 <tag>
 <!-- 标签名 -->
 <name>otherwise</name>
 <!-- 标签处理类 -->
 <tag-class>com.rlovep.tags.OtherWiseTag</tag-class>
 <!-- 输出标签体的内容格式标签体不可以写jsp的java代码 -->
 <body-content>scriptless</body-content>
 </tag>

使用带子标签的标签:与使用其他标签稍微有些不同,需要嵌套

<!-- 测试choose -->
<rlovep:choose>
<rlovep:When test="${10<5 }">
 条件成立执行when
</rlovep:When>
<rlovep:otherwise>
 条件不成立执行otherwise
</rlovep:otherwise>
</rlovep:choose>

自定义标签就介绍到这里;

404页面,505页面,错误页面配置方法:

可以在web.xml中给你的网站配置全局的404页面,505页面,错误页面;配置方法如下:记得建立相应的跳转文件。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<!-- 配置空指针异常 -->
 <error-page>
  <exception-type>java.lang.NullPointerException</exception-type>
  <location>/error.jsp</location>
 </error-page>
 <!-- 配置505错误页面 -->
 <error-page>
 <error-code>500</error-code>
 <location>/common/500.jsp</location>
 </error-page>
 <!-- 配置404错误页面 -->
 <error-page>
 <error-code>404</error-code>
 <location>/common/404.html</location>
 </error-page>
</web-app>

JSP入门就介绍到这里,希望对大家的学习有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索jsp
标签
,以便于您获取更多的相关知识。

时间: 2025-01-28 00:47:14

JSP自定义标签入门学习_JSP编程的相关文章

JSP自定义标签案例分析_JSP编程

本文为大家介绍了JSP自定义标签的案例,供大家参考,具体内容如下 案例一:实现一个基本防盗链标签 1. 标签处理类 public class MyReferer extends BodyTagSupport { private String site; private String back; public String getSite() { return site; } public void setSite(String site) { this.site = site; } public

JSP自定义标签入门实例

  jsp标签取代了JSP中的Java程序,并且可以重复使用,方便不熟悉Java编程的网页设计人员. 首先在eclipse下新建一个动态web工程1,在</web-app>之前加入    <jsp-config>          <taglib>           <taglib-uri>/tld/helloworld</taglib-uri>           <taglib-location>/WEB-INF/tlds/he

jsp 常用标签的使用_JSP编程

jsp中定义实体bean<jsp:useBean id="clu" class="cn.domain.CacluBean"></jsp:useBean><jsp:getProperty property="propertyname" name = "clu">获取bean的属性值,并将值输出到页面上: EL表达式:${实体对象名称}el表达式取数据时,通常用.号,.号取不出来就用[] pag

JSP自定义标签简单入门教程_JSP编程

在sun官方文档上有下面这样一段话. 官方文档声明 public interface SimpleTag extends JspTag Interface for defining Simple Tag Handlers. Simple Tag Handlers differ from Classic Tag Handlers in that instead of supporting doStartTag() and doEndTag(), the SimpleTag interface pr

JSP自定义标签基础知识学习_JSP编程

在实际的开发中,如为了简化JSP中出现大量的JSP脚本,那么我们需要使用标准标签库和EL表达式,但是和新标签库中提供的标签是有限的,不可能完全满足开发的需要.如:分页.因此需要学习如何自定义自己的标签库. 如果要实现自定义标签,那么需要如下几步: 编写标签处理类 需要继承或者实现相关的类或者接口 编写标签描述文件 该文件是一个XML文件,而且必须放在网站的WEB-INF目录中 在JSP中引入标签且使用 使用taglib指令引入标签库,随后使用. 自定标签的类体系 详细了解下一下几个类和接口: -

jsp自定义标签用法实例详解_JSP编程

本文实例讲述了jsp自定义标签用法.分享给大家供大家参考.具体如下: 在JSP中有一种机制,可以让你在JSP页面中插入与HTML类似的标记.本文介绍JSP定制标记的基本概念和构成,以及如何开发和应用JSP定制标记. 什么是标记 使用HTML语言我们可以这样去编辑我们的网页: <HTML> <HEAD> <TITLE> HELLO WORLD </TITLE> </HEAD> <BODY> HELLO WORLD </BODY&g

JSP自定义标签rtexprvalue属性用法实例分析_JSP编程

本文实例讲述了JSP自定义标签rtexprvalue属性.分享给大家供大家参考.具体如下: 其实以前也有写过自定义标签, 但是没有注意到过<rtexprvalue>的用法, 最近这几天又用上自定义标签了, 突然发现<rtexprvalue>的用法是有讲究的. rtexprvalue的全称是 Run-time Expression Value, 它用于表示是否可以使用JSP表达式. 当在<attribute>标签里指定<rtexprvalue>true<

基于JSP 自定义标签使用实例介绍_JSP编程

添加JSP自定义标签: 先添加一个tld文件到WEB-INF文件夹中<?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://

JSP自定义分页标签TAG全过程_JSP编程

首先我们需要在WEB-INF/tld/目录下创建page.tld文件 <?xml version="1.0" encoding="ISO-8859-1"?> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>page</short-name> <u