关于El的一些细节知识
来源:互联网 发布:pano.js 编辑:程序博客网 时间:2024/05/22 15:49
此为转载,原址为: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}呢?
<%@ page contentType="text/html; charset=UTF-8" %>
<
html
>
<
head
>
<
title
> JSP Hello World </
title
>
</
head
>
<
body
>
${message}
</
body
>
</
html
>
要搞清楚问题首先要区分java中类的字段和属性的区别,对,这是显然有区别的
字段:通常是在类中定义的类成员变量 例如:下面的value和msg
属性:类中读写方法的声明,属性的名字不一定要和实际访问的字段相同 例如:下面的类我们可以说Bean20091228有支持读写的属性message, 属性名称默认小写开头。
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
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参数类型转换都能触类旁通,想想也知道框架干了哪些事情,是怎么干的了。
- 关于El的一些细节知识
- el表达式的一些知识
- 关于多线程的一些细节
- 关于多线程的一些细节
- 关于多线程的一些细节
- 关于多线程的一些细节
- 关于C++的一些细节
- 关于string的一些细节
- 关于deque的一些细节
- 关于javascript的一些细节
- 关于textfield的一些细节
- 关于myBatis的一些细节
- 关于split的一些细节
- c++碰到的一些细节知识
- Ant使用的一些细节知识
- linux inotify的一些细节知识
- Android小知识——关于Android内存、性能优化的一些细节
- JavaScript一些细节知识
- struts1 textarea 不换行
- VSAM操作笔记_COBOL操作VSAM
- Mysql 关键字\保留字列表
- 对Python中文分词模块结巴分词算法过程的理解和分析
- SocketTimeoutException和ConnectTimeoutException的区别
- 关于El的一些细节知识
- 数组上一系列查找问题
- OpenShift Redhat空间使用
- 使用智遥工作流,优化SAP请购流程
- 编码字符集与字符集编码的区别
- TCP 连接建立之 三次握手
- java处理矩阵的包
- 比较“超链分析技术”专利与PageRank专利的三篇好文
- Javascript基础知识