巧用spring配置常量
--常量也可以DI
有一些常量数据类型,比如货币,省份,转帐类型,等等。我们程序里都是用他们的代码进行运算的,但在页面显示的时候只能用他的名称显示给用户看。
因此有下面特点:
1有键值对,
2不经常变化(支持偶尔有变化),
3常用在页面做下拉选择,
4在编辑页面的时候此选择项又必须默认选中,
5键值关系固定。
碰到这种情况,有很多解决方法。比如可以在页面硬编码,把每个常量一一在页面写死,这样做的后果是代码很多,如果多个页面都包含此常量那么增加了维护的难度,另外一种是使用
<
fmt:message
/>
+属性文件来处理,虽然有所改善,但不能使用
<c:if>
测试和比较。下面我推荐一种方法,希望能对大家有所帮助。实现步骤如下:
1、 写一个公用工具类,所有的属性通过Spring启动时候注入
public class MyConstantUtils {
public static MyConstantUtils obj;
public MyConstantUtils (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:message
/>
+属性文件 有下面好处:
1、可以遍历所有的选项,也可以不需要遍历,即可只取出某一个。例如当在查询列表中从后台传来的是货币代码,那么直接取出显示:
<
td
><
c:out
value
=
"${MyConstantUtils.currTypes[dep.currType]}"/></td>
2、回显时可以
<c:if>
测试被选中的选项,如上面的代码将 RMB改为变量即可
3、不需要专门的读取解析配置文件
4、类和jsp中都可以方便使用
5、可扩展性好,虽然是常量但也有可能变化,如增加一个新的货币的时候,只修改配置文件即可,jsp不用修改
6、使得jsp代码更加简洁
缺点时:不完全支持国际化