一、OGNL(.、#、$、%)表达式
在Struts 2框架中,值栈(Value Stack)就是OGNL的根对象。如果用户需要访问值栈中的对象,则可以通过如下代码访问值栈中的属性:
${foo} // 获得值栈中的foo属性
如果访问其他Context中的对象,由于不是根对象,在访问时需要加#前缀。
application对象:用来访问ServletContext,如#application.userName或者#application [“userName”]
相当于调用Servlet的getAttribute("userName")。
session对象:用来访问HttpSession,如#session.userName或者#session[“userName”]
相当于调用session.getAttribute("userName")。
request对象:用来访问HttpServletRequest属性的Map,如#request.userName或者#request[“userName”]
相当于调用request.getAttribute("userName")。
在类中:Map request=(Map)ActionContext.getContext().get("request");
request.put("name",getName());就是先得到request对象,然后把值放进去。
在JSP页面中:<s:property value="#request.name"/>,其中#request.name相当于调用了request.getAttribute(“name”);
二、数据标签
1. <s:property>标签
property标签的作用是输出指定值。
value:指定需要输出的属性值,如果没有指定该属性,则默认输出值栈栈顶的值。
例如:<s:property value="#request.name"/>
2. <s:set>标签
name:该属性是必选的,重新生成新变量的名字。
例如:<s:property value="#session['user'].username"/>
<s:property value="#session['user'].age"/>
<s:property value="#session['user'].address"/>
等价于:<s:set name="user" value="#session[‘user'] " />
<s:property value="#user.username"/>
<s:property value="#user.age" />
<s:property value="#user.address" />
3. <s:param>标签
param标签主要用于为其他标签提供参数,该标签有如下几个属性:
name:该属性是可选的,指定需要设置参数的参数名。
value:该属性是可选的,指定需要设置参数的参数值。
id:该属性是可选的,指定引用该元素的id。
4. <s:bean>标签
name:该属性是必选的,用来指定要实例化的JavaBean的实现类。
id:该属性是可选的,如果指定了该属性,则该JavaBean实例会被放入StackContext中,从而可通过id属性来访问该JavaBean实例。
例如:有一个Student类,该类中有name属性,并有其getter和setter方法:
类中:public class Student {
?private String name;
?public String getName() { return name;?}
?public void setName(String name) {?this.name=name;?}
}
JSP页面中:<s:bean name="Student">
?<s:param name="name" value="'zhangsan'"/>
<s:property value="name"/>
</s:bean>
或:<s:bean name="Student" id="s" >
<s:param name="name" value="'zhangsan'"/>
</s:bean>
<s:property value="#s.name"/>
5. <s:action>标签
使用action标签可以允许在JSP页面中直接调用Action。
name:该属性是必选的,指定该标签调用哪个Action。
6. <s:date>标签
date标签主要用于格式化输出一个日期。该标签有如下属性:
format:该属性是可选的,如果指定了该属性,将根据该属性指定的格式来格式化日期。
nice:该属性是可选的,指定是否输出指定日期和当前时刻之间的时差。默认为false。
name:属性是必选的,指定要格式化的日期值。
其用法为:
<s:date name="指定日期取值" format="日期格式"/><!-- 按指定日期格式输出 -->
<s:date name="指定日期取值" nice="true"/><!-- 输出时间差 -->
<s:date name="指定日期取值"/><!—默认格式输出-->
7. <s:include>标签
include标签用于将一个JSP页面或一个Servlet包含到本页面中。
value:该属性是必选的,指定需要被包含的JSP页面或Servlet。
例如:<s:include value="JSP或Servlet文件" id="自定义名称"/>
三、控制标签
1. <s:if>/<s:elseif>/<s:else>标签
只有if标签可以单独使用,if标签可以与多个elseif标签结合使用,但只能与一个else标签使用。其用法格式如下:
<s:if test="表达式">
?标签体
</s:if>
<s:elseif test="表达式">
标签体
</s:elseif>
<!--允许出现多次elseif标签-->
...
<s:else>
标签体
</s:else>
2. <s:iterator>标签
该标签主要用于对集合进行迭代,这里的集合包含List、Set,也可以对Map类型的对象进行迭代输出。该标签的属性如下:
value:该属性是可选的,指定被迭代的集合,被迭代的集合通常都由OGNL表达式指定。如果没有指定该属性,则使用值栈栈顶的集合。
status:该属性是可选的,指定迭代时的IteratorStatus实例,通过该实例可判断当前迭代元素的属性。
例如:<%@ page language="java" pageEncoding="utf-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<html>
<head>
<title>控制标签</title>
</head>
<body>
<table border="1" width="200">
<s:iterator value="{'apple','orange','pear','banana'}" id="fruit" status="st">
<tr <s:if test="#st.even"></s:if>>
<td><s:property value="fruit"/></td>
</tr>
</s:iterator>
</table>
</body>
</html>
3. <s:append>标签
例如:<body>
<s:append id="newList">
<s:param value="{'apple','orange','pear','banana'}"/>
<s:param value="{'chinese','english','french'}"/>
</s:append>
<table border="1" width="200">
<s:iterator value="#newList" id="fruit" status="st">
<tr <s:if test="#st.even"></s:if>>
<td><s:property value="fruit"/></td>
</tr>
</s:iterator>
</table>
</body>
4.<s:merge>标签
与append标签作用相似,只是它们所拼接产生的新集合元素顺序不同,其中merge是每次分别在每一个集合取一个元素进行拼接。
四、表单标签
1. <s:checkboxlist>标签
<s:checkboxlist label="请选择你喜欢的水果" list="{'apple','oranger','pear','banana'}" name="fruit">
</s:checkboxlist>
或者为:
<s:checkboxlist label="请选择你喜欢的水果" list="#{1:'apple',2:'oranger',3:'pear',4:'banana'}" name="fruit">
</s:checkboxlist>
2. <s:combobox>标签
<s:combobox label="请选择你喜欢的水果" list="{'apple','oranger','pear','banana'}" name="fruit">
</s:combobox>
3. <s:datetimepicker>标签
<s:form action="" method="">
?<s:datetimepicker name="date" label="请选择日期"></s:datetimepicker>
</s:form>
4. <s:select>标签
<s:select list="{'apple','oranger','pear','banana'}"
label="请选择你喜欢的水果"></s:select>
或者为:
<s:select list="fruit" list="#{1:'apple',2:'oranger',3:'pear',4:'banana'}"
listKey="key" listValue="value"></s:select>
5. <s:radio>标签
<s:radio label="性别" list="{'男','女'}" name="sex"></s:radio>
或者为:
<s:radio label="性别" list="#{1:'男',0:'女'}" name="sex">
</s:radio><