您的位置:首页 > Web前端 > JavaScript

JSP自定义tag

2016-09-20 17:52 288 查看
前端需要调用后端的配置,想起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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
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>
<att
4000
ribute>
<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/
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: