JSP自定义标签开发与打包

时间:2022-03-25 13:38:33

前言:最近用到JSP的自定义标签,于是到网上寻找资料,结果发现很多的网上教程要么不全要么就是步骤流程错误,尤其是将自定义标签打jar包这一过程,按照网上的教程操作,结果被坑惨了,所以才有现在这一篇博文!

1.自定义标签简介

JSP标签主要用于在JSP页面中提供业务逻辑功能,比如控制JSP页面是否执行、如何执行等,从而避免在JSP页面中直接书写Java代码,造成页面难维护,同时也给前端人员造成困扰。JSTL是JSP的标准标签库,可满足许多常用的需求,但对于一些特殊的需求却无能为力,但JSP给我们提供了开发自定义标签的接口,方便我们根据特定的需求来开发自定义标签。通常开发自定义标签需要完成2个主要步骤:

1)编写一个实现javax.servlet.jsp.tagext.Tag接口的java类(标签处理器)。

2)编写一个标签描述文件(以 .tld作为后缀名,遵循XML语法),tld文件可包含多个标签的描述,每个标签的描述放在<tag>和</tag>标签之间。

2.自定义标签接口介绍

1)javax.servlet.jsp.tagext.Tag接口

该接口继承了JspTag接口,JspTag是不包含属性和方法的接口。Tag接口包含了6个方法,

int doEndTag()

int doStartTag()

Tag getParent()

void release()

void setPageContext(PageContext pc)

void setParent(Tag t)

除此之外,还包含了4个静态属性,static final int SKIP_BODY、static final int EVAL_BODY_INCLUDE、static final int SKIP_PAGE、static final int EVAL_PAGE

 

实例1:在浏览器中输出HelloWorld

a. 在eclipse中新建一个Dynamic Web Project,名字叫做TestDemo1

JSP自定义标签开发与打包


b. 在Java Resources ——>src目录下new一个Package,名字叫做com.tag.demo,在该包下new一个java类,名字叫做Test1

JSP自定义标签开发与打包

c. 编辑Test1.java文件

 1 package com.tag.demo;
 2 import javax.servlet.jsp.tagext.Tag;
 3 import javax.servlet.jsp.PageContext;
 4 import javax.servlet.jsp.JspException;
 5 import javax.servlet.jsp.JspWriter;
 6 import java.io.IOException;
 7 public class Test1 implements Tag{
 8     private PageContext pageContext;      
 9     @Override  
10     public int doStartTag() throws JspException {  
11         JspWriter out = pageContext.getOut(); //获取out</span>  
12         String str="HelloWorld";
13         try {  
14             out.write(str); //写到浏览器  
15         } catch (IOException e) {  
16             throw new RuntimeException(e);  
17         }         
18         return 0;  
19     }     
20     @Override  
21     public int doEndTag() throws JspException {  
22         return 0;  
23     }  
24     @Override  
25     public Tag getParent() {  
26         return null;  
27     }  
28     @Override  
29     public void release() {  
30     }  
31     @Override  
32     public void setPageContext(PageContext arg0) {        
33         this.pageContext = arg0;  
34     }  
35     @Override  
36     public void setParent(Tag arg0) {  
37     }  
38 
39 }

d. 在WebContent目录下,新建jsp目录,用来存放jsp文件;在WEB-INF目录下新建  f.tld 文件(new一个XML文件,然后把下面的f.tld内容复制进来即可)。

JSP自定义标签开发与打包

Test1.jsp文件内容如下:

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
 2 <%@ taglib uri="http://sodu.lakala.com/urlCheck" prefix="f"%>  <!--uri与tld文件中配的uri相同-->  
 3   
 4 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
 5 <html>  
 6   <head>    
 7     <title>在浏览器输出HelloWorld</title>  
 8   </head>  
 9     
10   <body>  
11         <f:out/>              
12   </body>
13   
14 </html> 

f.tld文件内容如下:

 1 <?xml version="1.0" encoding="UTF-8" ?>  
 2 <taglib xmlns="http://java.sun.com/xml/ns/javaee"  
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"  
 5     version="2.1">  
 6     <description>A tag library exercising SimpleTag handlers.</description> 
 7     <display-name>Test Tag</display-name> 
 8     <tlib-version>1.0</tlib-version>  
 9     <short-name>f</short-name>  
