9.3 数据访问标签
数据访问标签用来访问ValueStack中的数据,从而完成数据访问相关功能。例如通过action标签可以用来显示Action中的属性,通过bean标签允许直接在JSP页面中创建JavaBean实例等。
9.3.1 action标签
action标签用来在JSP页面中调用Action,通过指定设置其executeResult属性为true,能将处理结果对应的视图资源包含到JSP页面中,其包含属性如表9.10所示。
表9.10 action标签属性列表
下面来创建需要调用的Action,该Action同以前登录示例中的Action十分类似,代码如下所示。
package net.hncu.action; import net.hncu.service.LoginCheck; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private String uname; private String upassword; //获得uname值 public String getUname() { return uname; } //设置uname值 public void setUname(String uname) { this.uname = uname; } //获得password值 public String getUpassword() { return upassword; } //设置password值 public void setUpassword(String upassword) { this.upassword = upassword; } public String execute() throws Exception { //new一个LoginCheck对象 LoginCheck lc = new LoginCheck(); //调用业务逻辑组件来判断 if(lc.isLogin(getUname(), getUpassword())){ //在session范围中添加属性login,其属性值为true ActionContext.getContext().getSession().put("login", "true"); //在session范围中添加属性uname,其属性值为uname变量值 ActionContext.getContext().getSession().put("uname", uname); //在session范围中添加属性upassword,其属性值为upassword变量值 ActionContext.getContext().getSession().put("upassword", upassword); return SUCCESS; }else{ return ERROR; } } }
在“struts.xml”文件中配置该Action,指定处理结果与视图资源之间的关系,代码如下所示。
<? xml version="1.0" encoding="UTF-8" ? > <! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="struts2" extends="struts-default"> <! -- 定义login的Action,其实现类为net.hncu.action.LoginAction--> <action name="login" class="net.hncu.action.LoginAction"> <! -- 定义处理结果与视图资源之间的关系--> <result name="success">/login_success.jsp</result> <result name="error">/login_failure.jsp</result> </action> </package> </struts>
在JSP页面中使用action来调用该Action。分别设置executeResult属性为true, ignoreContextParams属性为true,以及取得Action中添加到session范围中的属性值,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>action示例</title> </head> <body> <h4>将LoginAction返回结果包含到本页面</h4> <s:action name="login" executeResult="true"></s:action> <h4>将LoginAction返回结果包含到本页面</h4> <s:action name="login" executeResult="true" ignoreContextParams="true"></s:action> <h4>不包含LoginAction返回结果</h4> <s:action name="login" executeResult="false"></s:action> 用户名:<s:property value="#session.uname"/><br> 密码:<s:property value="#session.upassword"/> </body> </html>
运行该JSP页面,并添加如“? uname=xiaoqiang&upassword=xiaoqiang”用来传递参数,在页面中可以看到结果的输出,如图9.24所示。
9.3.2 bean标签
Struts 2提供的bean标签允许直接在JSP页面中创建JavaBean实例,可以使用param标签在该JavaBean实例传入属性值,也可以通过property标签输出该JavaBean实例的属性值,其属性如表9.11所示。
图9.24 使用action标签调用Action
表9.11 bean标签属性列表
首先创建一个简单的JavaBean,该类包含两个属性:uname和upassword,并为属性添加setter和getter方法,代码如下所示。
package net.hncu.javabean; public class User { private String uname; private String upassword; //获得uname值 public String getUname() { return uname; } //设置uname值 public void setUname(String uname) { this.uname = uname; } //获得password值 public String getUpassword() { return upassword; } //设置password值 public void setUpassword(String upassword) { this.upassword = upassword; } }
新建JSP页面,在该页面中使用bean标签创建User类实例,并使用param标签传递属性值,使用property标签输出其属性值,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>bean示例</title> </head> <body> <! -- 创建User类实例,并使用param标签传递属性值,使用property标签输出其属性值 --> <s:bean name="net.hncu.javabean.User"> <s:param name="uname" value="' xiaoqiang' "></s:param> <s:param name="upassword" value="' xiaoqiang' "></s:param> 用户名:<s:property value="uname"/><br> 密码:<s:property value="upassword"/> </s:bean> </body> </html>
同样也可以指定id属性,在使用property标签时可以指定其id属性值输出JavaBean实例的属性值,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>bean示例</title> </head> <body> <! -- 创建User类实例,并使用param标签传递属性值 --> <s:bean name="net.hncu.javabean.User" id="user"> <s:param name="uname" value="' xiaoqiang' "></s:param> <s:param name="upassword" value="' xiaoqiang' "></s:param> </s:bean> <! -- 使用property标签输出其属性值 --> 用户名:<s:property value="#user.uname"/><br> 密码:<s:property value="#user.upassword"/> </body> </html>
运行该JSP页面,在页面中可以显示JavaBean实例中属性值的输出,如图9.25所示。
图9.25 显示JavaBean实例中属性值
9.3.3 date标签
Struts 2提供date标签用于格式化指定的日期,还可以用来计算指定日期到当前时刻的时间差,其包含属性如表9.12所示。
表9.12 date标签属性列表
新建JSP页面,在该页面中创建一个Date实例并将其储存到page范围中。分别使用property标签和date标签输出该日期值,并计算设置日期距当前时间的时间差,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>bean示例</title> </head> <body> <% Calendar cal = Calendar.getInstance(); cal.set(2008,7,8); Date bjo = cal.getTime(); pageContext.setAttribute("bjo", bjo); %> 使用property输出:<s:property value="#attr.bjo"/><br> 格式化输出:<s:date name="#attr.bjo" format="yy/MM/dd"/><br> 距今时间差:<s:date name="#attr.bjo" format="yy/MM/dd" nice="true"/><br> </body> </html>
运行该JSP页面,在页面中可以看到分别使用property标签和date标签输出该日期值的结果以及设置日期距当前时间的时间差,如图9.26所示。
图9.26 显示日期值
9.3.4 include标签
Struts 2提供的include标签用于将JSP页面或者Servlet包含到该页面中,其包含属性如表9.13所示。
表9.13 include标签属性列表
新建JSP页面,在该页面中使include标签包含“TestInclude.jsp”页面,使用param标签将参数值传入被包含的JSP页面,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>include示例</title> </head> <body> <h4>包含TestIncluded页面并传递参数</h4> <s:include value="TestIncluded.jsp"> <s:param name="name" value="' xiaoqiang' "></s:param> <s:param name="age" value="'20' "></s:param> </s:include> </body> </html>
新建被包含页面,在该页面中使用EL表达式分别输出name参数值以及age属性值,代码如下所示。
<%@ page language="java" import="java.util.*" contentType="text/html; charset=GB2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>111</title> </head> <body> name:${param.name }<br> age:${param.age } </body> </html>
运行该JSP页面,在页面中可以看到被包含页面被包含进行,并输出其传入的参数值,如图9.27所示。
图9.27 包含页面并传递参数
9.3.5 url标签
Struts 2提供url标签用来生成一个URL地址,其包含属性如表9.14所示。
表9.14 url标签属性列表
下面来看如何通过url标签生成URL,代码如下所示。
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%> <%@ taglib prefix="s" uri="/struts-tags" %> <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>url示例</title> </head> <body> <h4>空url</h4> <s:url/><br><br> <h4>通过value属性指定Action</h4> <s:url value="abc.action"></s:url><br><br> <h4>通过action属性指定Action</h4> <s:url action="abc"></s:url><br><br> <h4>includeParams属性为none,不包含请求参数</h4> <s:url action="abc" includeParams="none"> </s:url><br><br> <h4>使用param传递参数</h4> <s:url action="abc"> <s:param name="uname" value="' xiaoqiang' "></s:param> </s:url> </body> </html>
运行该JSP页面,在页面中可以看到生成的URL值,如图9.28所示。
添加“age=10”用来传递参数,观察生成的URL值,如果设置includeParams属性为none,那么生成的URL不包含当前页面的请求参数,如图9.29所示。
图9.28 使用url标签色生成URL (1)
图9.29 使用url标签色生成URL (2)