专门是负责从值栈中取出数据的表达式。
只要需要在jsp中声明包即可使用:
<%@ taglib url="/struts-tags" prefix="s"%>
1:<s:debug>显示值栈的所有数据信息。
输出值栈结构
说明:s:debug对象栈中显示的数据来自于getXxx方法
把getXxx的"get"去掉,把剩余的第一个字母变成小写xxx
把返回值作为value值,返回到s:debug中,所以action中请求的方法
最好别以get方法开头
2:<s:property value="*或(#*)">标签:输出栈中指定信息显示到页面上
map栈的访问:
说明:
访问OGNL上下文和action上下文,#相当于ActionContext.getContext();
如果访问的是map中的值而不是对象栈中的值,由于map中的数据不是根对象,所以在访问时需要添加#前缀。
例子:
名称 作用 例子:
parameters 包含当前HTTP请求的Map #parameters.id[0]=request.getParameter(“id”)
request 包含当前HttpServletRequest属性的Map #request.username=request.getAttribute(“username”);
session 包含当前HttpSession属性的Map #session.username=session.getAttribute(“username”);
application 包含当前ServletContext属性的Map #application.username=application.getAttribute(“username”);
** attr 用于按照request>session>application顺序访问其属性 ---》#attr.username相当于按照顺序在以上三个范围内读取username的属性,直到找到为止。
注:也可以写为#request[‘username’] #sesssion[‘username’] #application[‘username’]
对象栈:
1、把一个对象放入到对象栈中,其属性可以直接访问
Person person = new Person();
person.setDescription("帅");
person.setName("王武");
ActionContext.getContext().getValueStack().push(person);
在页面中:<s:property value="name"/>即可访问person.name;
原因是该属性直接暴漏出来了,所以可以直接访问。
2、如果在对象栈中出现好几个相同的属性,从栈顶往下找,找到为止
3、把一个map放入到对象栈,直接访问其key值就可以了
4、把String放入到对象栈的栈顶,可以利用<s:property/>访问,
因为该标签如果不写value属性,默认访问栈顶的元素
标签:
1、s:debug
如果把该标签放入到s:iterator中可以看到当前正在迭代的元素的状态
2、s:property
1、输出
2、value属性:值能直接跟ognl表达式
3、如果value属性不写,则默认输出栈顶的元素
3:s:iterator标签
1、iterator迭代Collection,Map,Object[],还可以以组合的形式迭代
2、当前正在迭代的元素在栈顶
3、如果value属性不写,则默认迭代栈顶的元素
4、如果迭代的是map元素,当前正在迭代的元素是Entry<key,value>,这个时候key和value是对象栈
中的属性
5、var属性,var='aa'相当于给当前正在迭代的元素在map栈又存放了一次,key值为aa
6、status属性,可以获取当前正在迭代的元素所在行的信息count,index,odd,event、end,first,step属性
Count() 返回当前迭代的元素个数
Index() 返回当前迭代元素的索引
Even() 返回当前迭代元素的索引是否是偶数
Odd() 返回当前迭代元素的索引是否是奇数
First() 返回当前迭代元素是否为第一个元素
Last() 返回当前迭代元素是否为最后一个元素
4、s:if s:elseif
注意:使用该标签不能使用单个字符用==进行判断
使用equals判断。
<s:if test="name=='1'">这种写法不对,程序会报错。
<s:if test="name=='a'">这种写法不对,程序会报错例:
在action中将map存放在map栈中:
Map map = new HashMap<String,Person>();
Person person = new Person();
person.setDescription("帅");
person.setName("王武");
map.put("person", person);
ActionContext.getContext().put("map", map);
return "index";
<s:iterator value="#map">
<s:property value="key"/>//输出key的值
<s:property value="value.name"/>//输出person的name的值
</s:iterator>
在页面中迭代map 取出的结果会在栈顶,属性暴露,所以可以直接在value中写key或value。
而value代表的是person,所以可以直接value.name来获取person的属性。
当迭代的结果还是一个集合的话,内部嵌套<s:iterator>标签即可。有多少层嵌套多少次,
原理不变,记住当前迭代的对象在栈顶,并且迭代之后会弹出这个原理即可。
综合案例在页面中实现奇偶行变色的效果:
利用iterator的status属性完成隔行变色:<br>
<a
href="${pageContext.request.contextPath}/ognl/ognlTagAction_testList6.action">测试</a><br>
OgnlTagAction
/*
* 利用iterator的status属性完成表格的隔行变色
*/
public String testList6(){
ServletActionContext.getRequest().setAttribute("request_username", "username");
List<Person> personList = new ArrayList<Person>();
for(int i=0;i<10;i++){
Person person = new Person();
person.setPid(i);
person.setPname("person"+i);
person.setComment("person"+i);
personList.add(person);
}
ActionContext.getContext().put("personList", personList);
return "ognlList6";
}
successOgnlTag.jsp
<style type="text/css">
.odd{
background-color:red;
}
.even{
background-color:blue;
}
</style>
UI标签
Html有的UI标签 struts2的UI也都支持,只是在之前加个s即可操作。
1、在struts.xml文件中,加入:
<constant name="struts.ui.theme" value="simple"/>
struts2解析标签的时候不会自动添加table,tr,td等元素.
2、回显
1、如果数据在map栈中,则直接根据value的属性进行回显
2、如果数据在对象栈中,直接根据name的属性进行回显
在回显的时候只要将数据放入对象栈即可,不用非得放入到栈顶。
回显的时候在password的时候不会显示密码,只要在标签中声明:showpassword="true"即可。
ognl表达式的标签显示数据:
下面的标签的value属性能直接跟ognl表达式
s:property
s:if
s:iterator
s:select list属性直接跟ognl表达式
下面的标签的value属性不能直接跟ognl表达式
s:testfiled
s:password
s:textarea
value="%{ognl表达式}"
value加%{#*} 在字符串中使用ognl表达式。