虽然枚举类已经在
jdk1.5
中已经推出来,但是它的应用还不是很广泛,究竟其原因,有以下几个方面:
-
虽然
hibernate,ibatis
可以支持
enun
,但是出于稳定性的原因,大多数公司选择旧的、稳定的版本。
-
前端框架
strut2
对
enum
的支持不够,无法轻松的映射枚举型,增加开发难度。
-
编程习惯的问题,大多数开发人员已经习惯使用
Interface
来定义常量。
-
enum
类的了解程度不深。
如果要使用
Enum,
必须解决两个问题
-
在公司未采用支持
Enum
的数据层框架时,可以使用
Enum。
-
在公司采用支持
Enum
的数据层框架后,可以减少升级时间、提升效率。
-
使得struts2能够支持enum。
废话不多说,开始实施我们的方案,方案基于(strut2+freemarker).
第一步:编写Enum
import java.util.LinkedHashMap;
import java.util.Map;
public enum SettlementCycle implements ConstantSupport{
Buyout{
public String cnName(){
return "买断";
}
},
BillCycle{
public String cnName(){
return "单结";
}
},
WeekCycle{
public String cnName(){
return "每周";
}
},
MonthCycle{
public String cnName(){
return "每月";
}
},
QuarterCycle{
public String cnName(){
return "每季";
}
},
SemiannualCycle{
public String cnName(){
return "每半年";
}
},
YearCycle{
public String cnName(){
return "每年";
}; //年桔
};
private static final Map<Integer,String> ordinalMap;
private static final Map<String,String> stringMap;
static{
ordinalMap = new LinkedHashMap<Integer,String>();
for(SettlementCycle cycle:SettlementCycle.values()){
ordinalMap.put(cycle.ordinal(),cycle.cnName());
}
stringMap = new LinkedHashMap<String,String>();
for(SettlementCycle cycle:SettlementCycle.values()){
stringMap.put(cycle.name(),cycle.cnName());
}
}
public static Map ordinalMap(){
return ordinalMap;
}
public static Map stringMap(){
return stringMap;
}
public static String cnName(int i){
return SettlementCycle.values()[i].cnName();
}
}
第二步:增加EnumerationConverter使得struts2支持Enum的转化。
import ognl.DefaultTypeConverter;
import java.util.Map;
public class EnumerationConverter extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
if (toType.isEnum()) {
if (value == null)return null;
if (value instanceof String[]) {
String[] ss = (String[]) value;
if (ss.length == 1) {
return Enum.valueOf(toType, ss[0]);
} else {
Object[] oo = new Object[ss.length];
for (int i = 0; i < ss.length; i++) {
oo[i] = Enum.valueOf(toType, ss[i]);
}
return oo;
}
}
}
return super.convertValue(context, value, toType);
}
}
第三步:往struts.xml添加语句,使得struts可以访问静态方法
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />
第四步:在
freemarker调用enum
-
在下拉列表,单选框、复选框中使用enum
<@s.select list="@xx.SettlementCycle@ordinalMap()" name="contract.cycle" />
<@s.radio list="@xx.SettlementCycle@ordinalMap()" name="contract.cycle" />
<@s.checkboxlist list="@xx.SettlementCycle@ordinalMap()" name="contract.cycle" />
-
在
freemaker
显示枚举的中文名
<@s.property value=” @xx.SettlementCycle@cnName(name)”/>
其中第二部的enum转化器是从网络上获取的
如果更好的建议,欢迎拍砖:)
分享到:
相关推荐
在Struts2中,它通常用来生成视图层的内容,允许开发者将业务逻辑与显示逻辑分离。 4. **ognl-3.0.21.jar**:Object-Graph Navigation Language (OGNL) 是一个强大的表达式语言,用于获取和设置Java对象的属性。在...
在Struts2中,如果Action类的属性是枚举类型,系统默认可能无法正确地将字符串请求参数转化为枚举实例。为了解决这个问题,我们可以创建自定义的枚举值转换器。这个转换器需要实现`org.apache.struts2.conversion....
在Struts2中,Action是处理用户请求的核心对象,它可以定义一系列的执行方法,每个方法对应一个HTTP请求。Interceptor(拦截器)是Struts2的一大特色,它允许在Action执行前后插入自定义的处理逻辑,如权限检查、...
2. **枚举**:Struts2中的Action和Result类型通常使用枚举表示,但在JDK1.4中,需要使用常量类来模拟枚举的行为。 3. **注解**:Struts2利用注解简化配置,但在JDK1.4中,需要依赖XML配置文件来定义Action、结果和...
3. `ognl.jar`: Object-Graph Navigation Language (OGNL) 是Struts2中的表达式语言,用于在模型、视图和控制器之间传递数据。 4. `freemarker.jar`: Freemarker是一个模板引擎,用于生成动态HTML或其他类型的文档...
在Struts2中,OGNL用于处理用户输入并在视图层和模型层之间传递数据。然而,当OGNL表达式不受限制地执行时,攻击者可以构造恶意输入来访问和操纵应用程序内部的私有或敏感属性。 在描述中提到的jsp脚本中,作者试图...
在Struts2中,这些参数可以直接通过表单元素的`name`属性与Action类中的属性相匹配,无需额外配置即可实现自动绑定。 例如,下面的HTML代码展示了一个简单的表单,其中包含了一个文本框和一个下拉框,分别用于输入...
在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于访问和操作对象图。这篇博客文章"Struts2对Ognl的封装--TypeConverter"探讨了Struts2如何通过TypeConverter机制来增强OGNL的...
在Struts2框架中,标签库是其重要组成部分,它提供了丰富的标签来帮助开发者构建用户界面,使得代码更加简洁、易读且易于维护。"struts2-tags-API.rar"这个压缩包文件很可能包含了Struts2标签库的详细API文档,用于...
本篇文章主要关注Struts2中的常用标签,这些标签大大简化了Web开发中的一些常见任务。 首先,我们要明白Struts2标签库与Struts1.x的不同之处。在Struts1.x中,标签库按照功能划分为HTML、Tiles、Logic和Bean等几个...
Struts2标签库是Java开发Web应用时,用于构建动态JSP页面的重要工具,它极大地简化了视图层的开发工作。Struts2提供了一系列丰富的标签,这些标签可以帮助开发者更高效地处理各种业务逻辑和数据显示。 首先,Struts...
在Struts2中,类型转换是一项关键功能,它允许框架将用户输入的数据自动转换为应用程序需要的特定数据类型。这篇博客文章可能是关于Struts2内部的类型转换机制及其使用的探讨。 在Struts2中,类型转换是通过`...
4. 在src目录下创建struts.xml配置文件,引入struts2的核心dtd规范,这个规范可以从struts2-core-2.3.24.jar中的struts-default.xml获取。 5. 配置Eclipse,使其在编辑struts.xml时能提供代码提示。这需要添加...
**Apache Struts2** 是一个基于MVC架构的开源Web应用程序框架,广泛应用于Java EE的企业级应用开发中。然而,在2017年3月,**Apache Struts2** 被发现存在一个严重漏洞——**S2-045**。此漏洞出现在 **Jakarta ...
在Struts2中,类型转换器(TypeConverter)扮演着关键角色,它负责将HTTP请求参数转换为Action类中相应属性的正确数据类型。本教程主要探讨Struts2.1源代码中的自定义类型转换器。 1. **类型转换器的作用** 类型...
下面我们将从Struts1.x与Struts2.0标签库的对比入手,再深入探讨Struts2中的非UI标签。 ##### 2.1 Struts1.x与Struts2.0 标签库对比 - **分类**:Struts1.x的标签库按照功能划分为HTML、Tiles、Logic和Bean等几个...
5. **表达式语言**:介绍OGNL(Object-Graph Navigation Language),它是Struts2中的默认表达式语言。 6. **标签库**:详细解析各种视图层标签,如`s:textfield`、`s:select`等,以及如何在JSP页面中使用它们。 7. ...
在实际开发中,一个SSH项目会包含各种配置文件(如struts-config.xml、hibernate.cfg.xml)、Java源代码(Action类、DAO类、Service类等)、JSP页面以及数据库脚本等。开发者通常会利用IDE(如Eclipse或IntelliJ ...
8. **枚举类型**:它的用法和特性,以及在设计模式中的应用。 9. **内部类与匿名类**:理解它们的用途和创建方式。 10. **Java集合框架**:List、Set、Queue和Map接口,以及它们的实现类如ArrayList、LinkedList、...