需求背景
今天在做前台数据展示处理时,使用到了el表达式来判断,正常使用eq或==,无效,代码如下
<div>
<c:if test="${myparam.isUse eq '1'}">
<input type="radio" name="isUse" class="required myinput" value="1" checked />
<p>启用</p>
<input type="radio" name="isUse" class="required myinput" value="0" />
<p>禁用</p>
</c:if>
<c:if test="${myparam.isUse eq '0'}">
<input type="radio" name="isUse" class="required myinput" value="1" />
<p>启用</p>
<input type="radio" name="isUse" class="required myinput" value="0" checked/>
<p>禁用</p>
</c:if>
</div>
目的就是根据后台的值,来默认进行回显(此处代码,可优化,后面会附上);这里的isUse是明确为1且为字符,但是没有执行代码。
问题解决
前后台都检查了一遍,并没有语法问题,与正常使用el表达式的唯一区别就是,我这里的变量是一个字符,而非字符串,
/**
* 群组状态是否启用:0表示禁用,1表示启用
* @return
*/
private char isUse;
public char getIsUse() {
return isUse;
}
public void setIsUse(char isUse) {
this.isUse = isUse;
}
也查了相关资料,找到以下解决方法。
方法一
在后台传值时,将字符转化为字符串。前台不变,显示正常
param.put("isUse", tbBizType.getIsUse()+"");//直接加上空字符串即可
方法二
在前台进行处理,使用charAt(0)方法获取字符,进行比较,代码如下,
<div>
<input type="radio" name="isUse" class="required myinput" value="1"
${myparam.isUse=='1'.charAt(0)?'checked':''}>
<p>启用</p>
<input type="radio" name="isUse" class="required myinput" value="0"
${myparam.isUse=='0'.charAt(0)?'checked':''}>
<p>禁用</p>
<div>
方式三
将字符转化为整数,因为这里我使用的字符值只是0或者1,所以在前端可以只是使用0或者1的编码值进行比较
0的编码对应的是49,1的编码对应的是50,代码如下:
<div>
<input type="radio" name="isUse" class="required myinput" value="1"
${myparam.isUse==49?'checked':''}>
<p>启用</p>
<input type="radio" name="isUse" class="required myinput" value="0"
${myparam.isUse==48?'checked':''}>
<p>禁用</p>
<div>
方式四
使用枚举,将可能的值定义为一个枚举,并使用它声明变量,在进行el表达式操作的时候,可以直接调用进行比较
//定义枚举
public enum OrderStatus {
N, X, Y, Z;
}
//使用枚举类型声明
private OrderStatus isUse; //get和set方法
<div>
<input type="radio" name="isUse" class="required myinput" value="1"
${myparam.isUse=='1'?'checked':''}>
<p>启用</p>
<input type="radio" name="isUse" class="required myinput" value="0"
${myparam.isUse=='0'?'checked':''}>
<p>禁用</p>
<div>
反思
- 在查资料的时候,明显发现这方面反馈的问题比较少,所以很少会出现这种在el表达式中比较字符是否相等的情况
- 怎样才能避免这种情况的发生,在定义变量的时候尽量不使用char类型进行定义(为啥在java中不要使用char类型),使用枚举、字符串、布尔一样可以达到效果。
- 今天也算是踩坑了,之前的数据类型也是自己定义的,其实在做业务处理的时候,就发现了字符的不方便性,需要进行不同的转换,而在使用el表达式时,理所当然的就掉进坑内里面了。但是也还是有收获的,也算一个扫了一个知识盲点了。
- 越来越发现stackoverflow是个好东西了。
参考:
https://stackoverflow.com/questions/14454261/how-to-compare-a-char-property-in-el
https://stackoverflow.com/questions/10542875/char-comparison-in-el-expression
https://blog.csdn.net/happylee6688/article/details/33306069