好记性不如赖笔头…………
OGNL 的iterator迭代器详解
s:iterator标签属性
value:必填,值为OGNL表达式,要操作的数据集
var : 当前遍历数据的别名
当使用了此属性后:var的值做为KEY,当前遍历的数据做为value,存储到contextMap中,访问方法:#别名.属性
当不使用此属性后:当前遍历的数据压到valueStack栈顶中,在使用后弹出。访问方法:属性名
status:遍历时的计数信息,访问格式:#status名称.方法
int index:返回当前遍历数据的索引,从0开始
int count:返回当前遍历数据的位置,从1开始
boolean first:是否是第一个数据
boolean last: 是否是最后一条数据
boolean odd: 当前元素索引是否奇数
boolean even:当前元素是否为偶数
begin:起始遍历数据的索引
step: 步长,默认为1
end: 最后一个遍历数据的索引
1、创建Persion.java实体类,具体代码如下:
package com.ckinghan.bean;
public class Persion {
private String nature;
private int age;
public Persion() {
super();
}
public Persion(String nature, int age) {
super();
this.nature = nature;
this.age = age;
}
public String getNature() {
return nature;
}
public void setNature(String nature) {
this.nature = nature;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2、创建IteratorAction动作类(在此之前,请先将Struts2需要的包先导入进去),继承ActionSupport,具体代码如下
package com.ckinghan.web.action;
import java.util.ArrayList;
import com.ckinghan.bean.Persion;
import com.opensymphony.xwork2.ActionSupport;
public class IteratorAction extends ActionSupport {
private java.util.List<Persion> persions = new ArrayList<Persion>();
public java.util.List<Persion> getPersions() {
return persions;
}
public void setPersions(java.util.List<Persion> persions) {
this.persions = persions;
}
@Override
public String execute() throws Exception {
persions.add(new Persion("黄色", 15));
persions.add(new Persion("红色", 19));
persions.add(new Persion("蓝色", 11));
persions.add(new Persion("橙色", 18));
persions.add(new Persion("赤色", 17));
persions.add(new Persion("紫色", 16));
persions.add(new Persion("绿色", 10));
return super.execute();
}
}
3、配置Struts.xml配置文件,存储在src目录下,Struts.xml具体内容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--开启调试模式-->
<constant name="struts.devMode" value="true"/>
<package name="iterator" extends="struts-default">
<action name="iterator" class="com.ckinghan.web.action.IteratorAction" method="execute">
<!--成功返回iterator视图-->
<result>/iterator.jsp</result>
</action>
</package>
</struts>
4、创建iterator.jsp文件,具体代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>OGNL-iterator迭代器遍历</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<hr>
<h1>OGNL-iterator迭代器标签遍历数据,使用var</h1>
<table border="1" align="center">
<thead>
<tr>
<th>索引</th>
<th>编号</th>
<th>颜色</th>
<th>数量</th>
<th>是否第一条</th>
<th>是否最后一条</th>
<th>是否奇数</th>
<th>是否偶数</th>
</tr>
</thead>
<%--
OGNL 的iterator迭代器详解
s:iterator标签属性
value:必填,值为OGNL表达式,要操作的数据集
var : 当前遍历数据的别名
当使用了此属性后:var的值做为KEY,当前遍历的数据做为value,存储到contextMap中,访问方法:#别名.属性
当不使用此属性后:当前遍历的数据压到valueStack栈顶中,在使用后弹出。访问方法:属性名
status:遍历时的计数信息,访问格式:#status名称.方法
int index:返回当前遍历数据的索引,从0开始
int count:返回当前遍历数据的位置,从1开始
boolean first:是否是第一个数据
boolean last: 是否是最后一条数据
boolean odd: 当前元素索引是否奇数
boolean even:当前元素是否为偶数
begin:起始遍历数据的索引
step: 步长,默认为1
end: 最后一个遍历数据的索引
--%>
<s:iterator value="persions" var="vs" status="l" >
<tr>
<td>
<s:property value="#l.index"/>
</td>
<td>
<s:property value="#l.count"/>
</td>
<td>
<s:property value="#vs.nature"/>
</td>
<td>
<s:property value="#vs.age"/>
</td>
<td>
<s:property value="#l.first"/>
</td>
<td>
<s:property value="#l.last"/>
</td>
<td>
<s:property value="#l.odd"/>
</td>
<td>
<s:property value="#l.even"/>
</td>
</tr>
</s:iterator>
</table>
<hr>
<h1>OGNL-iterator迭代器标签遍历数据,不使用var</h1>
<table border="1" align="center">
<thead>
<tr>
<th>索引</th>
<th>编号</th>
<th>颜色</th>
<th>数量</th>
<th>是否第一条</th>
<th>是否最后一条</th>
<th>是否奇数</th>
<th>是否偶数</th>
</tr>
</thead>
<s:iterator value="persions" status="l" >
<tr>
<td>
<s:property value="#l.index"/>
</td>
<td>
<s:property value="#l.count"/>
</td>
<td>
<s:property value="nature"/>
</td>
<td>
<s:property value="age"/>
</td>
<td>
<s:property value="#l.first"/>
</td>
<td>
<s:property value="#l.last"/>
</td>
<td>
<s:property value="#l.odd"/>
</td>
<td>
<s:property value="#l.even"/>
</td>
</tr>
</s:iterator>
</table>
</body>
</html>
访问结果如下:
OGNL表达式:s:set标签
将var做为key,value做为value存储到contextMap中,注意,只能保存到contextMap的大Map中
注意:value的值是一个OGNL表达式,如果想让值变成字符串,将值写入到”号中
<!--将"你好"做为value,将“hello”做为key,存储到contextMap中-->
<s:set var="hello" value="'你好'"></s:set>
<!--先从ValueStack查找名为hello的数据,找不到再去ContextMap中找-->
<s:property value="hello"/>
结果如下:
hello
s:action标签:通过name确定动作,executeResult来确定是否执行此动作,这个功能主要是实现动态包含
name属性:动作名称
executeResult:是否执行,当值为true时,执行动作,当值为false时,不执行,默认false
<s:action name="getValueStack1" executeResult="true"/>
以上代码,将在页面加载时加载getValueStack1的动作,将此动作返回的数据显示当前页面上,等同于将getValueStack1的返回数据放到了当前页面
OGNL的判断标签:
s:if标签—》s:elseif标签—》s:else标签
<s:set var="hello" value="'hello1'"/>
<s:if test="#hello == '你好'">if标签</s:if>
<s:elseif test="#hello !='hello1'">elseif标签</s:elseif>
<s:else>else标签</s:else>
结果如下:
elseif标签
OGNL的URL标签:
s:url标签 单独一个action属性,会将项目名及动作路径输出
<s:url action="getValueStack"/>
结果如下:
/Struts2_OGNL/getvalueStack.action
=====================================================================================
当加入了var属性后,var做为key,action的值做为value,存储到contextMap中,如果加了id属性,可以直接配合s:a标签通过%{id}来调用,以达到连接跳转的目的
<s:url action="getValueStack1" var="url" id="url">
<!--添加跳转连接中的参数,相当于get方式参数拼接-->
<s:param name="hello">hello</s:param>
</s:url>
<a href="<s:property value='#url'/>">我跳啊跳</a>
<s:a href="%{url}">我使劲跳</s:a>
访问结果如下: