日期:2014-05-18  浏览次数:20761 次

EL表达式和struts2 tag的区别
Java code

public enum Sex {   
    Male{   
        @Override  
        public String getTitle() {   
            return "男";   
        }   
    } ,   
    Female{   
        @Override  
        public String getTitle() {   
            return "女";   
        }   
    };   
    public abstract String getTitle();   

    @Override
    public String toString() {
    return this.getTitle();
    } 
}  



对象Student 有个属性是 Sex sex

jsp里面
HTML code

<s:iterator value="student">
<td>${sex}&nbsp;</td>
</s:iterator>


这样输出的是Male



HTML code

<s:iterator value="student">
<td><s:property value="sex" />&nbsp;</td>
</s:iterator>


则输出的是“男”


请问:
用el和struts tag的区别在哪里?
如何能用el直接重载toString方法输出中文?(注:输出${sex.title},这样不算)


------解决方案--------------------
帮顶,呵呵
------解决方案--------------------
好像${sex}实际上取的是getSex()这样的public方法;
struct2有待商榷...还有,怎么是在枚举中...
------解决方案--------------------
没研究过~
------解决方案--------------------
UP...........
------解决方案--------------------
帮顶
------解决方案--------------------
探讨
好像${sex}实际上取的是getSex()这样的public方法;
struct2有待商榷...还有,怎么是在枚举中...

------解决方案--------------------
关注,帮顶!
------解决方案--------------------
帮顶 你会给我分吗
------解决方案--------------------
涨知识!
------解决方案--------------------
lz的问题是"EL表达式和struts2 tag的区别",其实就因为用到了这两种标签访问同一个变量却得到了不同的结果。这个el和tag具体是访问的那个值需要源码的证明,这里本人没有看就不做评论了。但是从结果可以看出,el访问的是枚举类型的名字"Male",tag访问的是枚举类型的toString()方法。lz之前之所以看到了Male正是枚举类型的名字。

------解决方案--------------------
有空的时候再研究一下了
${mySex},这种没定义就使用的情况,我基本很少见
如果是这样能访问的话,我觉得应该是el调用了enum.name()方法
MySex.Male.name()返回的就是Male
${mySex}=Male,所以${mySex.name}就是Male了
------解决方案--------------------
建议不要用JSTL标签,既然使用的Struts2
为什么不用Struts标签库?

------解决方案--------------------
没仔细研究过,MARK一下
------解决方案--------------------
每天顶帖,打扰了。。
------解决方案--------------------
测试了一下,分析如下:
jstl对于普通的类的引用,比如${student},默认会调用toString方法
而对于枚举类的支持不是很好,只能通过其get、set方法来获取结果,比如${mySex.title}返回就是“男”

具体的可能要去看jstl标签的源码
------解决方案--------------------
如果还不行的话,用Converter吧
可能是jstl对enum作了特殊处理
因为重载toString方法的enum,不能通过enum.valueOf(enum.toString())还原,而enum.valueOf(enum.name())是可以还原的

------解决方案--------------------