关于El的一些细节知识

此为转载,原址为:http://www.haojii.com/2009/12/why-el-use-java-property-instead-of-field/

为什么EL表达式里的属性名不是javabean的字段呢?

这个问题的场景,相信很多人都写过Struts的helloworld程序,下面是一个常见的hello.jsp页面,请求经由org.apache.struts.action.ActionServlet或者org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter几经处理之后,最后返回ActionForward或者action的result相应的jsp或者各种模板页面。

这个结果页面中本质一直没有变,取得它所需要的值,通常是一个javabean的属性,假设这个javabean是下面的Bean20091228,那么为什么这里我们写的是属性${message}而不是字段${msg}呢?

01
02
03
04
05
06
07
08
09
10
<%@ page contentType="text/html; charset=UTF-8" %>
 
< html >
< head >
     < title > JSP Hello World </ title >
</ head >
< body >
  ${message}
</ body >
</ html >

要搞清楚问题首先要区分java中类的字段和属性的区别,对,这是显然有区别的

字段:通常是在类中定义的类成员变量 例如:下面的value和msg

属性:类中读写方法的声明,属性的名字不一定要和实际访问的字段相同 例如:下面的类我们可以说Bean20091228有支持读写的属性message, 属性名称默认小写开头。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
public class Bean20091228 {
 
     public Bean20091228( int value, String msg) {
         this .value = value;
         this .msg = msg;
     }
     private int value;
     private String msg;
     public int getVal() {
         return value;
     }
     public void setVal( int value) {
         this .value = value;
     }
     public String getMessage() {
         return msg;
     }
     public void setMessage(String msg) {
         this .msg = msg;
     }
}

搞清楚这个问题之后,下面这段代码用反射机制取得这个类的PropertyDescriptor,并且使用反射设置message属性的值,第5行代码检查是否当前迭代属性是message,第7行代码调用该属性的写方法,设置新的值为”hello,reflection”
该程序执行的打印结果为hello,reflection

01
02
03
04
05
06
07
08
09
10
11
12
public static void main(String[] args) throws Exception {
     Bean20091228 bean = new Bean20091228( 1 , "hello,world" );
 
     BeanInfo bi = Introspector.getBeanInfo(bean.getClass());
     for (PropertyDescriptor pd : bi.getPropertyDescriptors()) {
         if (pd.getName().equals( "message" ))
         {
             pd.getWriteMethod().invoke(bean, new Object[]{ "hello,reflection" });
         }
     }
     System.out.println(bean.getMessage());
}

所以EL表达式这玩意,在JSP页面解析的时候,技术上是使用reflection机制取得javabean的attribute的值,这就是为什么我们使用EL表达式的时候,使用的是属性值的原因。

这个问题搞清楚之后,不管是Struts1的BeanUtils参数类型转换,或者是Strut2使用的Interceptor参数类型转换都能触类旁通,想想也知道框架干了哪些事情,是怎么干的了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值