前端需要调用后端的配置,想起velocity-tools。然而jsp的话,目前只能想到tag和EL表达式了。

Tag相当好写,jsp2.0提供了简化写法

编写一个java类:

  1. public class HelloWorldTag extends SimpleTagSupport {
  2.  
  3. public void doTag() throws JspException, IOException{
  4. JspWriter out = getJspContext().getOut();
  5. out.println("Hello Custom Tag!");
  6. }
  7. }

然后编写对应tld:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee [url]http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd[/url]"
  4. version="2.0">
  5. <tlib-version>1.0</tlib-version>
  6. <short-name>Example TLD</short-name>
  7. <tag>
  8. <name>hello</name>
  9. <tag-class>com.test.demo.HelloWorldTag</tag-class>
  10. <body-content>empty</body-content>
  11. </tag>
  12. </taglib>

然后就可以在页面上使用了:

  1. <%@ taglib prefix="ex" uri="/WEB-INF/hello.tld" %>
  1. <ex:hello/>

上述是没有body的tag,如果想要输出body的内容:

新写一个java类:

  1. public class BodyTag extends SimpleTagSupport {
  2.  
  3. StringWriter sw = new StringWriter();
  4.  
  5. public void doTag() throws JspException, IOException{
  6. getJspBody().invoke(sw);
  7. JspWriter out = getJspContext().getOut();
  8. out.println(sw.toString());
  9. }
  10.  
  11. }

在原来tld文件里面追加一个tag:

  1. <tag>
  2. <name>body</name>
  3. <tag-class>com.test.demo.BodyTag</tag-class>
  4. <body-content>scriptless</body-content>
  5. </tag>

在页面上:

  1. <ex:body>
  2. This is message body.
  3. </ex:body>

如果想要在tag上追加参数:

  1. public class StandardTag extends SimpleTagSupport {
  2.  
  3. private String message;
  4.  
  5. public void setMessage(String message) {
  6. this.message = message;
  7. }
  8.  
  9. StringWriter sw = new StringWriter();
  10.  
  11. public void doTag() throws JspException, IOException{
  12. JspWriter out = getJspContext().getOut();
  13. if (message!=null){
  14. //from filed
  15. out.println(message);
  16. }else{
  17. //from body
  18. getJspBody().invoke(sw);
  19. out.println(sw.toString());
  20.  
  21. }
  22. }
  23.  
  24. }

在tld中添加一个新tag:

  1. <tag>
  2. <name>msg</name>
  3. <tag-class>com.test.demo.StandardTag</tag-class>
  4. <body-content>scriptless</body-content>
  5. <attribute>
  6. <name>message</name>
  7. <required>false</required>
  8. <type>java.lang.String</type>
  9. </attribute>
  10. </tag>

在页面上使用:

  1. <ex:msg message="show message from para">
  2. </ex:msg>
  3. ---------------
  4. <ex:msg>
  5. if message==null , then show body.
  6. </ex:msg>

如果想要使用传参,使用EL表达:

在java类中添加一个static方法:

  1. public static String hello(String name){
  2. return "Welcome: " + name;
  3. }

然后在tld中添加:

  1. <function>
  2. <name>welcome</name>
  3. <function-class>com.test.demo.StandardTag</function-class>
  4. <function-signature>java.lang.String hello(java.lang.String)</function-signature>
  5. <example>${ex:welcome('Ryan')}</example>
  6. </function>

然后页面上调用:

  1. ${ex:welcome('Leslie')}

在spring mvc 中,有个很好用的tag支持类RequestContextAwareTag,下面做一个简单的使用:

  1. public abstract class BaseTag extends RequestContextAwareTag {
  2. private static final EPCLogger LOGGER = EPCLogger.getLogger(BaseTag.class);
  3. private static final long serialVersionUID = -6258930875039222435L;
  4. private BeanUtils beanUtils = new BeanUtils();
  5. private HandlebarUtils handlebarUtils = new HandlebarUtils();
  6.  
  7. public abstract Object getModel();
  8.  
  9. public BaseTag() {
  10. }
  11.  
  12. public void renderHandlebarsView(String templateLocation) {
  13. try {
  14. Template e = this.handlebarUtils.compile(templateLocation);
  15. e.apply(this.getModel(), this.pageContext.getOut());
  16. } catch (Exception var3) {
  17. LOGGER.error(UITagsSystemEvent.BASE_TAG_ERROR, "Error occurred while rendering handlebars view.", var3);
  18. }
  19.  
  20. }
  21.  
  22. public Object getBean(String beanName) {
  23. Validate.notNull(beanName);
  24. return this.beanUtils.getBean(this.getRequestContext(), beanName);
  25. }
  26. }
  1. public class BeanUtils {
  2. public BeanUtils() {
  3. }
  4.  
  5. public Object getBean(RequestContext requestContext, String beanName) {
  6. return requestContext.getWebApplicationContext().getBean(beanName);
  7. }
  8. }

