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入门就介绍到这里,希望对大家的学习有所帮助。

(0)

相关推荐

  • JSP开发入门(一)--安装好你的机器来使用JSP

    JSP开发入门(一)----安装好你的机器来使用JSP 你将会需要Java 2软件开发工具(JSDK),它原来的名称是Java发展工具(JDK)以及JavaServer网站发展工具(JSWDK),Tomcat,或是其它支持JSP的网络服务器.Sun免费提供JSDK与JSWDK来供Windows,Solaris,以及Linux平台使用. 如果你想要在你目前的网络服务器上使用JSP,但服务器本身并不支持JSP与Java servlets,你可以试试看Allaire的Jrun,它的作用就像是针对Net

  • jsp Hibernate入门教程第1/3页

    例如: 复制代码 代码如下: HibernateTest.java import onlyfun.caterpillar.*; import net.sf.hibernate.*; import net.sf.hibernate.cfg.*; import java.util.*; public class HibernateTest { public static void main(String[] args) throws HibernateException { SessionFacto

  • JSP经典学习笔记(包含各种入门常用语法)

    本文介绍了JSP经典学习笔记.分享给大家供大家参考.具体如下: JSP是Servlet的一种特殊形式,每个JSP页面就是一个Servlet实例--JSP页面有系统编译成Servlet,Servlet再负责响应用户请求. 1.JSP注释 <%--注释内容--%> ,与HTML注释<!--注释内容-->不同的是,编译后的HTML页面无法查看到JSP注释内容. 2.JSP声明 JSP声明用于声明变量和方法.JSP声明将会转换成Servlet中的成员变量或成员方法,因此,JSP声明依然符合

  • 通用JSP页面 jsp入门级文章

    1,common.jsp 复制代码 代码如下: <%@ taglib uri="/WEB-INF/resource/struts-logic.tld" prefix="logic"%> <%@ taglib uri="/WEB-INF/resource/struts-bean.tld" prefix="bean"%> <%@ taglib uri="/WEB-INF/resource/s

  • JSP开发入门(五)--JSP其他相关资源

    JSP其他相关资源: Servlets and JavaServer Pages (JSP) 1.0: A Tutorial http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/ JavaServer PagesTM: A Developer's Perspective http://developer.java.sun.com/developer/technicalArticles/Programming/jsp/ JAVASERVER PAG

  • JSP入门之HelloWorld程序实例

    本文实例讲述了JSP入门之HelloWorld程序.分享给大家供大家参考,具体如下: 这里讲述第一个JSP-HelloWorld!每一次的"初恋"都带着神秘感,揭开JSP神秘的面纱! JSP也是j2ee的一个规范. JSP(java  service Page),是由sun公司倡导.许多公司参与一起建立的动态网页技术标准. JSP与html的区别是在网页中嵌入java代码和JSP标记,形成.jsp的文件. JSP开发的web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运

  • 几则JSP入门知识总结

    从去年9月份,我就开始着手学JSP,以前也只有一点程序的意识,一路上摸索过来,经过了很多磨难,终于有一天,我就像一个旱鸭子学会游泳一样,心里无比高兴,熬了几天夜,终于写成了这个纯JSP的文章发布程序. 相信下面的几则小知识对向我这样水平的菜鸟有一定的帮助! ============================================================================== 1.传递表单参数: String name = new String(request

  • JSP开发入门

    JavaServer Pages (JSP) 是一种以 Java为主的跨平台web开发语言. JSP与微软的Active Server Pages 兼容,但它是使用类似HTML的卷标以及Java程序代码段而不是VBScript.当你所使用的网站服务器没有提供本地ASP支持,也就是Apache或Netscape服务器时,你可以考虑使用JSP.虽然你可以取得这些服务器的ASP附加配备模块,但价格相当昂贵,而目前Sun并没有对你所需要的JSP组件收取费用(虽然Sun未来有可能会收费).对于Solari

  • JSP开发入门(二)----JSP语法的基本原理

    安装之后,接下来我们要讨论JSP的语法.如果要偷懒,你可以下载语法卡而如果你不熟悉 Java的程序设计,你可能会想要参考Sun的使用手册:然而,网站建立者不应该做太多的Java发展.除了几个函式呼叫之外,出现在你JSP网页上的Java程序代码应该将它减到最少; 记住这点之后,现在让我们先来看看JSP的编译器指引与指令组件,之后我们将解释JavaBeans与内部对象. JSP编译器指引与指令组件有五种型态.JSP 1.0之后,大部分的JSP是包含在以<% 作为开始%>作为结束的单一卷标里.新的

  • JSP迅速入门

    JavaServer Pages (JSP) 是一种以 Java为主的跨平台web开发语言. JSP与微软的Active Server Pages 兼容,但它是使用类似HTML的卷标以及Java程序代码段而不是VBScript.当你所使用的网站服务器没有提供本地ASP支持,也就是Apache或Netscape服务器时,你可以考虑使用JSP.虽然你可以取得这些服务器的ASP附加配备模块,但价格相当昂贵,而目前Sun并没有对你所需要的JSP组件收取费用(虽然Sun未来有可能会收费).对于Solari

  • JSP开发入门(三)--JSP与JavaBean

    虽然你可以在小型指令文件里放入一大块的程序代码,但是大多数的Java程序代码是属于可以重复使用的组件,称为JavaBean.JavaBean就跟ActiveX控件一样:它们提供已知的功能,并且是为了可随时重复使用的目的而设计的. JavaBean的价值在于它可以经由一组特性来使用,而这些特性则提供对JavaBean设定的存取.以人来作范例,此人就是JavaBean,而他的姓名,社会福利安全号码,以及住址可以是特性.对于JSP网站,基本上你是将'JavaBean'动态的连接到你的网站. 假设Jav

  • JSP开发入门(四)--JSP的内部对象

    最后一个与JSP语法有关的组件叫做内部对象.在JSP小型指令文件内,你可以存取这些内部对象来与执行JSP网页的servlet环境相互作用.许多对内部对象的存取应该要简化.然而,这些是范例,它们的存取都是可接受的,要完整的利用内部对象设定则需要对最新的Java Servlet API有所了解. 下表列出你可以使用的内部对象. 内部对象说明 request 客户端请求,此请求会包含来自GET/POST请求的参数 response 网页传回客户端的响应 pageContext 网页的属性是在这里管理

随机推荐