1.OGNL对象图导航语言
Object Graphic Navigation Language.
源于ognl.jar工具包. 其作用如下:
(1)对属性获取和设置
(2)调用对象方法
(3)调用静态属性和方法
(4)对集合进行过滤
(5)支持Java中的运算符,操作符
(6)定义List常量 {"tom","sun"}
(7)定义Map常量 #{"M":"男","F","女"}
2.struts2标签
(1) struts2使用OGNL来访问ValueStack中的信息.
a. 访问context区域内容语法以"#key"开始
b. 访问root区域内容语法为"属性名"
(2)struts2提供了很多标签,有些标签属性需要指定OGNL表达式.
a. 通用标签
debug,property,date,if...else,iterator
bean,push,action,set
<body>
<s:action name="sample02" namespace="/" executeResult="true"></s:action>
<hr/>
姓名:<s:property value="name"/><br>
EL姓名:${name }<br>
日期:<s:date name="dt" format="yyyy年MM月dd日"/><br>
Action Message:<s:property value="msg"/><br/>
Request Message:<s:property value="#request.msg"/>
<br>${msg }<br>
Session Message:<s:property value="#session.msg"/><br>
Attr Message:<s:property value="#attr.msg"/><br>
价格:<s:property value="price"/>
<s:if test="price > 10000">
太贵了!
</s:if>
<s:else>
太便宜了!
</s:else>
<br>
性别:
<s:if test='sex.equals("M")'>
男性
</s:if>
<s:else>
女性
</s:else>
<hr>
<ul>
<s:iterator value="adds" var="address" status="stat">
<li>
<s:property value="#stat.count"/> :
<s:property value="#address.street"/>
<s:property value="#address.zipcode"/>
</li>
</s:iterator>
</ul>
<hr>
<ul>
<s:iterator value="adds">
<li>
${street }
${zipcode }
</li>
</s:iterator>
</ul>
<s:bean name="tarena.action.ModelBean" var="mBean"></s:bean>
<s:push value='#mBean'>
<s:property value="hello"/>
</s:push>
<s:property value="#mBean.hello"/>
<s:set var="i" scope="request" value="10"></s:set>
<s:debug></s:debug>
</body>
b. 表单标签
form,textfield,password,checkbox,checkboxlist,radio,select,optgroup
<body>
<h1>表单信息</h1>
<s:form action="sample02" theme="xhtml">
<s:textfield label="姓名" labelposition="left" name="name"></s:textfield>
</s:form>
<hr/>
<s:form action="sample02" theme="simple">
<s:bean name="tarena.action.ModelBean" var="data"></s:bean>
请选择朋友:<s:select name="friend" list="{}">
<s:optgroup label="男性" list="#data.males" listKey="name" listValue="name"></s:optgroup>
<s:optgroup label="女性" list="#data.females" listKey="name" listValue="name"></s:optgroup>
</s:select> <br>
姓名:<s:textfield name="name"></s:textfield><br/>
密码:<s:password name="pwd" showPassword="true"></s:password><br/>
年龄:<s:textfield name="age"></s:textfield><br/>
Email:<s:textfield name="email"></s:textfield><br/>
性别:<s:radio list='#{"M":"男","F":"女"}' name="sex"></s:radio><br/>
是否已婚:<s:checkbox name="marry"></s:checkbox><br/>
个人爱好:<s:checkboxlist name="myloves" list="#data.loves" listKey="key" listValue="value"></s:checkboxlist>
<br/>
<s:radio name="mylove" list="#data.loves" listKey="key" listValue="value"></s:radio>
<br/>
爱好:
<s:select name="mylove" emptyOption="true" headerKey="-1" headerValue="--请选择--" list="#data.loves" listKey="key" listValue="value">
</s:select>
</s:form>
</body>
3.练习
在昨天练习基础上添加d_user的更新,删除,查看功能
4.思考题
EL表达式为什么能获取Action对象的属性?
HttpServletRequest request;
request = new StrutsRequestWrapper(request);
request.getAttribute("user");
public class StrutsRequestWrapper extends HttpServletRequestWrapper{
public Object getAttribute(String key){
//先去request对象中寻找信息
Object obj = super.getAttribute(key);
//如果在原request中找不到,去valuestack中查找
if(obj == null){
ValueStack vs = ActionContext.getContext().getValueStack();
obj = vs.findValue(key);//"name"充当OGNL表达式,从而访问了root区域的Action对象
}
return obj;
}
}