reference:

http://www.runoob.com/jsp/jsp-custom-tags.html

https://www.ibm.com/developerworks/cn/java/j-lo-jsp2tag/

JSP自定义tag的更多相关文章

  1. Jsp 自定义tag标签

    1转自:https://blog.csdn.net/yusimiao/article/details/46835617 Jsp自定义tag标签 自定义tag标签的好处 程序员可以自定一些特定功能的标记 ...

  2. JSP自定义tag控件标签

    JSP支持自定tag的方法,那就是直接讲JSP代码保存成*.tag或者*.tagx的标签定义文件.tag和tagx文件不仅支持经典jsp代码,各种标签模版代码,还支持xml样式的jsp指令代码. 按照 ...

  3. ylz框架外网之JSP 自定义TAG

    首先用到了ServletContext,全局容器的概念,之前不知道哪里有用,现在用到,这里解析的是一个sysCode的TAG,用于下拉框等选项的时候自动显示要选的内容.大致思路是,利用前一篇所说到的E ...

  4. jsp如何自定义tag的标签库?

    虽然和上一次的使用自定义的tld标签简化jsp的繁琐操作的有点不同,但是目的也是一致的.自定义tag比较简单. 1.新建tag标签 在WEB-INF目录下新建一个tags的文件夹,是自定义tag标签的 ...

  5. 自定义标签 与 JSTL(JSP Standard Tag Library)

    1.自定义标签 [理解]     [1]简介            > 在JSP2.0以后,在jsp页面中不建议使用脚本片段<% %>和JSP表达式<%= %>     ...

  6. JSP自定义标签之Hello Costom tag小例子

    1.项目结构 2.实现自定义tag所需依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId ...

  7. jsp中 自定义 tag的几种方式

    在jsp文件中,可以引用tag和tld文件. 1.对于tag文件,使用tagdir引用(这个直接是引用的后缀tag文件的jsp文件) <%@ taglib prefix="ui&quo ...

  8. JSP 自定义标签

    0 标签技术的API继承体系 1 作用 jsp自定义标签用于移除页面中的java代码 2 实现 2.1 标签处理类ViewIPTag.java package com.zsm.util; import ...

  9. JSP自定义标签开发入门

    一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发 ...

随机推荐

  1. checkbox选中状态不被改变

    让它的状态只能看不能改变,加上onclick="return false;". 也可以disabled="true";但是这个颜色变淡了; <input ...

  2. (转载)开始iOS 7中自动布局教程(一)

    这篇教程的前半部分被翻译出来很久了,我也是通过这个教程学会的IOS自动布局.但是后半部分(即本篇)一直未有翻译,正好最近跳坑翻译,就寻来这篇教程,进行翻译.前半部分已经转载至本博客,后半部分即本篇.学 ...

  3. numpy数组的操作

    numpy - 介绍.基本数据类型.多维数组ndarray及其内建函数 http://blog.csdn.net/pipisorry/article/details/22107553 http://w ...

  4. Default Parameter Values in Python

    Python’s handling of default parameter values is one of a few things that tends to trip up most new ...

  5. International Conference for Smart Health 2015 Call for Papers

    Advancing Informatics for healthcare and healthcare applications has become an international researc ...

  6. 玩转Windows服务系列——创建Windows服务

    创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Windows服务项目. 生成的解决方案包含两个项目:Servi ...

  7. CSharpGL(3)使用CSharpGL.vsix插件

    CSharpGL(3)使用CSharpGL.vsix插件 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更 ...

  8. JS数组定义及详解

    1.什么是数组 数组就是一组数据的集合 其表现形式就是内存中的一段连续的内存地址 数组名称其实就是连续内存地址的首地址 2.关于js中的数组特点 数组定义时无需指定数据类型 数组定义时可以无需指定数组 ...

  9. Java接口和抽象类的区别

    今天看到项目中,写了一个抽象类,里面有很多方法继承了这类,当调用这个接口时,采用的是这个抽象类去调方法的,当时一想,这个不就是我们说的Java的多态的特征: 继承:存在继承关系的子类和父类 重写:子类 ...

  10. The replication agent has not logged a progress message in 10 minutes.

    打开Replication Monitor,在Subscription Watch List Tab中,发现有大量的status= “Performance critical” 的黄色Warning, ...