JSP自定义tag
时间:2022-05-04
本文章向大家介绍JSP自定义tag,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前端需要调用后端的配置,想起velocity-tools。然而jsp的话,目前只能想到tag和EL表达式了。
Tag相当好写,jsp2.0提供了简化写法:
编写一个java类:
public class HelloWorldTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException{
JspWriter out = getJspContext().getOut();
out.println("Hello Custom Tag!");
}
}
然后编写对应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 [url]http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd[/url]"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>Example TLD</short-name>
<tag>
<name>hello</name>
<tag-class>com.test.demo.HelloWorldTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
然后就可以在页面上使用了:
<%@ taglib prefix="ex" uri="/WEB-INF/hello.tld" %>
<ex:hello/>
上述是没有body的tag,如果想要输出body的内容:
新写一个java类:
public class BodyTag extends SimpleTagSupport {
StringWriter sw = new StringWriter();
public void doTag() throws JspException, IOException{
getJspBody().invoke(sw);
JspWriter out = getJspContext().getOut();
out.println(sw.toString());
}
}
在原来tld文件里面追加一个tag:
<tag>
<name>body</name>
<tag-class>com.test.demo.BodyTag</tag-class>
<body-content>scriptless</body-content>
</tag>
在页面上:
<ex:body>
This is message body.
</ex:body>
如果想要在tag上追加参数:
public class StandardTag extends SimpleTagSupport {
private String message;
public void setMessage(String message) {
this.message = message;
}
StringWriter sw = new StringWriter();
public void doTag() throws JspException, IOException{
JspWriter out = getJspContext().getOut();
if (message!=null){
//from filed
out.println(message);
}else{
//from body
getJspBody().invoke(sw);
out.println(sw.toString());
}
}
}
在tld中添加一个新tag:
<tag>
<name>msg</name>
<tag-class>com.test.demo.StandardTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>message</name>
<required>false</required>
<type>java.lang.String</type>
</attribute>
</tag>
在页面上使用:
<ex:msg message="show message from para">
</ex:msg>
---------------
<ex:msg>
if message==null , then show body.
</ex:msg>
如果想要使用传参,使用EL表达:
在java类中添加一个static方法:
public static String hello(String name){
return "Welcome: " + name;
}
然后在tld中添加:
<function>
<name>welcome</name>
<function-class>com.test.demo.StandardTag</function-class>
<function-signature>java.lang.String hello(java.lang.String)</function-signature>
<example>${ex:welcome('Ryan')}</example>
</function>
然后页面上调用:
${ex:welcome('Leslie')}
在spring mvc 中,有个很好用的tag支持类RequestContextAwareTag,下面做一个简单的使用:
public abstract class BaseTag extends RequestContextAwareTag {
private static final EPCLogger LOGGER = EPCLogger.getLogger(BaseTag.class);
private static final long serialVersionUID = -6258930875039222435L;
private BeanUtils beanUtils = new BeanUtils();
private HandlebarUtils handlebarUtils = new HandlebarUtils();
public abstract Object getModel();
public BaseTag() {
}
public void renderHandlebarsView(String templateLocation) {
try {
Template e = this.handlebarUtils.compile(templateLocation);
e.apply(this.getModel(), this.pageContext.getOut());
} catch (Exception var3) {
LOGGER.error(UITagsSystemEvent.BASE_TAG_ERROR, "Error occurred while rendering handlebars view.", var3);
}
}
public Object getBean(String beanName) {
Validate.notNull(beanName);
return this.beanUtils.getBean(this.getRequestContext(), beanName);
}
}
public class BeanUtils {
public BeanUtils() {
}
public Object getBean(RequestContext requestContext, String beanName) {
return requestContext.getWebApplicationContext().getBean(beanName);
}
}
reference:
http://www.runoob.com/jsp/jsp-custom-tags.html
https://www.ibm.com/developerworks/cn/java/j-lo-jsp2tag/
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用文件字节输出流FileOutputStream写入文件
- jdk1.8 自带的Base64加密与解密
- 缓冲字节输入流BufferedInputStream
- 在页面上写一个验证码
- 缓冲字节输出流BufferedOutputStream
- EL表达式获取简单数据与复杂数据(调用类)+EL表达式获取Map集合与list集合数据
- 用缓冲字节流,复制一个照片
- 09小结:封装结果集或实体类时,有多个对象的解决方法
- 序列化与反序列化Serializable,Externalizable
- response.getWriter().write()和 response.getWriter().print()的区别:
- java使用TCP,由客户端向服务端传输图片,(电脑与电脑)或(同一台电脑)
- 使用druid
- UDP实现多人聊天室
- 请求(doFilter)与响应乱码(BaseController+自定义注解@ContentType(““))集中处理
- 反射:Reflect(获取类对象三种方法)