jsp页面自定义标签的几种方式

先引用jar包

<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
</dependency>

一:tld文件加jsp模式(此方法可动态设置jsp页面的 js,通过调用控制层获取js,可通过将某部分js储存在数据库,通过这种方式,获取想要的js);

fns.tld文件内容:
 

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  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"
  version="2.0">
    
  <description>JSTL 1.1 functions library</description>
  <display-name>JSTL functions sys</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>fns</short-name>
  <uri>http://java.sun.com/jsp/jstl/functionss</uri>

  <!-- DictUtils -->
 
  <function>
    <description>测试弹窗</description>
    <name>getAlertJs</name>
    <function-class>com.aoro.controller.UserController</function-class>
    <function-signature>java.lang.String getjs2()</function-signature>
    <example>${fns:getAlertJs()}</example>  
  </function>
 
</taglib>

对应jsp页面用法:

<%@ taglib prefix="fns" uri="/WEB-INF/tlds/fns.tld" %>

<script language="JavaScript">
${fns:getAlertJs()}
</script>

  <button class="layui-btn layui-btn-sm layui-btn-normal" οnclick="getjs2()">调用tld文件中的方法测试</button>

//上面调用的getjs2方法是${fns:getAlertJs()}获取的,即com.aoro.controller.UserController  getjs2()方法返回的东西

该控制层的方法为:

public static String getjs2(){
        return "function getjs2(){alert('自定义标签测试')}";
    }

所以jsp调用的getjs2()方法即为控制层return内容

二:tag文件加jsp模式(此方法可动态设置页面上按钮,选择框等html各种元素);

test.tag文件内容:

<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<button class="layui-btn layui-btn-sm layui-btn-normal" οnclick="getjs2()">我是test.tag中的按钮</button>

tag文件里面可以添加html元素,可通过jstl循环等各个功能,还可以引入tld文件,并通过tld文件获取数据,可动态设置各种页面按钮,表格,选择框,等元素,上面只记录一个按钮,由于刚才已经引用过fns.tld并获取到了getjs2()方法则jsp页面只需要引用tag文件并用上就行了;

jsp页面引用如下:

<%@ taglib prefix="sys" tagdir="/WEB-INF/tags/sys" %>

将test.tag文件放在/WEB-INF/tags/sys文件夹下即可,引用时如下

<sys:test/>//sys即为红色字体部分,test为对应的文件,我这个文件为test.tag,所以有此引用;

三:tld复杂版,

bgt.tld文件内容如下:
 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"   
    "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
   <tlib-version>1.0</tlib-version>
   <jsp-version>2.0</jsp-version>
   <short-name>Example TLD with Body</short-name>

   <tag>
      <name>Hello</name>
      <tag-class>com.aoro.controller.HasUrlPermissionTag</tag-class>
      <body-content>scriptless</body-content>

      <attribute>
        <name>message</name>
      </attribute>
<!--
	name      元素定义属性的名称。每个属性名称对于特定标签必须是唯一的。  
	required 	此规范如果此属性是必需的或是可选的。则可设置为:false。
	rtexprvalue 	声明tag属性的运行时表达式值是否有效
	type 	定义此属性的Java类类型。 默认情况下,它被假定为String类型
	description 	可以提供信息描述。
	fragment 	声明此属性值是否应被视为JspFragment。
-->

<!--
    多属性定义如下:
    <attribute>
        <name>attribute_name1</name>
           <required>false</required>
           <type>java.util.Boolean</type>
           <fragment>false</fragment>
    </attribute>

    <attribute>
          <name>attribute_name2</name>
          <required>true</required>
          <type>java.util.Date</type>
       </attribute>
        
    -->

</tag>
</taglib>

jsp页面引用:

<%@ taglib prefix="ex" uri="/WEB-INF/tlds/bgt.tld"%>

用法有两种,一种是直接夹在标签中间;另一种是直接在标签中属性里面给值;如下:

<ex:Hello>
  自定义标签,我是标签中间的内容;
  </ex:Hello>

<ex:Hello message = "This is custom tag attribute" />

由于tld文件调用了java文件,此处贴出java文件代码:

/**
 * 创建日期:2018年8月15日上午10:33:22
 */
package com.aoro.controller;

import java.io.IOException;
import java.io.StringWriter;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
 * @author Administrator
 * 创建日期:2018年8月15日上午10:33:22
 */
public class HasUrlPermissionTag extends SimpleTagSupport {

	//自定义标签属性,属性的名称是message
	private String message;

	public void setMessage(String msg) {
		this.message = msg;
	}
	StringWriter sw = new StringWriter();
	
	public void doTag() throws JspException, IOException {
		if (message != null) {
			/* Use message from attribute */
			JspWriter out = getJspContext().getOut();
			out.println( message );
		} else {
			/* use message from the body */
			getJspBody().invoke(sw);
			getJspContext().getOut().println(sw.toString());
		}
   }
}

上面方法可变化一下,获取数据表格如下:

table.tld:

<?xml version="1.0" encoding="ISO-8859-1" ?>    
<!DOCTYPE taglib    
        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"    
    "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

    <tlib-version>1.2</tlib-version>
    <jsp-version>2.0</jsp-version>
    <short-name>c</short-name>
    <uri>controller</uri>

    <tag>
        <name>NewTable</name>
        <tag-class>com.aoro.controller.testTable</tag-class>
        <attribute>
            <name>number</name>
            <required>true</required>
        </attribute>
    </tag>
</taglib>

引用的testTable如下:

/**
 * 创建日期:2018年8月15日下午3:52:41
 */
package com.aoro.controller;

import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.commons.collections.CollectionUtils;

import org.springframework.beans.factory.annotation.Autowired;

import com.aoro.model.User;
import com.aoro.service.UserService;
import com.aoro.util.DataUtils;
import com.aoro.common.spring.SpringContextHolder;

/**
 * @author Administrator
 * 创建日期:2018年8月15日下午3:52:41
 */
public class testTable extends TagSupport{
	
	@Autowired
	private UserService userService;
	
	private String number;

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public int doStartTag() throws JspException {
        JspWriter out = pageContext.getOut();
        try {
         //   Class.forName("com.mysql.jdbc.Driver");
         //   Connection con = DriverManager.getConnection("jdbc:mysql://localhost/testdb?useSSL=false&characterEncoding=utf8", "root", "123456");
         //   PreparedStatement ps = con.prepareStatement("SELECT name,education,age FROM `employees` ORDER BY id DESC limit "+this.number);
            //ps.setInt(1, Integer.parseInt(this.number));
         //   System.out.println("number => "+this.number);
         //   ResultSet rs = ps.executeQuery();
        	
            //此处是获取数据,我这里调用了一个接口,可根据自己项目,调用自己的数据
            if(userService == null){
        		userService = SpringContextHolder.getBean("userService");
            }
        	List<User> userlist = userService.findAll();
            if (CollectionUtils.isNotEmpty(userlist)) {
                // column name
                out.write("<table border='1'>");
                out.write("<tr>");
                out.write("<th>userid</th><th>姓名</th><th>年龄</th>");
                out.write("</tr>");
                // column value
                if(DataUtils.asInt(this.number)<=userlist.size()){
                	for(int i=0;i<DataUtils.asInt(this.number);i++) {
                        out.write("<tr>");
                        out.write("<td>" + userlist.get(i).getUserId() + "</td><td>" + userlist.get(i).getUserName() + "</td><td>" +userlist.get(i).getAge() + "</td>");
                        out.write("</tr>");
                    }
                }
                
                out.write("</table>");
            }
        //    con.close();
        } catch (Exception e) {
            System.out.println(e);
        }
        return SKIP_BODY; // return BodyTagSupport.EVAL_BODY_INCLUDE; 返回此则执行标签body中内容,SKIP_BODY则不执行
    }
}

jsp页面引用如下:

<%@ taglib prefix="newtable" uri="/WEB-INF/tlds/table.tld"%>

<newtable:NewTable number="3"/>

newtable:对应prefix="newtable";

NewTable 对应table.tld文件中的 tag <name>NewTable</name>;

number 对应 table.tld文件中的 参数

<attribute>
            <name>number</name>
            <required>true</required>
        </attribute>

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值