10     <uri>http://sodu.lakala.com/urlCheck</uri>  <!--为该标签配一个uri-->  
11       
12     <tag>
13         <description>
14         output String to browser
15         </description>
16         <name>out</name>
17         <tag-class>com.tag.demo.Test1</tag-class>
18         <body-content>scriptless</body-content>
19     </tag>
20 </taglib>

e. 将整个项目部署到Tomcat,此时项目的根目录为项目名称,即TestDemo1,我们访问jsp的时候需要用到。

f. 运行tomcat,在浏览器中输入http://localhost:8080/TestDemo1/jsp/Test1.jsp ,可以看到页面展示HelloWorld。

2)javax.servlet.jsp.tagext.SimpleTag接口

该接口也继承了JspTag接口,包含了5个方法,

void doTag()

JspTag getParent()

void setJspBody(JspFragment jspBody)

void setJspContext(JspContext pc)

void setParent(JspTag parent)

javax.servlet.jsp.tagext.SimpleTagSupport是SimpleTag接口的实现类,通常开发自定义标签的时候,我们只需要继承SimpleTagSupport类并重写doTag()方法即可。

实例2:写一个带有属性的标签,根据属性来判断标签体是否执行

这里过程不再给出,直接上文件的代码:

Checkuri.java文件内容如下:

 1 package com.lakala.Taglib;
 2 import javax.servlet.http.HttpSession;
 3 import javax.servlet.jsp.JspException;
 4 import javax.servlet.jsp.tagext.SimpleTagSupport;
 5 import javax.servlet.jsp.tagext.JspFragment;
 6 import java.util.Map;
 7 import javax.servlet.jsp.PageContext;
 8 import java.io.IOException;
 9 public class Checkuri extends SimpleTagSupport{
10     private static final String SSO_PARAM_ACCESS="ACCESS_MAP";
11     private String url;
12 
13     public String getUrl() {
14         return url;
15     }
16 
17     public void setUrl(String url) {
18         this.url = url;
19     }
20     public Boolean check() throws Exception{
21         if(url==null||"".equals(url)){
22             return false;
23         }
24         PageContext pageContext = (PageContext)this.getJspContext();    //获得pageContext 
25         HttpSession session = pageContext.getSession();
26         @SuppressWarnings("unchecked")
27         Map<String,String> map=(Map<String, String>) session.getAttribute(SSO_PARAM_ACCESS);
28         if(map!=null&&map.containsKey(url)){
29             if(map.get(url)!=null||"".equals(map.get(url))){
30                 return true;
31             }
32         }
33         return false;
34     }
35     @Override  
36     public void doTag() throws JspException, IOException{  
37       //得到代表标签体的JspFragment  
38         JspFragment jf = this.getJspBody();
39         try{
40             Boolean flag1=check();
41             if(flag1){
42                 jf.invoke(null);
43             }
44         }catch(Exception e){
45             e.printStackTrace();
46         }
47     }
48 
49 }

g.tld文件内容如下:

 1 <?xml version="1.0" encoding="UTF-8" ?>  
 2 <taglib xmlns="http://java.sun.com/xml/ns/javaee"  
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
 4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"  
 5     version="2.1">  
 6     <description>A tag library exercising SimpleTag handlers.</description> 
 7     <display-name>urlCheck</display-name> 
 8     <tlib-version>1.0</tlib-version>  
 9     <short-name>g</short-name>  
10     <uri>http://sodu.lakala.com/urlCheck/list</uri>  <!--为该标签配一个uri-->  
11       
12     <tag>
13         <description>
14         Catches any Throwable that occurs in its body and optionally
15         exposes it.
16         </description>
17         <name>check</name>
18         <tag-class>com.lakala.Taglib.Checkuri</tag-class>
19         <body-content>scriptless</body-content>
20         <attribute>
21         <description>
22          just do it
23         </description>
24             <name>url</name>
25             <required>false</required>
26             <rtexprvalue>true</rtexprvalue>
27         </attribute>
28     </tag>
29     
30 </taglib> 

将自定义标签库打jar包,然后就可以在其他web项目中用了。

打包流程:

a. 新建一个java project

b. 创建如下的目录结构

JSP自定义标签开发与打包

c. 右键项目export——>Java——>JAR file,然后如图,点击finish完成打包

JSP自定义标签开发与打包

d. 在其他的项目中,导入自定义的该包,然后就直接可以在JSP页面中通过<%@ taglib uri="http://sodu.lakala.com/urlCheck/list" prefix="g" %>指令引用我们的标签库。