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)

  • 相关阅读:
    课堂练习
    软件工程课堂练习二维数组子数组和最大值,只要连续就好
    结对项目电梯调度
    第二次课堂练习
    软件工程课堂练习二维数组子数组和的最大值
    敏捷开发方法
    软件工程个人作业
    电梯调度
    创意
    02合并frame
  • 原文地址:https://www.cnblogs.com/onepeace/p/5047159.html
Copyright © 2011-2022 走看看