比对:
创建servlet:创建一个servlet必须实现Servlet,然后在web.xml中配置,这是servlet的根本。
Servlet类是个接口,里面包含了servlet的生命周期,每次创建一个servlet必须实现该接口以及该接口里面的所有方法。
弊端:Servlet接口里的方法有一些是我们用不到的,如果都实现就显得麻烦。
解决:自己手动创建一个MyGenericServlet抽象类,实现Servlet接口并实现接口里的一些通用的方法,我们创建servlet时只需去继承MyGenericServlet类即可。
实际上,已经有了这样的一个GenericServlet抽象类,该类不仅实现了Servlet接口,同时还实现了ServletConfig接口,这样就扩展了GenericServlet类的功能。
但是在开发过程当中我们创建servlet是去继承HttpServlet抽象类,该类继承GenericServlet抽象类,里面的方法更多更丰富。
创建自定义标签:
创建自定义标签需创建一个标签处理器类实现SimpleTag,然后手动创建一个xml配置文件配置。和创建servlet是类似的。
通常我们是去继承SimpleTagSupport类来创建一个自定义标签处理器类,通过该类创建自定义标签只需要根据需求重写doTag()方法,如果我们想获取JspContext,直接调用getJspContext(),这样一来就比较方便。
MyTag2.java
package com.atguigu.taglib;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 通过继承SimpleTagSupport来创建一个自定义标签
* @author lilichao
*
*/
public class MyTag2 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
//向页面输出一个内容
JspWriter out = getJspContext().getOut();
//通过out对象向页面中输出一个内容
out.print("<h3>这是我的第二个自定义标签</h3>");
}
}
===============================
创建带有标签体的标签:
什么是带有标签体的标签,就是在jsp页面中使用jsp自定义标签的时候,标签体里面是带有内容的。
<a:MyTag3>
我是MyTag3的标签体
</a:MyTag3>
该标签即所谓的带有标签体的标签。
那怎么去实现呢,1、创建标签处理器类;2、手动创建xml配置文件,配置标签处理器类。
1、创建标签处理器类MyTag3.java
package com.atguigu.taglib;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 有标签体的标签
* @author lilichao
*
*/
public class MyTag3 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
//获取out对象
JspWriter out = getJspContext().getOut();
//让标签体内容在页面中执行
//获取标签体
JspFragment body = getJspBody();
//在标签体执行之前加点内容
out.print("=====================寂寞的分割线========================<br />");
//执行标签体
body.invoke(out);
//在标签体执行完成以后再加点内容
out.print("<br />=====================寂寞的分割线========================<br />");
}
}
该类继承SimpleTagSupport类,重写doTag方法,要使得标签处理器类能够处理标签体,必须调用父类的getJspBody方法获得标签体类。
2、手动创建xml配置文件atguigu-taglib.tld,配置标签处理器类,该配置文件可以配置多个tag标签,即可以同时配置多个标签处理器类。
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">
<tlib-version>1.0</tlib-version>
<short-name>a</short-name>
<uri>http://www.atguigu.com/taglib/a</uri>
<tag>
<name>MyTag</name>
<tag-class>com.atguigu.taglib.MyTag</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<name>MyTag2</name>
<tag-class>com.atguigu.taglib.MyTag2</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<name>MyTag3</name>
<tag-class>com.atguigu.taglib.MyTag3</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
当标签体里有内容的时候
<body-content>scriptless</body-content>
不能再写成empty,为了能够服务器自动解析标签体里的EL表达式的时候必须是scriptless,其它的JSP、tagdependent这两个者一般不太常用。
==============================
创建带参数的标签:
什么是带参数的标签:类似html标签里的属性,带参数的标签就是说该标签带有属性,想要使用自定义标签带有属性,必须在配置文件里配置。
<a:MyTag4 test="${!empty param.name}">
<a:MyTag3>
您填写的name属性为 ${param.name }
</a:MyTag3>
</a:MyTag4>
模拟Java中if语句的功能
实现:1、创建标签处理器类;2、手动创建xml配置文件,配置标签处理器类。
1、创建标签处理器类MyTag4.java继承SimpleTagSupport类。
package com.atguigu.taglib;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 模拟Java中if语句的功能
* <if test="true">
内容
</if>
* @author lilichao
*
*/
public class MyTag4 extends SimpleTagSupport {
/**
* 在处理器类中顶一个test属性
*/
private boolean test;
/**
* 当标签中有属性时,只需要为指定的属性提供一个set方法,那么服务器会自动调用set方法为属性赋值
* @param test
*/
public void setTest(boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
//如果test为true则执行标签体
if(test){
//执行标签体
//getJspBody().invoke()可以传一个null,当传一个null作为参数时,他会默认在当前页面执行
//getJspBody().invoke(null);
JspWriter out = getJspContext().getOut();
getJspBody().invoke(out);
}
}
}
如果使用的标签有属性,那么标签处理类应该有这样的一个属性,这里模拟Java中的if语句,if语句里面含有条件判断,如果为真,执行方法体,如果为假就不执行,所以创建的自定义标签处理器类必须有这样的一个条件标识标量,定义为布尔值。
2、手动创建xml配置文件atguigu-taglib.tld:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">
<tlib-version>1.0</tlib-version>
<short-name>a</short-name>
<uri>http://www.atguigu.com/taglib/a</uri>
<tag>
<name>MyTag</name>
<tag-class>com.atguigu.taglib.MyTag</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<name>MyTag2</name>
<tag-class>com.atguigu.taglib.MyTag2</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<name>MyTag3</name>
<tag-class>com.atguigu.taglib.MyTag3</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>MyTag4</name>
<tag-class>com.atguigu.taglib.MyTag4</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
最后一个就是配置带有参数的标签,属性名name为test、是否必须为true、是否自动解析el表达式为true。这样配置完成后,在jsp页面通过taglib指令引入该配置文件,就可以使用配置好的标签。使用带参数的标签:
<a:MyTag4 test="${!empty param.name}">
<a:MyTag3>
您填写的name属性为 ${param.name }
</a:MyTag3>
</a:MyTag4>
============================