基于 Spring Boot 的 SSM 环境整合十二:使用JSP的自定义标签(tld)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xz2001/article/details/84831449

我曾经工作过在一个涉及社保和金融项目的公司,集团研发中心依据项目业务整理了一套完整的系统框架,除了对业务功能进行封闭外,还设计了一套完善的标签库,包括研发过程中使用到的各类组件,比如用户界面组件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.csdn.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>

现在再访问就正常了。

截止到目前的项目代码:https://download.csdn.net/download/xz2001/10831474

猜你喜欢

转载自blog.csdn.net/xz2001/article/details/84831449