jsp的三种自定义标签 写法示例
自定义标签可以大大方便我们的页面控件编写,并且可以实现很多统一的管理。
0、首先需要引入支持自定义标签的jar包,有两种方式,
一个是直接在maven里面引入依赖:
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
另一个是直接用你Tomcat自带的jsp-api



两种方式取其中一种即可。
1、通过tld文件,自定义方法标签
tld的这种用法,让我们可以在jsp里直接使用类中定义的方法
引入方式示例,直接在jsp上引入tld标签文件:
<%@ taglib prefix="fns" uri="/WEB-INF/tlds/fns.tld" %>
写法示例(文件名fns.tld,存放位置在上面的uri中有定义):
<?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>getDictList</name>
<function-class>com.sdyy.base.sys.utils.DictUtils</function-class>
<function-signature>java.util.List getDictList(java.lang.String)</function-signature>
<example>${fns:getDictList(typeCode)}</example>
</function> <function>
<description>获取字典对象列表</description>
<name>getDictListJson</name>
<function-class>com.sdyy.base.sys.utils.DictUtils</function-class>
<function-signature>java.lang.String getDictListJson(java.lang.String)</function-signature>
<example>${fns:getDictListJson(typeCode)}</example>
</function> <function>
<description>对象变json</description>
<name>toJSONString</name>
<function-class>com.alibaba.fastjson.JSON</function-class>
<function-signature>java.lang.String toJSONString(java.lang.Object)</function-signature>
</function>
</taglib>
function-class就是该方法的实体所在类路径,
function-signature就是该方法的方法名,值得一提的是,这个方法必须是个static方法。
example就是使用方式写法示例
2、通过tag文件自定义控件标签(感谢评论区一楼指正)
此类标签,让我们可以在jsp里,通过传入一些参数,动态的生成jsp代码
引入方式示例:
<%@ taglib prefix="sys" tagdir="/WEB-INF/tags/sys" %>
注意,这里引入的是一个路径
如此 tags目录下的sys目录下的所有tag(感谢评论区一楼指正)都会自动被加载,标签tag写法示例(写法其实类似jsp):
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="fns" uri="/WEB-INF/tlds/fns.tld" %>
<%@ attribute name="typeCode" type="java.lang.String" required="true" description="字典code"%>
<%@ attribute name="defaultValue" type="java.lang.String" description="默认选中"%>
<%@ attribute name="style" type="java.lang.String" description="默认选中"%>
<%@ attribute name="cls" type="java.lang.String" description="默认选中"%>
<%@ attribute name="name" type="java.lang.String" description="默认选中"%>
<select style="${style}" class="${cls}" name="${name}" id="${name}" >
<option value="" >请选择... </option>
<c:if test="${not empty typeCode}">
<c:forEach items="${fns:getDictList(typeCode)}" var='dict'>
<option value='${dict.VALUE}' ${defaultValue==dict.VALUE?'selected':''}>${dict.TEXT}</option>
</c:forEach>
</c:if>
</select>
这里我引入了两个taglib,是为了在该文件中使用它们,attribute则相当于参数,定义这些参数才能在使用的时候动态传入,注意还有一些关键字,比如这里的“cls”,就是因为“class”是关键字
如此,tag名就是标签名,例如这个tag叫 select.tag(感谢评论区一楼指正),那么它的用法就是
<sys:select cls="formselect" name="MODULE_TYPE" typeCode="HOME_MODULE_TYPE" defaultValue="${record.MODULE_TYPE }" />
其中 “sys:select” 中 【sys】是我们在上面【引入方式示例】中定义的prefix,select和【select.tag】的红字部分是对应的
3、通过 tld文件 自定义判断标签、控件标签(偷个懒,写一块了)
引入方式和1相同,写法示例如下:
<?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>bgt</short-name>
<!-- backGroundTag -->
<uri>http://www.sdyy.tag</uri>
<tag>
<name>hasUrlPerm</name>
<tag-class>com.sdyy.common.tags.HasUrlPermissionTag</tag-class>
<attribute>
<name>link</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue><!-- 是否支持恶劣表达式 -->
<type>java.lang.String</type>
<description>示例:acApplication/forMain.do</description>
</attribute> </tag>
</taglib>
A、【判断标签】HasUrlPermissionTag标签是一个判断标签,通过该标签来决定标签包裹的内容是否显示,写法如下:
package com.sdyy.common.tags; import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport; import com.sdyy.common.spring.interceptor.PermissionInterceptor;
/**
*
* @ClassName: HasUrlPermissionTag
* @Description: 根据url判断权限标签
* @author: liuyx
* @date: 2015年12月21日上午11:15:32
*/
public class HasUrlPermissionTag extends BodyTagSupport { private String link;// acApplication/forMain.do @Override
public int doStartTag() throws JspException { // 在标签开始处出发该方法 HttpServletRequest request=(HttpServletRequest) pageContext.getRequest();
//获取session中存放的权限 //判断是否有权限访问
if (PermissionInterceptor.isOperCanAccess(request, link)) {
//允许访问标签body
return BodyTagSupport.EVAL_BODY_INCLUDE;// 返回此则执行标签body中内容,SKIP_BODY则不执行
} else {
return BodyTagSupport.SKIP_BODY;
} } @Override
public int doEndTag() throws JspException {
return BodyTagSupport.EVAL_BODY_INCLUDE;
} public String getLink() {
return link;
} public void setLink(String link) {
this.link = link;
} }
在JSP中的使用方式:
<bgt:hasUrlPerm link="abc.do">
<div>tttttttttttttttttest</div>
</bgt:hasUrlPerm>
B、【控件标签】,这种标签直接返回一个控件,不过是通过java代码生成的控件内容,写法示例:
package com.sdyy.common.tags; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport; /*import com.sdyy.base.ac.ac_permission.model.AcPermission;*/ public class ButtonUrlTag extends BodyTagSupport {
private static final long serialVersionUID = -7811902545513255473L; //标签属性用户名
private String user = null;
//标签属性操作url
private String url = null;
//标签属性 js方法
private String jsmethod = null;
//标签属性image 按钮图片
private String image = null;
//标签属性 alt 提示
private String alt = null;
//标签属性操作value 按钮文本
private String value = null; /* 标签初始方法 */
public int doStartTag() throws JspTagException{
return super.EVAL_BODY_INCLUDE;
} /* 标签结束方法 */
public int doEndTag() throws JspTagException{ Boolean b = false;
List list = new ArrayList();
/*AcPermission p = new AcPermission();*/
/*JDBCHibernate jdbca = new JDBCHibernate();*/
try {
/*list = jdbca.getHaveURLByUsernameList(user);*/
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
for(int i = 0;i < list.size(); i++){
/*p = (AcPermission) list.get(i);*/
if(1==1) {//p.getUrl().trim().equals(url.trim())){
b = true;
//如果jsmethod属性不为null 则把超链接href改为调用js
if(jsmethod!=null){
url = jsmethod;
}
}
}
JspWriter out = pageContext.getOut();
if(b){
try {
//有权限 显示操作按钮
out.println("<a href='" +url+ "' class='regular'><img src='" + image + "' alt='" + alt +"' />" + value + "</a>");
} catch (IOException e) {
e.printStackTrace();
}
} return super.SKIP_BODY;
} /* 释放资源 */
public void release(){
super.release();
} public String getUser() {
return user;
} public void setUser(String user) {
this.user = user;
} public String getUrl() {
return url;
} public void setUrl(String url) {
this.url = url;
} public String getImage() {
return image;
} public void setImage(String image) {
this.image = image;
} public String getAlt() {
return alt;
} public void setAlt(String alt) {
this.alt = alt;
} public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
} public String getJsmethod() {
return jsmethod;
} public void setJsmethod(String jsmethod) {
this.jsmethod = jsmethod;
}
}
综上 标签一般都是通过tld和tag定义的,本文只是对其中几种基础用法罗列,希望对大家有所帮助。
jsp的三种自定义标签 写法示例的更多相关文章
- java:jsp: 一个简单的自定义标签 tld
java:jsp: 一个简单的自定义标签 tld 请注意,uri都是:http://www.tag.com/mytag,保持统一,要不然报错,不能访问 tld文件 <?xml version=& ...
- 在jsp页面中使用自定义标签
在某些场景中,自定义标签可封装大量代码,使页面变得更简洁,标签也可以很方便地在不同页面中实现通用而不必去粘贴大量的js代码.现在把最近做的一个自定义标签在这里总结一下.首先总结一下关于自定义标签的一些 ...
- css三种样式表写法
css三种样式表:1.内嵌样式表: <head> <style type="text/css"> 样式表写法 </style> < ...
- jsp tld 的tag 自定义标签扩展
引入方式 <%@ taglib prefix="bgt" uri="/WEB-INF/tlds/bgt.tld" %> 写法示例如下: <?x ...
- React内三种函数的写法
以下提供三种React内函数的写法,都可以正常运行,有疑问可以留言 写法一:让函数内部的this指向这个类的实例,它是用bind实现的,bind的第一个参数表示context,就是this. //写 ...
- 【JSP】三种弹出对话框的用法实例
对话框有三种 1:只是提醒,不能对脚本产生任何改变: 2:一般用于确认,返回 true 或者 false ,所以可以轻松用于 if...else...判断 3: 一个带输入的对话框,可以返回用户填入的 ...
- SQLServer三种自定义函数
自定义函数"是我们平常的说法,而"用户定义的函数"是 SQL Server 中书面的说法. SQL Server 2000 允许用户创建自定义函数,自定义函数可以有返回值 ...
- AMD,CMD,UMD 三种模块规范 写法格式
一下三块均以 foo.js 为示例文件名,以 jQuery,underscore 为需求组件 ADM:异步模块规范, RequireJs 的支持格式 // 文件名: foo.js define(['j ...
- JSP的三种类型的元素
JSP有三种类型的元素:指令元素(directive element).行为元素(action element).和脚本元素(script element). 指令元素用于指定整个JSP页面的相关信息 ...
随机推荐
- 获取byte数组的实际使用长度
背景:byte.length只能获取到初始化的byte数组长度,而不是实际使用的长度,因此想要获取到实际的使用长度只能靠其他方法实现. 方法一: public class ByteActualLeng ...
- LightSpeed 的Left Join Bug解决方案
在使用LightSpeed对数据库进行Left Join或Right Join操作时,经常会报一些匪夷所思的异常. 明明表没有问题,表面上语句写的也没问题,可总是报错.看分析器里的SQL就知道了,是L ...
- mongo学习笔记(五):分片
分片 人脸: 代表客户端,客户端肯定说,你数据库分片不分片跟我没关系,我叫你干啥就干啥,没什么好商量的. mongos: 首先我们要了解”片键“的概念,也就是说拆分集合的依据是什么?按照 ...
- OSX下VirtualBox安装CentOS
1.OSX上下载安装VirtualBox 2.新建虚拟机(所有选项默认即可) 3.启动虚拟机,选择CentOS安装镜像 CentOS-6.7-x86_64-minimal.iso 此处下载的是最小镜像 ...
- 使用Sqoop,最终导入到hive中的数据和原数据库中数据不一致解决办法
Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL , ...
- cocos2d-x之场景转换特效
bool HelloWorld::init() { if ( !Layer::init() ) { return false; } Size visibleSize = Director::getIn ...
- jQuery Validate 表单验证插件----在class属性中添加校验规则进行简单的校验
一.下载插件包. 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二.jQuery表单验证插件----添加class属性形式的校验 <!DOCTY ...
- PPT制作教程:如何制作ppt
PowerPoint(PPT)是专门用于制作演示文稿(俗称幻灯片).广泛运用于各种会议.产品演示.学校教学等.学会如何制作ppt,成为提升工作效 率的好帮手.PPT包含有很多的功能,我们可以根据个人喜 ...
- 烂泥:centos6.4服务器添加新硬盘
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 公司FTP服务器的空间又不够了,唉,没有办法只能新加硬盘了.因为以前没有给Linux服务器添加过硬盘,所以只能先在虚拟机中进行模拟. 新加硬盘的操作步骤 ...
- SQLAlchemy 中文文档翻译计划
SQLAlchemy 中文文档翻译计划已启动. Python 文档协作翻译小组人手紧缺,有兴趣的朋友可以加入我们,完全公益性质.交流群:467338606. 希望大家能够勇敢地去翻译和改进翻译.虽然我 ...