ognl表达式
action对象是存储在值栈中的,页面提交的数据会通过ognl给action中的属性及对象赋值,页面取值的时候,也是通过ognl从值栈中获取。
个人理解图:
所以数据的传输是通过struts内置的ognl表达式及类型转换来完成,struts内置了类型转换器,来转换八种基本的数据类型。其他的数据类型需要自己手动写类型转换器来实现。内置的转换器可以转换日期,但是只支持yyyy-MM-dd这种类型,如果需要其他的日期类型,需要自己开发类型转换器。
一、地址类型转换器:将字符串类型的地址转成地址对象
应用场景:假设在action中有个属性,地址类,private Address comAddress;
jsp页面为了简化,并没有给address类的每个字段一个输入框,而是只给一个输入框<s:textfield name="comAddress" label="comAddress"/>
让用户输入公司地址的时候,输入如下信息:福建-厦门-思明-xx街道,如果是这样用户提交jsp页面的时候,ognl会把该输入地址(字符串)赋值给comAddress对象,这样就会出现类型不匹配的报错,为了解决这个问题必须把用户输入的字符串地址,转换为Address的类型。当然如果jsp页面是给四个输入框,则可以不用转换器。
==============================
ActionContext与ognl
ognl表达式可以解析任何对象,值栈是其中之一,而且是默认值。
ActionContext包含了所有范围的数据,共六个(valuestack,request,session,application,attr,parameters)。
parameters:是request中的请求参数封装到一个map集合中的数据。
request:是request范围内attribute属性数据,即通过request.setAttribute()设置的数据。
session:是session范围内attribute属性数据,即通过session.setAttribute()设置的数据。
application:是application范围内的attribute属性数据,即通过application.setAttribute()设置的数据。
attr:是从page,request,session,application四个域中查找数据,按照这个查找顺序找到的第一个数据。
ValueStack:即action中的数据,action中的数据都会放到值栈中。
ognl表达式可以从这六个范围内取数据,每个ognl表达式解析的时候都需要一个根对象(即需要指定一个域,默认的根对象是值栈)。即默认是从值栈中取数据。
选取session作为根对象,#session['user'] 表示:从session中取key值为user的对象。相对于session.getAttribute("user"); 默认情况下ValueStack是根对象。
#表示命名对象, 除了可以用ognl取值,还可以用EL表达式。
ActionContext:数据中心,Threadlocal
{
Map context
}
OgnlContext实现了Map接口。
ognl表达式可以解析任何对象,值栈是其中之一,而且是默认值。