1.在jsp中使用绝对路径:
在头重设置:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
或者:<% String basePath = request.getContextPath(); %>
在head中设置:
<head>
<base href="<%=basePath%>" />
</head>
basePath=http://localhost:8088/StrutsDemo1
即可在body中直接用绝对路径来访问
<a href="path/path.action">路径问题说明</a>
相当于访问【http://localhost:8088/StrutsDemo1/path/path.action】
2.Action执行的时候并不一定要执行execute方法
可以在配置文件中配置Action的时候用method=来指定执行哪个方法也可以在url地址中动态指定(动态方法调用DMI)(推荐)
<a href="<%=basePath %>/user/userAdd">添加用户</a>
对应的action如下:
【<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
<result>/user_add_success.jsp</result>
</action>
】
<a href="<%=basePath %>/user/user!add">添加用户</a>
对应的action如下:
【 <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
</action>】
前者会产生太多的action,所以不推荐使用
3.【使得配置struts更简单】使用通配符,将配置量降到最低
不过,一定要遵守"约定优于配置"的原则
用例:
<package name="actions" extends="struts-default" namespace="/actions">
<action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
<result>/Student{1}_success.jsp</result>
</action>
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<!-- {0}_success.jsp -->
</action>
</package>
http://localhost:8088/StrutsDemo1/actions/Studentadd若请求这个参数表示,访问add()方法。
访问方法后调用Studentadd_success.jsp
4.使用Domain Model接收参数
url如下:http://localhost:8088/StrutsDemo1/user/user!add?user.name=a&user.age=8
user.name表示属性。这里的user要与方法中的setUser()方法对应 也就是说要用类中定义的user
定义的action类如下:
public class UserAction extends ActionSupport {
private User user;
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
5.使用ModelDriven接收参数:
url请求:http://localhost:8088/StrutsDemo1/user/user!add?name=a&age=8
定义的action类如下:
public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
6.使用action属性接收参数,测试中文问题
在sturts加上:<constant name="struts.i18n.encoding" value="GBK" /> <!-- internationalization -->
7.使用addFieldError方法和s:fieldError标签简单处理数据校验
在头文件导入struts tag:<%@taglib uri="/struts-tags" prefix="s" %>
<s:fielderror fieldName="name" theme="simple"/>
<br />
<s:property value="errors.name[0]"/>
<s:debug></s:debug>【可以点击观察这些栈都存在什么】
8.取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:
--前三者:依赖于容器
--前三者:IOC(只用这种)
--后三者:依赖于容器
--后三者:IOC
例子:
传过来的参数到action类中:
package com.bjsxt.struts2.user.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction1 extends ActionSupport {
private Map request;
private Map session;
private Map application;
public LoginAction1() {
request = (Map)ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
}
public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
}
页面使用有两种 jsp语法和struts ongl语言 而#attr.a1是在所有容器中搜索,一般不用,因为key有可能会重复:
<br />
<s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
<s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
<s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
<s:property value="#attr.a1"/><br />
<s:property value="#attr.s1"/><br />
<s:property value="#attr.r1"/><br />
<s:debug></s:debug>
<br />
9.设置多个struts.xml包含在改文件中。
例如:
在struts.xml中代码为:
<struts>
<constant name="struts.devMode" value="true" />
<include file="struts1.xml" />
</struts>
10.在xml中找不到action名字的时候,默认调用一个action 设置方法:
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/default.jsp</result>
</action>
</package>
11.action result Type:
例子:
<struts>
<constant name="struts.devMode" value="true" />
<package name="resultTypes" namespace="/r" extends="struts-default">
<action name="r1">
<result type="dispatcher">/r1.jsp</result>
</action>
<action name="r2">
<result type="redirect">/r2.jsp</result>
</action>
<action name="r3">
<result type="chain">r1</result>
</action>
<action name="r4">
<result type="redirectAction">r2</result>
</action>
<!-- 访问包-->
<action name="r5">
<result type="chain">
<param name="actionName">r1</param>
<param name="namespace">/rr</param>
</result>
</action>
</package>
<!-- 访问包-->
<package name="rr" namespace="/rr" extends="struts-default">
<action name="r1">
<result type="dispatcher">/r3.jsp</result>
</action>
</package>
</struts>
12.根据方法中的返回选取result:
<result name="error">/user_error.jsp</result>
13.动态结果一定不要忘了为动态结果的保存值设置set get方法
struts.xml如下:
<struts>
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>${r}</result>
</action>
</package>
</struts>
相对应的类如下:
package com.bjsxt.struts2.user.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private int type;
private String r;
public String getR() {
return r;
}
public void setR(String r) {
this.r = r;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
if(type == 1) r="/user_success.jsp";
else if (type == 2) r="/user_error.jsp";
return "success";
}
}
14.传参数到页面(需要ognl-2.6.11.jar包):
<struts>
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result type="redirect">/user_success.jsp?t=${type}</result>
</action>
</package>
</struts>
页面:
<s:property value="#parameters.t"/>
15.ognl学习:
访问的url:http://localhost:8088/StrutsDemo1/ognl.action?user.age=321
<li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
<li>访问值栈中action的普通方法:<s:property value="m()" /></li>
<li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>
<li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>
<li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>
<hr />
<li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
<hr />
<li>访问List:<s:property value="users"/></li>
<li>访问List中某个元素:<s:property value="users[1]"/></li>
<li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>
<li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
<li>访问Set:<s:property value="dogs"/></li>
<li>访问Map:<s:property value="dogMap"/></li>
<li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li>
<li>访问Map中所有的key:<s:property value="dogMap.keys"/></li>
<li>访问Map中所有的value:<s:property value="dogMap.values"/></li>
<li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>
<li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
<li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
结果如下:
22.投影(过滤):user1
23.投影:[2]
24.投影:[3]
25.投影:false
--------------------------------------------------------------------------------
<li>property: <s:property value="username"/> </li>
<li>property 取值为字符串: <s:property value="'username'"/> </li>
<li>property 设定默认值: <s:property value="admin" default="管理员"/> </li>
<li>property 设定HTML: <s:property value="'<hr/>'" escape="false"/> </li>
<hr />
<li>set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName1" value="'xxxxx'" /></li>
<li>set 从request取值: <s:property value="#request.adminName1" /></li>
<li>set 从ActionContext取值: <s:property value="#adminName1" /></li>
<%--<li>set 设定范围: <s:set name="adminPassword" value="password" scope="page"/></li>
<li>set 从相应范围取值: <%=pageContext.getAttribute("adminPassword") %></li>
--%>
<li>set 设定var,范围为ActionContext: <s:set var="adminPassword" value="password" scope="request"/></li>
<li>set 从相应范围取值: <s:property value="#request.adminPassword"/> </li>
<li>set 使用#取值xxxxxx: <s:property value="#request.adminPassword"/> </li>
<li>bean 定义bean,并使用param来设定新的属性值:
<s:bean name="com.bjsxt.struts2.tags.Dog" >
<s:param name="name" value="'pp'"></s:param>
<s:property value="name"/>
</s:bean>
</li>
<li>bean 查看debug情况:
<s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog">
<s:param name="name" value="'oudy'"></s:param>
</s:bean>
拿出值:
<s:property value="#myDog.name"/>
</li>
<li>include _include1.html 包含静态英文文件
<s:include value="/_include1.html"></s:include>
</li>
<li>include _include1.html 包含静态英文文件,说明%用法
<s:set var="incPage" value="%{'/_include1.html'}" />
<s:include value="%{#incPage}"></s:include>
</li>
<li>if elseif else:
age = <s:property value="#parameters.age[0]" /> <br />
<s:set var="age" value="#parameters.age[0]" />
<s:if test="#age < 0">wrong age!</s:if>
<s:elseif test="#parameters.age[0] < 20">too young!</s:elseif>
<s:else>yeah!</s:else><br />
<s:if test="#parameters.aaa == null">null</s:if>
</li>
<li>遍历集合:<br />
<s:iterator value="{1, 2, 3}" >
<s:property/> |
</s:iterator>
</li>
输出:遍历集合:
1 | 2 | 3 |
<li>自定义变量:<br />
<s:iterator value="{'aaa', 'bbb', 'ccc'}" var="x">
<s:property value="#x.toUpperCase()"/> |
</s:iterator>
</li>
输出:自定义变量:
AAA | BBB | CCC |
<li>使用status:<br />
<s:iterator value="{'aaa', 'bbb', 'ccc'}" status="status">
<s:property/> |
遍历过的元素总数:<s:property value="#status.count"/> |
遍历过的元素索引:<s:property value="#status.index"/> |
当前是偶数?:<s:property value="#status.even"/> |
当前是奇数?:<s:property value="#status.odd"/> |
是第一个元素吗?:<s:property value="#status.first"/> |
是最后一个元素吗?:<s:property value="#status.last"/>
<br />
</s:iterator>
</li>
在头重设置:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
或者:<% String basePath = request.getContextPath(); %>
在head中设置:
<head>
<base href="<%=basePath%>" />
</head>
basePath=http://localhost:8088/StrutsDemo1
即可在body中直接用绝对路径来访问
<a href="path/path.action">路径问题说明</a>
相当于访问【http://localhost:8088/StrutsDemo1/path/path.action】
2.Action执行的时候并不一定要执行execute方法
可以在配置文件中配置Action的时候用method=来指定执行哪个方法也可以在url地址中动态指定(动态方法调用DMI)(推荐)
<a href="<%=basePath %>/user/userAdd">添加用户</a>
对应的action如下:
【<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
<result>/user_add_success.jsp</result>
</action>
】
<a href="<%=basePath %>/user/user!add">添加用户</a>
对应的action如下:
【 <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
</action>】
前者会产生太多的action,所以不推荐使用
3.【使得配置struts更简单】使用通配符,将配置量降到最低
不过,一定要遵守"约定优于配置"的原则
用例:
<package name="actions" extends="struts-default" namespace="/actions">
<action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
<result>/Student{1}_success.jsp</result>
</action>
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<!-- {0}_success.jsp -->
</action>
</package>
http://localhost:8088/StrutsDemo1/actions/Studentadd若请求这个参数表示,访问add()方法。
访问方法后调用Studentadd_success.jsp
4.使用Domain Model接收参数
url如下:http://localhost:8088/StrutsDemo1/user/user!add?user.name=a&user.age=8
user.name表示属性。这里的user要与方法中的setUser()方法对应 也就是说要用类中定义的user
定义的action类如下:
public class UserAction extends ActionSupport {
private User user;
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
5.使用ModelDriven接收参数:
url请求:http://localhost:8088/StrutsDemo1/user/user!add?name=a&age=8
定义的action类如下:
public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
6.使用action属性接收参数,测试中文问题
在sturts加上:<constant name="struts.i18n.encoding" value="GBK" /> <!-- internationalization -->
7.使用addFieldError方法和s:fieldError标签简单处理数据校验
在头文件导入struts tag:<%@taglib uri="/struts-tags" prefix="s" %>
<s:fielderror fieldName="name" theme="simple"/>
<br />
<s:property value="errors.name[0]"/>
<s:debug></s:debug>【可以点击观察这些栈都存在什么】
8.取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:
--前三者:依赖于容器
--前三者:IOC(只用这种)
--后三者:依赖于容器
--后三者:IOC
例子:
传过来的参数到action类中:
package com.bjsxt.struts2.user.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction1 extends ActionSupport {
private Map request;
private Map session;
private Map application;
public LoginAction1() {
request = (Map)ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
}
public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
}
页面使用有两种 jsp语法和struts ongl语言 而#attr.a1是在所有容器中搜索,一般不用,因为key有可能会重复:
<br />
<s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
<s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
<s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
<s:property value="#attr.a1"/><br />
<s:property value="#attr.s1"/><br />
<s:property value="#attr.r1"/><br />
<s:debug></s:debug>
<br />
9.设置多个struts.xml包含在改文件中。
例如:
在struts.xml中代码为:
<struts>
<constant name="struts.devMode" value="true" />
<include file="struts1.xml" />
</struts>
10.在xml中找不到action名字的时候,默认调用一个action 设置方法:
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/default.jsp</result>
</action>
</package>
11.action result Type:
例子:
<struts>
<constant name="struts.devMode" value="true" />
<package name="resultTypes" namespace="/r" extends="struts-default">
<action name="r1">
<result type="dispatcher">/r1.jsp</result>
</action>
<action name="r2">
<result type="redirect">/r2.jsp</result>
</action>
<action name="r3">
<result type="chain">r1</result>
</action>
<action name="r4">
<result type="redirectAction">r2</result>
</action>
<!-- 访问包-->
<action name="r5">
<result type="chain">
<param name="actionName">r1</param>
<param name="namespace">/rr</param>
</result>
</action>
</package>
<!-- 访问包-->
<package name="rr" namespace="/rr" extends="struts-default">
<action name="r1">
<result type="dispatcher">/r3.jsp</result>
</action>
</package>
</struts>
12.根据方法中的返回选取result:
<result name="error">/user_error.jsp</result>
13.动态结果一定不要忘了为动态结果的保存值设置set get方法
struts.xml如下:
<struts>
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>${r}</result>
</action>
</package>
</struts>
相对应的类如下:
package com.bjsxt.struts2.user.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private int type;
private String r;
public String getR() {
return r;
}
public void setR(String r) {
this.r = r;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
if(type == 1) r="/user_success.jsp";
else if (type == 2) r="/user_error.jsp";
return "success";
}
}
14.传参数到页面(需要ognl-2.6.11.jar包):
<struts>
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result type="redirect">/user_success.jsp?t=${type}</result>
</action>
</package>
</struts>
页面:
<s:property value="#parameters.t"/>
15.ognl学习:
访问的url:http://localhost:8088/StrutsDemo1/ognl.action?user.age=321
<li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
<li>访问值栈中action的普通方法:<s:property value="m()" /></li>
<li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>
<li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>
<li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>
<hr />
<li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
<hr />
<li>访问List:<s:property value="users"/></li>
<li>访问List中某个元素:<s:property value="users[1]"/></li>
<li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>
<li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
<li>访问Set:<s:property value="dogs"/></li>
<li>访问Map:<s:property value="dogMap"/></li>
<li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li>
<li>访问Map中所有的key:<s:property value="dogMap.keys"/></li>
<li>访问Map中所有的value:<s:property value="dogMap.values"/></li>
<li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>
<li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
<li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
结果如下:
22.投影(过滤):user1
23.投影:[2]
24.投影:[3]
25.投影:false
--------------------------------------------------------------------------------
<li>property: <s:property value="username"/> </li>
<li>property 取值为字符串: <s:property value="'username'"/> </li>
<li>property 设定默认值: <s:property value="admin" default="管理员"/> </li>
<li>property 设定HTML: <s:property value="'<hr/>'" escape="false"/> </li>
<hr />
<li>set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName1" value="'xxxxx'" /></li>
<li>set 从request取值: <s:property value="#request.adminName1" /></li>
<li>set 从ActionContext取值: <s:property value="#adminName1" /></li>
<%--<li>set 设定范围: <s:set name="adminPassword" value="password" scope="page"/></li>
<li>set 从相应范围取值: <%=pageContext.getAttribute("adminPassword") %></li>
--%>
<li>set 设定var,范围为ActionContext: <s:set var="adminPassword" value="password" scope="request"/></li>
<li>set 从相应范围取值: <s:property value="#request.adminPassword"/> </li>
<li>set 使用#取值xxxxxx: <s:property value="#request.adminPassword"/> </li>
<li>bean 定义bean,并使用param来设定新的属性值:
<s:bean name="com.bjsxt.struts2.tags.Dog" >
<s:param name="name" value="'pp'"></s:param>
<s:property value="name"/>
</s:bean>
</li>
<li>bean 查看debug情况:
<s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog">
<s:param name="name" value="'oudy'"></s:param>
</s:bean>
拿出值:
<s:property value="#myDog.name"/>
</li>
<li>include _include1.html 包含静态英文文件
<s:include value="/_include1.html"></s:include>
</li>
<li>include _include1.html 包含静态英文文件,说明%用法
<s:set var="incPage" value="%{'/_include1.html'}" />
<s:include value="%{#incPage}"></s:include>
</li>
<li>if elseif else:
age = <s:property value="#parameters.age[0]" /> <br />
<s:set var="age" value="#parameters.age[0]" />
<s:if test="#age < 0">wrong age!</s:if>
<s:elseif test="#parameters.age[0] < 20">too young!</s:elseif>
<s:else>yeah!</s:else><br />
<s:if test="#parameters.aaa == null">null</s:if>
</li>
<li>遍历集合:<br />
<s:iterator value="{1, 2, 3}" >
<s:property/> |
</s:iterator>
</li>
输出:遍历集合:
1 | 2 | 3 |
<li>自定义变量:<br />
<s:iterator value="{'aaa', 'bbb', 'ccc'}" var="x">
<s:property value="#x.toUpperCase()"/> |
</s:iterator>
</li>
输出:自定义变量:
AAA | BBB | CCC |
<li>使用status:<br />
<s:iterator value="{'aaa', 'bbb', 'ccc'}" status="status">
<s:property/> |
遍历过的元素总数:<s:property value="#status.count"/> |
遍历过的元素索引:<s:property value="#status.index"/> |
当前是偶数?:<s:property value="#status.even"/> |
当前是奇数?:<s:property value="#status.odd"/> |
是第一个元素吗?:<s:property value="#status.first"/> |
是最后一个元素吗?:<s:property value="#status.last"/>
<br />
</s:iterator>
</li>