select标签和map的综合运用小结
因为工作接触到的是一些传统界面,所有的JSP编码也相对传统,当面对客户需求变更的时候,可能仅仅是加一个字段,但是却需要我修改很多的界面,在后来不断的开发,总结后,针对界面上select标签的一些显示和处理给出了一定的优化,反正在ssh框架和springmvc项目中都是可以用到的,小弟刚从事软件开发一年,还处于入门级别的。只是把自己的一点经验拿出来做做分享。还望前辈们多多指点。
在一个JSP中,常常在select标签下有如下的代码
第一境界:
<select name="XXXX" >
<option value="">=请选择=</option>
<option value="1" c:if test="${object.value=='1'}">selected</c:if>>名称1</option>
<option value="2" <c:if test="${object.value=='2'}">selected</c:if>>名称2</option>
<option value="3" <c:if test="${object.value=='3'}">selected</c:if>>名称3</option>
<option value="4" <c:if test="${object.value=='4'}">selected</c:if>>名称4</option>
<option value="5" <c:if test="${object.value=='5'}">selected</c:if>>名称5</option>
<option value="6" <c:if test="${object.value=='6'}">selected</c:if>>名称6</option>
<option value="7" <c:if test="${object.value=='7'}">selected</c:if>>名称7</option>
<option value="8" <c:if test="${object.value=='8'}">selected</c:if>>名称8</option>
<option value="9" <c:if test="${object.value=='8'}">selected</c:if>>名称9</option>
</select>
而在对应的显示中又会有
<c:choose>
<c:when test="${object.value=='1'}">名称1</c:when>
<c:when test="${object.value=='2'}">名称2</c:when>
<c:when test="${object.value=='3'}">名称3</c:when>
<c:when test="${object.value=='4'}">名称4</c:when>
<c:when test="${object.value=='5'}">名称5</c:when>
<c:when test="${object.value=='6'}">名称6</c:when>
<c:when test="${object.value=='7'}">名称7</c:when>
<c:when test="${object.value=='8'}">名称8</c:when>
<c:when test="${object.value=='9'}">名称9</c:when>
</c:choose>
在传统的项目中,难免再在设计初期会有这样的设计,单据的状态,一个表月另外一个表的关联查询,为了节省数据库的空间,常常用数字去代替字符串,这是常见的现象,对随着时间的推移,客户对流程的变更,对对象属性的变更,往往一个小小的变化,需要我们区所有带有这些标签的jsp去复制粘贴代码,重复而无意义,但是很花时间。
第二境界:
在这个时候可以考虑采取 map的方式来控制。
首先 声明 静态不可修改类 这里采用的是LinkedHashMap 是为了控制顺序,尤其是当key为 负数的时候
public class Constant{
public static final Map<String,String> _maps = new LinkedHashMap<String,String>(){
{put("1","名称1");}
{put("2","名称2");}
{put("3","名称3");}
{put("4","名称4");}
{put("5","名称5");}
{put("6","名称6");}
{put("7","名称7");}
{put("8","名称8");}
{put("9","名称9");}
};
}
然后在对应的跳到每个jsp前的ACTION或CONTROLLER中 加入这个对象
requst.setAttribute(“maps ”,Constant.maps );或者mav.addObject(“maps ”,Constant.maps );
这样在jsp中可以
这样引用
<select name="XXXX" >
<option value="">=请选择=</option>
<c:forEach items="${maps }" var="map ">
<option value="${map.key>" <c:if test="${object.value eq map.key}" >selected<c:if> >${map.value></option>
</c:forEach>
</select>
显示的时候
${maps[object.value]};
相对以前的代码来说大大减小了JSP的代码量,而且在发生需求变更的时候,只要去改下配置的这个map就可以了。不用再担心jsp有漏改或错改的现象。
而在当这种map普遍使用后,我们的ACTION或CONTROLLER层的代码总有 request.set或mav.add这样的重复代码,而这些map又是经常使用的,所以可以在服务一启动的时候
第三境界:
把他直接加到 application中,或者自己将其对应的封装,这样不仅仅简化了jsp的代码量,也减少了控制层的代码量。
关于三种常用MAP的测试,常用的map为hashmap,treemap。而今天使用了linkedhashmap,发现这个map是目前来说最符合我工作需要的。所写即所得,我如何写入的,他就如何排序。以下是简易的代码demo。
public static final Map<String,String> _HashMap = new HashMap<String,String>(){
{put("-0","aa");}
{put("0","+aa");}
{put("-1","bb");}
{put("1","+bb");}
{put("-2","cc");}
{put("2","+cc");}
};
public static final Map<String,String> _TreeMap = new TreeMap<String,String>(){
{put("-0","aa");}
{put("0","+aa");}
{put("-1","bb");}
{put("1","+bb");}
{put("-2","cc");}
{put("2","+cc");}
};
public static final Map<String,String> _LinkedHashMap = new LinkedHashMap<String,String>(){
{put("-0","aa");}
{put("0","+aa");}
{put("-1","bb");}
{put("1","+bb");}
{put("-2","cc");}
{put("2","+cc");}
};
public static void main(String args[]){
System.out.println("------hashMap--------");
for(String key:_HashMap.keySet()){
System.out.println(_HashMap.get(key));
}
System.out.println("------TreeMap--------");
for(String key:_TreeMap.keySet()){
System.out.println(_HashMap.get(key));
}
System.out.println("------_LinkedHashMap--------");
for(String key:_LinkedHashMap.keySet()){
System.out.println(_LinkedHashMap.get(key));
}
输出结果
——hashMap——–
+cc
+bb
aa
+aa
cc
bb
——TreeMap——–
aa
bb
cc
+aa
+bb
+cc
——_LinkedHashMap——–
aa
+aa
bb
+bb
cc
+cc
使用linkedhashmap可以在修改和显示流程状态上起到事倍功半的效果。