数据标签主要用于提供各种数据访问相关的功能,包含显示一个Action里的属性,以及生成国际化输出等功能。
1. action标签
该标签用于在JSP页面直接调用一个Action,通过指定executeResult参数,还可以将Action处理结果包含到本页面中来。该标签有如下几个属性:
(1). var: 这是一个可选属性,一旦定义了该属性,该Action将被放入Stack Context中。
(2). name:这是一个必填属性,通过属性指定该标签调用哪个Action。
(3). namespace:这是一个可选属性,该属性指定义该调用的Action所在的namespace。
(4). executeResult:这是一个可选属性,指定是否将Action结果页面包括到本页面。默认值是false.
(5). ignoreContextParam:这是一个可选属性,指定该页面中的请求参数是否需要传入调用的Action。默认值是false,即本页面的请求参数传入被调用的Action.
下面笔者通过个例子来说明,首先创建个TagAction.java
public class TagAction extends ActionSupport
{
// 封装用户请求参数的author成员变量
private String author;
// author的setter和getter方法
public void setAuthor(String author)
{
this.author = author;
}
public String getAuthor()
{
return this.author;
}
// 定义第一个处理逻辑
public String execute() throws Exception
{
return "done";
}
// 定义第二个处理逻辑
public String login() throws Exception
{
ActionContext.getContext().
put("author", getAuthor());
return "done";
}
}
其次,在struts.xml中加入action.
<?xml version="1.0" encoding="GBK"?>
<!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.i18n.encoding" value="GBK"/>
<package name="owen" extends="struts-default">
<!-- 定义第一个Action,使用TagAction的
execute方法作为控制处理逻辑 -->
<action name="tag1" class="com.owen. app.action.TagAction">
<result name="done">/WEB-INF/content/succ.jsp</result>
</action>
<!-- 定义第二个Action,使用TagAction的
login方法作为控制处理逻辑 -->
<action name="tag2" class="com.owen.app.action.TagAction"
method="login">
<result name="done">/WEB-INF/content/loginSucc.jsp</result>
</action>
<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>
</package>
</struts>
最后,在JSP视图上设置,访问时,直接访问s-action.jsp.它自己就会去调用struts.xml中的action.同时,自己可在访问地址栏后填写?author=owen.第一处有owen,后两处没有owen.
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>使用s:action标签在页面中调用Action</title>
</head>
<body>
下面调用第一个Action,并将结果包含到本页面中。<br/>
<s:action name="tag1" executeResult="true"/>
<hr/>
下面调用第二个Action,并将结果包含到本页面中。<br/>
但阻止本页面请求参数传入Action。<br/>
<s:action name="tag2" executeResult="true"
ignoreContextParams="true"/>
<hr/>
下面调用第三个Action,且并不将结果包含到本页面中。<br/>
<s:action name="tag2" executeResult="false"/>
本页面是否可访问?<s:property value="author"/>
</body>
</html>
2. bean标签
该标签用于创建一个JavaBean.如果指定了var属性,则可以将创建的JavaBean实例放入StackContext中。bean标签可以指定下面属性:
(1). name:该属性是一个必填属性,指定要实现的JavaBean的实现类。
(2). var:该属性是一个可选属性,如果指定了。则JavaBean实例会被放入Stack Context中,并放入requestScope中。下面是一个简单的JavaBean。
首先,先定义一个Person.java的类
public class Person
{
private String name;
private int age;
// name的setter和getter方法
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
// age的setter和getter方法
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return this.age;
}
}
其次,在jsp视图中应用
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>使用s:bean标签创建JavaBean的实例</title>
</head>
<body>
<!-- 使用bean标签创建一个Person类的实例 -->
<s:bean name="com.owen.app.dto.Person" var=”p”>
<!-- 使用param标签为Person类的实例传入参数 -->
<s:param name="name" value="willieam"/>
<s:param name="age" value="29"/>
<!-- 因为在bean标签内,Person实例位于ValueStack的栈顶,
故可以直接访问lee.Person实例 -->
Person实例的name为:<s:property value="#p.name"/><br/>
Person实例的age为:<s:property value="#p.age"/>
</s:bean>
</body>
</html>
3. date标签
date标签主要用于格式化一个日期,可以指定发下的属性:
(1). format:这是一个可选属性,如果指定了该属性,将根据属性指定的格式来格式日期。
(2). nice:这是一个可选属性,该属性只能为true或者false,用于指定是否指定输出指定日期和当前时刻之间的时间差。该属性默认是false,即只能表示不输出时间差。
(3). name:这是一个必填属性,该属性指定要格式化日期值
(4). var:这是一个可选属性,如果指定了该属性,格式化后的字符串将被放入Stack Context中,并放入requestScope中,但不会在页面上输出。
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>使用s:date标签格式化日期</title>
</head>
<body>
<s:bean var="now" name="java.util.Date"/>
nice="false",且指定format="dd/MM/yyyy"<br/>
<s:date name="#now" format="dd/MM/yyyy" nice="false"/><hr/>
nice="true",且指定format="dd/MM/yyyy"<br/>
<s:date name="#now" format="dd/MM/yyyy" nice="true"/><hr/>
指定nice="true"<br/>
<s:date name="#now" nice="true" /><hr/>
nice="false",且没有指定format属性<br/>
<s:date name="#now" nice="false"/><hr/>
nice="false",没有指定format属性,指定了var<br/>
<s:date name="#now" nice="false" var="abc"/><hr/>
${requestScope.abc} <s:property value="#abc"/>
</body>
</html>
4. include标签
include标签用于一个JSP页面,或者一个Servlet包含到本页面中。
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>使用s:include标签来包含目标页面</title>
</head>
<body>
<h2>使用s:include标签来包含目标页面</h2>
<!-- 使用include标签来包含其他页面 -->
<s:include value="included-file.jsp"/>
<!-- 使用include标签来包含其他页面,并且传入参数 -->
<s:include value="included-file.jsp">
<s:param name="author" value="'yeeku'"/>
</s:include>
</body>
</html>
5. push标签
push标签用于将某个值放到ValueStack的栈顶,从而可以更简单地访问该值。
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>使用s:push来将某个值放入ValueStack的栈顶</title>
</head>
<body>
<h2>使用s:push来将某个值放入ValueStack的栈顶</h2>
<!-- 使用bean标签创建一个JavaBean实例,
指定var属性,并将其放入Stack Context中 -->
<s:bean name="com.owen.app.dto.Person" var="p">
<s:param name="name" value="owen"/>
<s:param name="age" value="29"/>
</s:bean>
<!-- 将Stack Context中的p对象放入ValueStack栈顶-->
<s:push value="#p">
<!-- 输出ValueStack栈顶对象的name和age属性 -->
ValueStack栈顶对象的name属性:<s:property value="name"/><br/>
ValueStack栈顶对象的age属性:<s:property value="age"/><br/>
</s:push>
</body>
</html>
6. set标签
使用set标签可以理解为定义一个新变量,且将一个已有的值复制给新变量,并且可以将新变量指定的范围。set标签有如下属性。
(1). scope:这是一个可选属性,指定新变量被放置的范围,该属性可以接受application、session、request、page或action 5个值。该属性默认值是action.
(2). value:这是一个可选属性,指定将赋给变量的值。如果没有指定该属性,则将ValueStack栈顶的值赋值给新变量。
(3). var:这是一个可选属性,如果指定了该属性,则会将值放入ValueStack中。
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>使用s:set设置一个新变量</title>
</head>
<body>
<h2>使用s:set设置一个新变量</h2>
<!-- 使用bean标签定义一个JavaBean实例 -->
<s:bean name="com.owen.app.dto.Person" id="p">
<s:param name="name" value="owen"/>
<s:param name="age" value="29"/>
</s:bean>
将Stack Context中的p值放入默认范围(action)内。<br/>
<s:set value="#p" name="xxx"/>
Stack Context内xxx对象的name属性:<s:property value="#xxx.name"/><br/>
Stack Context内xxx对象的age属性:<s:property value="#xxx.age"/><br/>
request范围的xxx对象的name属性:${requestScope.xxx.name}<br/>
request范围的xxx对象的age属性:${requestScope.xxx.age}<hr/>
将Stack Context中的p值放入application范围内。<br/>
<s:set value="#p" name="yyy" scope="application"/>
application范围的yyy对象的name属性:${applicationScope.yyy.name}<br/>
application范围的yyy对象的age属性:${applicationScope.yyy.age}<hr/>
将Stack Context中的p值放入session范围内。<br/>
<s:set value="#p" name="zzz" scope="session"/>
session范围的zzz对象的name属性:${sessionScope.zzz.name}<br/>
session范围的zzz对象的age属性:${sessionScope.zzz.age}
</body
7. url标签
url标签用于生成一个URL地址,可以通过url标签指定param子元素,从而指定URL发送参数。有发下几个属性:
(1). action:这是一个可选属性,指定生成URL的地址为哪个Action。如果Action不提供,就使用value作为URL的地址值。
(2). anchor:这是一个可选属性,指定URL的锚点。
(3). encode:这是一个可选属性,指定是否需要对参数进行编码,默认是true。
(4). escapeAmp:这是一个可选属性,指定是否需要对&符号进行编码,默认是true.
(5). forceAddSchemeHostAndPort:这是一个可选参数,指定是否需要在URL对应的地址里强制添加scheme、主机号和端口。
(6). incldeContext:这是一个可选属性,指定是否需要将当前上下文包含在URL地址中。
(7). incldeParams:这是一个可选属性,该属性指定是否包含请求参数,该属性的属性值只能为none、get或all。该属性的默认值是get.
(8). method:这是一个可选属性,该属性指定Action的方法。当使用Action来生成URL时,如果指定了该属性,则URL链拉到指定Action特定方法。
(9). namespace:这是个可选属性,该属性指定命名空间。当使用Action来生成URL时,如果指定了该属性,则是URL将链接到此namespace的指定Action处。
(10). portalMethod:这是一个可选属性,指定结果页面的portlet模式。
(11). scheme:这是一个可选属性,用于设置scheme属性。
(12). value:这是一个可选属性,指定生成URL的地址值,如果value不提供就用action属性指定的Action作为URL地址。
(13). var:这是一个可选属性,如果指定了该属性,将会把该链接放入Struts2的valueStack中。
(14). windowState:这是一个可选属性,指定结果页面的portlet的窗口状态。
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>使用s:url来生成一个URL地址</title>
</head>
<body>
<h2>s:url来生成一个URL地址</h2>
只指定value属性的形式。<br/>
<s:url value="editGadget.action"/>
<hr/>
指定action属性,且使用param传入参数的形式。<br/>
<s:url action="showBook">
<s:param name="author" value="'yeeku'" />
</s:url>
<hr/>
既不指定action属性,也不指定value属性,但使用param传入参数的形式。<br/>
<s:url includeParams="get" >
<s:param name="id" value="%{'22'}"/>
</s:url>
<hr/>
同时指定action属性和value属性,且使用param传入参数的形式。<br/>
<s:url action="showBook" value="xxxx">
<s:param name="author" value="'yeeku'" />
</s:url>
</body>
</html>
8. 其它标签
当然还有debug和param标签,debug的标签主要是用于测试的,生成一个超级链接,可以看到ValueStack和Stack Contextr中所有的值信息。param标签主要用于其它标签提供参数。