zoukankan      html  css  js  c++  java
  • JSP入门之自定义标签

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

    全部代码下载:链接

    1.JSP自定义标签:

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

    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文件中定义的

                 <%@ 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文件!!!
    步骤如下:

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

    4.访问标签体

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

    1. 格式如下:
    <rlovep:showIp>我是你
    </rlovep:showIp>
    
    1. 但要文字显示需要修改处理类和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>
    
    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)

  • 相关阅读:
    游标cursor
    SQL: EXISTS
    LeetCode Reverse Integer
    LeetCode Same Tree
    LeetCode Maximum Depth of Binary Tree
    LeetCode 3Sum Closest
    LeetCode Linked List Cycle
    LeetCode Best Time to Buy and Sell Stock II
    LeetCode Balanced Binary Tree
    LeetCode Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/onepeace/p/5047159.html
Copyright © 2011-2022 走看看