首先,推荐一下站里的这篇经典文章:
http://struts2.group.iteye.com/group/wiki/1463-taglib-the-eternal-debate-topic文中的许多观点到现在还是非常有参考价值。文章写于2009年,又是4年多过去,一些外部环境发生了变化。
>Spring MVC超越了Struts 成为了MVC框架的首选。
>对于前端使用JSP的应用来说,JSTL+EL表达式混合使用是开发的“标准方式”。
>自定义标签的应用依然非常广泛。
按上文的观点,标签分为 逻辑控制类,数据输出类,页面组件类 。
前两种相对简单,本文主要涉及应用中较复杂的 页面组件类标签。
个人认为开发中需要提取共通UI代码应根据实际需求按以下顺序考虑实现。
框架标签 > 标签文件 > taglib标签 > 脚本方式
●框架标签
优点:稳定可靠,代码维护性好。 (相比来说SpringMVC对标签的支持远不如Strus)
缺点:无法与后台交互。
应用例:一般用于简化通用标签的书写
●标签文件
优点:特别适用于复杂的自定义UI封装。
缺点:和框架标签一样,没有给后台的入参,也不适用于动态应用。
应用例:比如分页,排序一类标签(
http://duanhengbin.iteye.com/admin/blogs/1998017)
●taglib标签
优点:封装性较好,装载数据全在标签代码中。
标签入参可以根据需要自定义,也就是前端可以“影响”后台的实现。
缺点:代码的开发和调试都比较繁琐,还需要做 tld文件。
只能用于页面初期展示阶段,对于“纯前端”的动作无能为力了。
应用例:数据字典下拉框 (见下文)
●脚本方式
优点:JS提共通较为简单,灵活性最高,可以应对几乎任何需求
缺点:前端代码会多些。主要是后台做数据加载也比较麻烦,所需数据通过页面自己加载,即相关的所有Controller层代码都需要修改,代码通用性和维护性都比较差。不是特殊需求不建议使用这种方式。
应用例:比如需要将 数据字典下拉框动态加入到table中,只有通过JS拼装的方式
【taglib标签 实现通用数据字典展示例子】
●taglib类(推荐继承SimpleTagSupport,代码比较简洁)
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import org.apache.commons.jxpath.JXPathContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import cn.com.intasect.ots.dto.DictionaryDTO;
import cn.com.intasect.ots.service.IDictionaryService;
public class DictorySelectTag2 extends SimpleTagSupport {
private String id; //必设项目:设置select的id
private String typecode; //必设项目:对应数据字典中"字典类型类型"
private String name; //必设项目:form提交用
private String typeid; //对应数据字典中"字典ID"(不设置时默认显示第一项)
private static List<DictionaryDTO> dictionaryList = null;
/**
* 缓存数据字典
*/
private void loadDictionaryList(){
if ( dictionaryList==null){
ServletContext servletContext = ((PageContext) this.getJspContext()).getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
IDictionaryService dictoryService = (IDictionaryService) wac.getBean("dictionaryServiceImpl");
dictionaryList = dictoryService.selectAll();
}
}
@Override
public void doTag() throws IOException, JspException {
loadDictionaryList();
JspContext jspContext = getJspContext();
JspWriter out = jspContext.getOut();
StringBuffer sb = new StringBuffer();
//拼装select项目内容
sb.append("\n<select")
.append(" id='").append(id).append("'")
.append(" name='").append(name).append("'")
.append(" value='").append(typeid==null?"":typeid).append("'")
.append(">\n");
//此处使用 Commons JXPath 做对象查询
String condition = ".[cDictTypeCode='"+ typecode +"']";
JXPathContext context = JXPathContext.newContext(dictionaryList);
sb.append("<option value=null>--请选择--</option>\n");
//拼装option项目内容
for(@SuppressWarnings("rawtypes")Iterator iter = context.iterate(condition); iter.hasNext();){
DictionaryDTO dto = (DictionaryDTO)iter.next();
sb.append("<option")
.append(" value='").append(dto.getnDictid()).append("'")
.append(dto.getnDictid().equals(typeid)?" selected='selected'":"")
.append(">")
.append(dto.getcDictTypeName())
.append("</option>\n");
}
sb.append("</select>\n");
out.print(sb.toString());
}
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setTypecode(String typecode) {
this.typecode = typecode;
}
public void setTypeid(String typeid) {
this.typeid = typeid;
}
}
●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 web-jsptaglibrary_2_1.xsd"
version="2.1">
<description>dictionary tag</description>
<tlib-version>1.0</tlib-version>
<short-name>dictionary tag</short-name>
<tag>
<name>select</name>
<tag-class>com.test.tags.DictorySelectTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>id</name>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
<attribute>
<name>name</name>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
<attribute>
<name>typecode</name>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
<attribute>
<name>typeid</name>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
●应用代码
JSP的头部加入引用
<%@ taglib prefix="tags" uri="/WEB-INF/tags-tld/dict_tags.tld" %>
标签代码
<tags:select id='levelSelect' name='levelId' typecode='DICT_LEVEL' typeid='${levelId}'/>
【脚本方式 实现通用数据字典展示例子】
后台代码,对于所有应用了该功能的相关Controller类需要加上以下代码
@Resource
private IDictionaryService dictoryService;
@ModelAttribute("dict")
public List<DictionaryDTO> getDictionary(){
return dictoryService.selectAll();
}
前端代码非本文重点,略
分享到:
相关推荐
Unity UI脚本生成器是一个工具,它可以帮助Unity开发者更高效地创建和管理用户界面(UI)的脚本。在Unity引擎中,UI系统是通过Unity的Canvas和各种UI组件(如Image、Text、Button等)来构建的。然而,手动编写和组织...
标签"unityui脚本丢失"明确了问题的核心,即Unity UI的脚本引用在版本转换后出现问题。这可能是因为Unity 2019中引入的新特性和API在Unity 2018中不存在,或者是由于不同版本的序列化机制差异导致的。修复工具的目标...
\plugins\`:这是一些第三方插件的集合,用于扩展框架的功能,如图表、日期选择器、表单验证等。 9. `?????????ui??\??\plugins\layui\`:Layui是一个流行的前端轻量级框架,它提供了丰富的组件和模块,如表格、按钮...
使用SeleniumIDE录制UI自动化测试脚本 SeleniumIDE是一款功能强大且广泛应用的UI自动化测试工具,它可以快速地录制和重播UI自动化测试脚本。在本文中,我们将详细介绍如何使用SeleniumIDE录制UI自动化测试脚本,并...
unity ugui UI脚本自动生成工具,可以生成C# 和 Lua 脚本,还可以在面板上预览生成的脚本
"DatePicker for UnityUI" 是一个专门为Unity设计的日期选择组件,它使得在Unity界面中集成日期选择功能变得更加简单易行。这个插件特别适合那些需要用户输入特定日期或基于日期进行操作的游戏或应用。 在Unity中,...
unity-ui-typewriter 打字机脚本 文本打字机脚本 这是一个小型C#脚本,用于实时模拟打字文本。非常适合打字机或计算机终端。您可以自由更改脚本并在项目中使用它。如果您决定使用该脚本,我希望您能在项目中提供链接...
总结起来,UnityUI的DatePicker工具为开发者提供了一种直观、易用的日期选择方式。通过合理配置和扩展,我们可以构建出满足各种需求的日期选择界面,提升游戏的用户体验。无论你是新手还是经验丰富的开发者,掌握...
在MT5平台上使用UI.mq5脚本,交易者可以自定义设置,如时间周期、数据类型(开盘价、收盘价、最高价、最低价)等,来计算特定时间段内的UI指数。通过图形化展示,交易者可以直观地看到UI指数的变化趋势,帮助识别...
JavaScript应用实例-脚本管理工具UI示例.js
本资源主要介绍VisionPro脚本简单实现文本显示以及创建标签的功能。
OperaMasks UI的标签功能可能包括动态添加和删除标签,以及通过拖放等方式进行排列和组织。 "ui"标签则意味着这是一个用户界面相关的工具或框架,它关注的是交互设计和视觉呈现,确保用户能够直观、舒适地与应用...
1. **一键创建链接**:用户可以选择一个文件夹或多个文件,脚本会自动为这些文件或文件夹创建共享链接,无需逐个手动操作。这对于需要频繁分享文件或文件夹的用户来说,极大地提高了工作效率。 2. **下载链接**:...
压缩包内的DoozyUI Complete UI Management System 3.0c0.unitypackage文件是Unity3D的资源包格式,包含了DoozyUI的所有组件、脚本和预设。导入这个包到Unity项目中,即可开始使用DoozyUI的所有功能。同时,网络上...
本教程将聚焦于“Unity3D中UI弧形轮番旋转”这一技术,旨在实现类似《英雄联盟》中选择皮肤时的3D滚动视图效果。这个效果不仅增加了界面的动态感,还为用户提供了一种独特的方式来浏览和选择内容。我们将会探讨如何...
7. **可视化编辑**:DoozyUI可能包含一个可视化编辑器,允许非程序员或设计师通过拖放方式构建和布局UI,降低技术门槛。 8. **多语言支持**:对于国际化应用,DoozyUI可能提供多语言支持,方便添加和管理不同语言的...
Unity UI CurvedUI VR曲面界面是一个专门设计用于虚拟现实(VR)环境的用户界面解决方案。这个工具包允许开发者创建的界面元素不仅限于传统的2D平面,而是能够在3D空间中以曲面的形式展现,为用户提供更加沉浸式和...
在IT行业中,WebUI自动化测试是一项关键任务,用于确保网页应用程序的功能性和用户界面的稳定性。本项目专注于构建一套全面的自动化测试解决方案,尤其强调了截图和录屏功能,以及元素的多方式定位,这些特性使得...
【115转存助手UI优化版3.4.1】是一个针对115网盘用户的辅助工具,其主要功能是提升用户界面(UI)的使用体验和效率。UI优化版意味着开发者对软件的用户界面进行了精心设计和改进,旨在提供更加直观、美观且易用的...
适合ligerui上实现图片上传