java自定义标签 map_基于Spring MVC的自定义标签Tag
基于Spring MVC的自定义标签Tag
1.环境准备
本次小项目基于Spring
MVC进行测试呈现,项目依赖的jar文件列表如下:
2.搭建SpringMVC
Spring
MVC环境最关键的两个配置文件为spring配置文件与web.xml文件,spring配置文件主要声明controller的拦截,视图的解析方式等。而web.xml主要是集成spring的一些拦截器配置,字符编码配置等。具体参考如下:
springmvc-servlet.xml:
web.xml:
编写第一个Controller:
TagsController.java
package com.keith.smvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import
org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class TagsController {
@RequestMapping("/tags.do")
public
String getTagsPage(Model model) {
return "tags";
}
}
使用tomcat7运行该项目,项目正常启动,则表示Spring
MVC环节搭建已经成功。
3.编写自定义Tag标签
本次自定义的Tag标签,实现的是一个select下拉框,在实际很多项目中,下拉值集是比较常用的组件,而下拉值集的方式很多都定义为枚举,所以将其定义为一个tag标签,在开发过程中无疑将节省开发人员的很多编写代码时间,同时又能坐到复用,充分体现编程的高内聚、低耦合特性。
package com.keith.smvc.model;
public classEnumEntity {
private Long id;
private String enumCode;
private String enumValue;
private String enumTextCn;
private String enumTextEn;
private Integer
sortNumber;
private String description;
public Long getId() {
return id;
}
public void setId(Long
id)
{
this.id
=
id;
}
public String getEnumCode()
{
return enumCode;
}
public void setEnumCode(String
enumCode) {
this.enumCode
=
enumCode;
}
public String getEnumValue()
{
return enumValue;
}
public void setEnumValue(String
enumValue) {
this.enumValue
=
enumValue;
}
public String getEnumTextCn()
{
return enumTextCn;
}
public void setEnumTextCn(String
enumTextCn) {
this.enumTextCn
=
enumTextCn;
}
public String getEnumTextEn()
{
return enumTextEn;
}
public void setEnumTextEn(String
enumTextEn) {
this.enumTextEn
=
enumTextEn;
}
public Integer getSortNumber()
{
return sortNumber;
}
public void setSortNumber(Integer
sortNumber) {
this.sortNumber
=
sortNumber;
}
public String getDescription()
{
return description;
}
public void setDescription(String
description) {
this.description
=
description;
}
}
package
com.keith.smvc.service;
import
java.util.ArrayList;
import
java.util.List;
import
com.keith.smvc.model.EnumEntity;
public
class EnumService {
private List enumEntities = new ArrayList();
public List findEnumEntityAll() {
for (int i = 0; i < 5; i++) {
EnumEntity entity = new EnumEntity();
entity.setId(Long.valueOf(i + 1));
entity.setEnumCode("TEST_CODE_" + (i + 1));
entity.setEnumValue("TEST_VALUE_" + (i + 1));
entity.setEnumTextCn("测试枚举-"
+ (i + 1));
entity.setEnumTextEn("Test Enum " + (i + 1));
entity.setSortNumber((i + 1));
entity.setDescription("spring mvc self define tags.");
this.enumEntities.add(entity);
}
return this.enumEntities;
}
}
package com.keith.smvc.utils;
import org.apache.commons.lang3.RandomStringUtils;
public classPrimaryKeyUtils
{
public static Long
generateKeyByCountAndLength(int
count, int length)
{
StringBuffer key = new StringBuffer();
for (int
i =
0; i <
count; i++)
{
key.append(i
> 0 ?
generateByLength(length,
false) :
generateByLength(length,
true));
}
return Long.valueOf(key.toString());
}
public static String
generateByLength(int
length, boolean checkStartByZero) {
String key =
RandomStringUtils.randomNumeric(length);
return checkStartByZero &&
key.matches("^0\\d*$")
? generateByLength(length,
checkStartByZero) : key;
}
}
package
com.keith.smvc.tags;
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;
import
java.util.Map.Entry;
import
javax.servlet.jsp.JspException;
import
javax.servlet.jsp.JspTagException;
import
javax.servlet.jsp.tagext.BodyTagSupport;
import
javax.servlet.jsp.tagext.DynamicAttributes;
import
org.apache.commons.collections.CollectionUtils;
import
org.apache.commons.collections.MapUtils;
import
org.apache.commons.lang3.StringEscapeUtils;
import
org.apache.commons.lang3.StringUtils;
import
com.alibaba.fastjson.JSONObject;
import
com.alibaba.fastjson.serializer.SerializerFeature;
import
com.keith.smvc.model.EnumEntity;
import
com.keith.smvc.service.EnumService;
import
com.keith.smvc.utils.PrimaryKeyUtils;
public
class EnumTag extends BodyTagSupport implements DynamicAttributes
{
private static final long serialVersionUID =
3214120436850413923L;
private Map attributesMap = new HashMap();
@Override
public void setDynamicAttribute(String uri, String name, Object
value) throws JspException {
this.attributesMap.put(name, value);
}
private String buildSelectHTML() {
String superClass = "";
if (attributesMap.containsKey("class")) {
attributesMap.put("class", String.format("%s %s", superClass,
MapUtils.getString(attributesMap, "class")));
} else {
attributesMap.put("class", superClass);
}
if (!attributesMap.containsKey("id") &&
!attributesMap.containsKey("name")) {
Long key = PrimaryKeyUtils.generateKeyByCountAndLength(2,
4);
attributesMap.put("id", key);
attributesMap.put("name", key);
} else if (attributesMap.containsKey("id") &&
attributesMap.containsKey("name")) {
attributesMap.put("id", MapUtils.getString(attributesMap,
"id"));
attributesMap.put("name", MapUtils.getString(attributesMap,
"name"));
} else if (attributesMap.containsKey("id")) {
attributesMap.put("id", MapUtils.getString(attributesMap,
"id"));
} else if (attributesMap.containsKey("name")) {
attributesMap.put("name", MapUtils.getString(attributesMap,
"name"));
}
if (!attributesMap.containsKey("displayEmptyChoose")) {
attributesMap.put("displayEmptyChoose", true);
}
StringBuffer html = new StringBuffer();
html.append("--请选择--");
return html.toString();
}
private String convertTargetProperty() {
EnumService enumService = new EnumService();
ListenumEntities = enumService.findEnumEntityAll();
if (CollectionUtils.isEmpty(enumEntities)) {
return "";
}
return enumEntities.get(0).getEnumTextCn();
}
@Override
public int doStartTag() throws JspTagException {
return EVAL_BODY_BUFFERED;
}
@Override
public int doEndTag() throws JspTagException {
String type = MapUtils.getString(attributesMap, "type",
"SELECT");
String result = "";
try {
switch (type) {
case "SELECT":
result = this.buildSelectHTML();
break;
case "JSON":
result = JSONObject.toJSONString(new
EnumService().findEnumEntityAll(),
SerializerFeature.DisableCircularReferenceDetect);
break;
case "CONVERT":
result = this.convertTargetProperty();
break;
default:
break;
}
super.pageContext.getOut().print(result);
} catch (Exception e) {
throw new JspTagException(e.getMessage());
}
this.attributesMap.clear();
return SKIP_BODY;
}
}
如上为本次项目的所有用到的Java源码。
编写tag文件:
在项目的WEB-INF下新建一个文件夹:tld,在tld中新建tag文件framework.tld
<jsp-config>
<taglib>
<taglib-uri>/frameworktaglib-uri>
<taglib-location>/WEB-INF/tld/framework.tldtaglib-location>
taglib>
jsp-config>
编写测试的jsp页面:pages/tags.jsp
执行情况参见如下截图:
下拉框的change时间测试结果:
java自定义标签 map_基于Spring MVC的自定义标签Tag相关推荐
- Java泛型之mybatis,基于spring MVC 和 MyBatis 泛型的代码生成模板
原标题:基于spring MVC 和 MyBatis 泛型的代码生成模板 简单说明 这块代码生成工具是我抽空的时候方便自己使用而编写的,并不适合其他框架,这里由于项目原有,我并没有上传泛型部份的代码, ...
- java怎么设置404界面_如何使用Spring MVC显示自定义的404 Not Found页面
本篇文章给大家带来的内容是关于如何使用Spring MVC显示自定义的404 Not Found页面,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 不知道大家对千篇一律的404 No ...
- 我的java学习之路之Spring MVC
前言:从学习java web开始到现在开始学习框架,也有了小半年的时间.这期间的状态也是半懂不懂,好多东西知道代码怎么写,但是却说不出来是什么,所以想通过这样的方式记录下来,让自己印象更加深刻点 ps ...
- 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor
[Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...
- Spring MVC注解、标签库、国际化
本篇文章主要介绍自己在学习Spring MVC常用注解.标签库.国际化遇到的一些问题,分享给大家,希望对你有所帮助. 问题一:指定扫描包的位置 应该将所有控制器类都放在基本包下,并且指定该扫描包,避免 ...
- 【毕业设计_课程设计】基于Spring MVC的博客系统设计与实现
文章目录 0 项目说明 1 关于项目 2 效果预览 2.1 前台效果图 2.2 后台效果图 3 使用注意 4 使用步骤 5 项目源码 0 项目说明 基于Spring MVC的博客系统设计与实现 提示: ...
- Mr.张小白(案例:基于Spring MVC实现后台登陆系统验证)
基于Spring MVC实现后台登陆系统验证 一.步骤 1.引入相关依赖pom.xml <?xml version="1.0" encoding="UTF-8&qu ...
- Mr.张小白(案例:基于Spring MVC实现文件上传和下载)
基于Spring MVC实现文件上传和下载 一.步骤 1.引入相关依赖pom.xml <?xml version="1.0" encoding="UTF-8&quo ...
- 在基于Spring MVC的应用程序中配置favicon.ico
Favicon是与您的网站相关的图标(favicon.ico). 并非每个网站都在使用favicon. 但是大多数浏览器并不关心它,反正他们都要求它. 当图标图标不在适当位置时,服务器将返回不必要的4 ...
最新文章
- sprintf函数做什么用?
- 【mongodb系统学习之六】mongodb配置文件方式启动
- Android应用开发-onNewIntent()
- 安卓逆向_24( 一 ) --- Hook 框架 frida( Hook Java层 和 so层) )
- 苹果wwdc2019_我从苹果中学到的东西拒绝了我获得WWDC的奖学金
- 面试题 03.02. 栈的最小值
- 2.3 Hightway Networks
- 怎样才能打开Tuxera NTFS的主界面?
- c语言编程有限次数猜数游戏,用c语言编程猜数字
- 安川mpe720编程手册_南宁安川机器人学校
- 李宏毅-人类语言处理-成分句法分析
- 计算机网络上有个红叉没无线,电脑无线网络连接不上显示红叉
- CPU卡指令返回错误集
- Elasticsearch Nested 选型,先看这一篇!
- 中秋节后如何有面子的带女票回家?
- 八个有效解决眼睛进东西的方法
- 手机通讯录、联系人的备份、恢复经验
- 解决苹果手机按钮的圆角问题
- 墙裂推荐--几个Jupyter Notebook 超实用插件(一)
- Node-RED使用指南:22:定制化Node的使用方法
热门文章
- PHP ServerPush (推送) 技术的探讨
- 以色列全国路网遭到了网络攻击 造成交通拥堵
- 用户被忽悠 微软黑屏计划推至21日0点实施
- asp.net core 系列 18 web服务器实现
- 算法学习之路|链表元素分类
- 《中国人工智能学会通讯》——6.25 日落的教训
- 《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.15 本章小结...
- jQuery的三种$()
- Git workflow
- 剑指 offer set 28 实现 Singleton 模式