先引用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>