基于 Spring Boot 的 SSM 环境整合十二:使用JSP的自定义标签(tld)
我曾经工作过在一个涉及社保和金融项目的公司,集团研发中心依据项目业务整理了一套完整的系统框架,除了对业务功能进行封闭外,还设计了一套完善的标签库,包括研发过程中使用到的各类组件,比如用户界面组件dropdownlist、tree、numberinput、textinput、button、grid、treegrid、searchgrid等,这些组件大大减少了开发人员的时间。虽然页面效果不太漂亮,对各类浏览器兼容也不够友好,但这拓展了我的对软件系统的设计思想。
下文,我将在项目中整合JSP的自定义标签,并做一个简单的DEMO。复杂的功能,后文逐渐加入。
1、修改pom.xml
老套路,要使用资源就必须引入资源:
<!-- 引入 jsp 的相关特性 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2.1-b03</version>
</dependency>
2、开发一个简单的标签对象
为了演示效果,我们写一个输入当前时间的标签对象:
package com.whowii.website4.libs.tag;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class DateTimeTag extends TagSupport {
private static final long serialVersionUID = 5897918233973977850L;
@Override
public int doStartTag() throws JspException {
try {
JspWriter out = this.pageContext.getOut();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
out.println("[" + df.format(new Date()) + "]");
} catch (Exception e) {
throw new JspException(e.getMessage());
}
return SKIP_BODY;
}
@Override
public int doEndTag() throws JspException {
return EVAL_PAGE;
}
@Override
public void release() {
super.release();
}
}
3、创建tld标签
首先创建目录“src/main/webapp”,并设为编译目录:
在此目录下再创建两级子目录“WEB-INF/tld“,并在其下新建标签文件“tags.tld”。因为无法在web.xml中配置,所以必须放在这里,否则报错提示找不到tld。完成后的目录结构如下:
tags.tld 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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 web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>t</short-name>
<uri>/tags</uri>
<tag>
<name>DateTime</name>
<tag-class>com.whowii.website4.libs.tag.DateTimeTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
4、在页面中使用标签
修改前文Demo页面如下:
<#assign t=JspTaglibs["/WEB-INF/tld/tags.tld"] />
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>demo - index</title>
</head>
<body>
<h1>demo-index.html - spring boot demo page</h1>
<br>用户名称:${username}
<br>
<br>返回结果:${result}
<br>当前时间:<@t.DateTime />
</body>
</html>
5、测试结果
启动应用,访问DEMO页面如下:
效果有了,可MyEclipse控制台输出一个警告:
大致的意思是freemarker不会加载el函数,我百度了很多,结合很多文章的说明,以及(https://blog.****.net/juan0728juan/article/details/79649098?utm_source=blogxgwz2)解决方案,修改上文。
6、解决freemarker警告
第一步,新建一个tld配置类,并扫描所有的tld:
package com.whowii.website4.config;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import freemarker.ext.jsp.TaglibFactory;
@Configuration
public class TldConfig extends WebMvcConfigurerAdapter {
@Autowired
private FreeMarkerConfigurer configurer;
@PostConstruct
public void freeMarkerConfigurer() {
List<String> tlds = new ArrayList<String>();
// tlds.add("/WEB-INF/tld/tags.tld"); 启用时报错
TaglibFactory taglibFactory = configurer.getTaglibFactory();
taglibFactory.setClasspathTlds(tlds);
if (taglibFactory.getObjectWrapper() == null) {
taglibFactory.setObjectWrapper(configurer.getConfiguration().getObjectWrapper());
}
}
}
第二步,修改demo页面:
<#assign t=JspTaglibs["/WEB-INF/tld/tags.tld"] />
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>demo - index</title>
</head>
<body>
<h1>demo-index.html - spring boot demo page</h1>
<br>用户名称:${username}
<br>
<br>返回结果:${result}
<br>当前时间:<@t.DateTime />
</body>
</html>
现在再访问就正常了。