JSP入门之自定义标签

第二部分简单讲解:主要讲解el表达式,核心标签库。本章主要讲解:自定义标签库;404页面,505页面,错误页面配置方法html

所有代码下载:连接java

1.JSP自定义标签:

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

2.开发自定义标签

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

  1. 编写一个普通的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;
    }
}
  1. 在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>
  1. 在jsp页面的头部导入自定义标签库:url为你在tld中写的url,前缀也是你在tld文件中定义的app

    <%@ taglib uri="http://rlovep.com" prefix="rlovep" %>
  2. 在jsp中使用自定义标签
<%-- 测试简单的自定义标签,标签体(我是你)不显示 --%>
<rlovep:showIp>我是你
</rlovep:showIp>

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

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

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

4.访问标签体

你能够像标准标签库同样在标签中包含消息内容。如咱们要在咱们自定义的 中包含内容 jsp

  1. 格式以下:
<rlovep:showIp>我是你
</rlovep:showIp>
  1. 但要文字显示须要修改处理类和tld文件:
    修改处理类在doTag方法中增长以下内容:
JspContext jspContext2 = this.getJspContext();
//显示标签体的两种方法
//方法1直接调用
//jspBody.invoke(null);
//方法2经过输出到out
//jspBody.invoke(jspContext2.getOut());

修改tld文件:ide

<tag>
   <!-- 标签名 -->
   <name>showIp</name>
   <!-- 标签处理类 -->
   <tag-class>com.rlovep.tags.ShowIp</tag-class>
   <!-- 输出标签体的内容格式标签体不能够写jsp的java代码 -->
   <body-content>scriptless</body-content>
   </tag>
  1. 如今你能够将标签体的内容显示了;
<%-- 标签提会显示 --%>
<rlovep:showIp>我是你
</rlovep:showIp>
  1. 输出标签体的内容格式:
    JSP: 在传统标签中使用的。能够写和执行jsp的java代码。
    scriptless: 标签体不能够写jsp的java代码
    empty: 必须是空标签。
    tagdependent : 标签体内容能够写jsp的java代码,但不会执

5.给标签体带属性:

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

  1. 格式以下:
<!-- 测试带属性的标签,标签体显示经过类处理 -->
<rlovep:AttributeTags name="peace" value="12345
  1. 定义属性步骤以下:
    编写处理类: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>
  1. 如今就能够用带属性的标签了
  2. 在tld配置属性时你能够配置下面的属性:
    12

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

就像核心标签库的choose标签同样咱们也能够定义嵌套的自定义标签,这部分咱们主要讲解本身建立一个相似核心标签库的choose标签。步骤以下:

  1. 创建处理类,处理类仍是与前面同样的方法。须要介绍的是用到了一个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);
        }
    }
}
  1. 编写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>
  1. 使用带子标签的标签:与使用其余标签稍微有些不一样,须要嵌套
<!-- 测试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入门就介绍到这里,哟哟,切割闹; 来自一条小鲨鱼wpeace(rlovep.com)

相关文章
相关标签/搜索