平时Struts2开发,常见在标签中使用OGNL表达式,将自己整理的一些使用原则记录在这里
1. 根对象
采用堆栈方式存储
访问根对象直接
Acttion对象默认会当做根对象放在栈中,直接取action对象的属性
<s:property value="username"/>
2. 上下文对象
采用Map方式存储
访问上下文对象必须以 # 开头
#request
#session
#param
#attr
以上都为默认上下文对象
ActionContext.getContext().put(key, value) -- value被存放在 #request['key'] or #request.key 中
ActionContext.getContext().getSession().put(key, value) --value被存放在 #session['key'] or #session.key 中
<s: property value="#request.username"/>
3. 关于表单元素的value
使用<s:.../>表单,如无特殊情况,只要设置name属性即可,未来如果Action中对应此name的属性有值,则会在表单中自动显示
如果有特殊情况,需要自己管理表单value的显示值,可以使用 EL表达式 或 OGNL表达式(推荐)
推荐使用OGNL表达式 %{},OGNL表达式通常写在表单元素内部
%{} 内写OGNL表达式,可以直接访问Actioin内的属性或方法
例如
<s:hidden name="user.name" value="%{username}"/> -- 直接取Action中的username属性,并放置在Action中User属性的name属性上(有点绕)
EL表达式 ${} 通常写在表单元素外部
${username}
注意,如果EL表达式写在表单元素内部,会引发
According to TLD attribute directive in tag file, attribute value does not accept any expressions
好像通过开关能打开,但不推荐这么用
4. 关于逻辑判断表单中字符串比较的注意
<s:if test='str == "add"'></s:if>
说明:
在网上查到的,说ONGL中进行字符串比较时,目标字符串一定用双引号表达,否则可能会引发异常
为避免双引号冲突,标签本身属性表达可以用单引号