零基础学Struts
上QQ阅读APP看书,第一时间看更新

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">
                  <! -- 定义loginAction,其实现类为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)