数据标签主要用于提供各种数据访问相关的功能,包含显示一个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>
该标签用于创建一个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>
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>
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>
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>
使用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
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>
当然还有debug和param标签,debug的标签主要是用于测试的,生成一个超级链接,可以看到ValueStack和Stack Contextr中所有的值信息。param标签主要用于其它标签提供参数。