有一些常量数据类型,比如货币,省份,转帐类型,等等。我们程序里都是用他们的代码进行运算的,但在页面显示的时候只能用他的名称显示给用户看。

  因此有下面特点:

   1有键值对,
   2不经常变化(支持偶尔有变化),
   3常用在页面做下拉选择,
   4在编辑页面的时候此选择项又必须默认选中,
   5键值关系固定。

  碰到这种情况,有很多解决方法。比如可以在页面硬编码,把每个常量一一在页面写死,这样做的后果是代码很多,如果多个页面都包含此常量那么增加了维护的难度,另外一种是使用<fmt:messag/>+属性文件来处理,虽然有所改善,但不能使用<c:if>测试和比较。下面我推荐一种方法,希望能对大家有所帮助。实现步骤如下:

1、 写一个公用工具类,所有的属性通过Spring启动时候注入 


public class MyConstantUtils { 


public static IBPConstantUtils obj; 

public IBPConstantUtils (String string) { 

obj = this; 

} 

/** 

* 货币类型键值对 Spring启动的时候注入 

*/ 

public Map currTypes; 

public Map getCurrTypes() { 

return currTypes; 

} 

public void setCurrTypes(Map currTypes) { 

this.currTypes = currTypes; 

} 

//其他常量…… 

} 


  2、 配置文件web-xxx.xml,建议用一个单独的文件来配置常量。 


<!-- 在配置文件中配置常量 --> 

<bean id="currTypes" class="java.util.HashMap"> 

<constructor-arg> 

<map> 

<entry key="USD"> 

<value>美元</value> 

</entry> 

<entry key="HKD"> 

<value>港元</value> 

</entry> 

<entry key="EUR"> 

<value>欧元</value> 

</entry> 

<entry key="JPY"> 

<value>日元</value> 

</entry> 

<entry key="AUD"> 

<value>AUD</value> 

</entry> 

<entry key="RMB"> 

<value>人民币</value> 

</entry> 

</map> 

</constructor-arg> 

</bean> 

<bean id="toolsUtils" class="com.xyz.util.MyConstantUtils "> 

<constructor-arg> 

<value>开始初始化工具类对象</value> 

</constructor-arg> 

<!-- 将常量注入单例对象中 --> 

<property name="currTypes"> 

<ref bean="currTypes"/> 

</property> 

</bean> 


  3、在jsp中,由于我们用的是springMVC,一般定义一个包含一些常用标签的jsp,如文件taglib.jsp: 


<!-- taglibs.jsp --> 

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> 

<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %> 

<% request.setAttribute("MyConstantUtils",com.xyz.util.MyConstantUtils.obj); %> 


  在上面的jsp中随便将我们的静态对象保存在request中,在其他jsp文件中include进来即可使用我们在配置文件中的常量,如下面: 


<%@include file="taglibs.jsp"%> 

……… 

<tr align="center"> 

<td height="30" align="left"> 

<div align="right">币种*</div> 

</td> 

<td width="78%" height="30" align="left"> 

<select name="currType"> 

<c:forEach items="${MyConstantUtils.currTypes}"var="currType"> 

<option value='<c:outvalue="${currType.key}"/>'<c:iftest='${currType.key == "RMB"}'>selected</c:if>><c:out 

value="${currType.value}"/></option> 

</c:forEach> 

</select> 

</td> 

</tr> 

………………. 


  相对使用 <fmt:messag/>+属性文件 有下面好处: 


   1、可以遍历所有的选项,也可以不需要遍历,即可只取出某一个。例如当在查询列表中从后台传来的是货币代码,那么直接取出显示: 

<td><c:out value="${MyConstantUtils.currTypes[dep.currType]}"/></td> 

   2、回显时可以<c:if>测试被选中的选项,如上面的代码将 RMB改为变量即可 

   3、不需要专门的读取解析配置文件 

   4、类和jsp中都可以方便使用 

   5、可扩展性好,虽然是常量但也有可能变化,如增加一个新的货币的时候,只修改配置文件即可,jsp不用修改 

   6、使得jsp代码更加简洁



  缺点时:不完全支持国际化