Struts2 官方教程:使用标签

本教程假设读者已经完成了 Hello World 教程,并且已经有了一个helloworld 项目。
在Hello World 课程中,我们在index.jsp 文件中添加了Struts2 url 标签,来创建一个指向hello.action 的超链接。本片教程将会更深入地探究这个url,以及Struts2 的其它标签。
网页应用不同于传统的页面;在网页应用中可以创造出动态的响应。为了更简单地从一个页面引用动态数据,Strut2 框架提供了一个标签集合。一些标签模仿标准的、能提供额外数据的HTML标签。另一些标签创造了并不标准但有用的控制。
为了在视觉页面上使用Struts2标签,读者需要引入一个标签库命令。典型地,标签库命令是<%@ taglib prefix=”s” uri=”/struts-tags” %/> 。这样,所有Struts2标签的前缀都会是“s”。如果读者希望实际阅读Struts2标签TLD文件,将会在Struts2 core jar的META-INF 路径中找到。

Struts 2 url 标签

Struts2 标签的一个用途是创建到其他网页资源的链接,特别是用来指向本地应用其它的资源。
HTML提供一个用来创建超链接简单的标签,HTML标签通常要求引入冗长的信息。HTML标签也无法简单地读取由框架提供的动态数据。
在网页应用中,一个非常普遍的使用案例是链接到其它页面。在Hello World 教程中,我们在index.jsp中添加了一个使用Struts2 url标签指向hello.action的链接。
index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Basic Struts 2 Application - Welcome</title>
  </head>
  <body>
    <h1>Welcome To Struts 2!</h1>
    <p><a href="<s:url action='hello'/>">Hello World</a></p>
  </body>
</html>

当读者在自己的Servlet容器中运行Hello World教程,然后点击被Struts2 url 标签所创建的 Hello World 超链接,读者回看到创建的URL是hello.action (相对于网页内容的根目录)。
查看在Hello World 教程中的 struts.xml配置,会看到以下内容:
struts.xml

...
<action name="hello" class="org.apache.struts.helloworld.action.HelloWorldAction" method="execute">
    <result name="success">/HelloWorld.jsp</result>
</action>
...

请将struts.xml文件放在src路径下;官方教程《Hello World using Struts2》中是放在src/main/resources路径下。
上文中的action结点将hello.action匹配到了类HelloWorldAction的execute方法。如果execute方法返回success,页面HelloWorld.jsp(在web内容的根目录)就会返回给用户。
一个普遍的使用案例是,URL同时需要包括一个值,对应查询的字符串参数,比如userName。。为了添加一个查询字符串参数并且他的值使用Struts2参数标签,在url标签中嵌入。
对于使用标签教程,在*index.jsp*Hello World的链接后面添加以下代码即可。
带有参数的url标签

...
<s:url action="hello" var="helloLink">
  <s:param name="userName">Bruce Phillips</s:param>
</s:url>

<p><a href="${helloLink}">Hello Bruce Phillips</a></p>
...

没有把url标签像标签引用属性值那样放置,我们将s:url标签分开到了它自己的代码块。嵌套在url标签里的,是Struts2参数标签。这个标签让你指定一个参数名(例如userName)以及一个值作为参数(例如Bruce Phillips)。
注意 var 属性的使用。var属性值是一个引用,我们可以稍后在自己的代码中指向创建的url。
查看上面的定位标签。注意 href 属性是 helloLinkurl {helloLink}的引用,取代我们创建的超链接。注意,查询字符串参数将会正确地被URL-编码(Bruce+Phillips)。
在接下来的教程中,我们将涉及到Struts如何读取查询字符串的值。

Struts 2 表单标签

大部分应用回使用若干个数据条目表单。Struts2标签使创建输入表单变得容易。
每个Struts2 表单标签有若干个属性,来模拟普通的HTML表单标签属性。
为了创建表单的外形,使用Struts2 表单标签。action属性设置了未来提交目标的动作名。
index.jsp中Hello Bruce Phillips链接之后,添加以下内容。
Struts 2表单

<p>Get your own personal hello by filling out and submitting this form.</p>

<s:form action="hello">
  <s:textfield name="userName" label="Your name" />
  <s:submit value="Submit" />
</s:form>

Struts2的textfield标签提供了一个输入文本html标签,submit标签创建了一个提交按钮。当index页面被服务器返回到浏览器,将会看到:(截图略)
Struts表单,文本区,以及提交标签被转变为了HTML。
Struts表单标签转为HTML内容

<form id="hello" name="hello" action="/using-tags/hello.action;jsessionid=6233ot11na1mtshbr292hu1w" method="post">
  <table class="wwFormTable">
    <tr>
      <td class="tdLabel"><label for="hello_userName" class="label">Your name:</label></td>
      <td class="tdInput"><input type="text" name="userName" value="" id="hello_userName"/></td>
    </tr>
    <tr>
      <td colspan="2">
        <div class="formButton">
          <input type="submit" value="Submit" id="hello_0"/>
        </div>
      </td>
    </tr>
  </table>
</form>

注意Struts2如何在表单中创建一个表,来定位表单元素。在后续教程中,读者会学习如何指定布局(表,CSS)。Struts2 textfield 标签创建了一个HTML的,type为text、name和value对应于textfiled标签的input标签。Struts2也基于textfield标签的label值创建了一个HTML的label标签。
接下来的教程,包括如何使用Struts2 来处理这些表单的提交。

Struts2 property 标签

在Hello World教程中的示例应用,JSP文件HelloWorld.jsp有如下代码:

Struts Property Tag

<s:property value="messageStore.message" />

property标签大部分的用途是“获得”被调用的公开get方法(Action类所提供)所返回的值,并将这个值包含在返回给浏览器的HTML网页中。
正如在Hello World教程中讨论的那样, messageStore.message的值指示 Struts2 首先调用Action类的方法getMessageStore。方法的调用反悔了一个MessageStore对象。.message部分指示Struts2调用MessageStore对象的getMessage方法。getMessage方法返回了一个将会包含在返回给浏览器的HTML中的字符串。
一个Struts2 property标签非常有用的特性是:它会自动将大部分常见的数据类型(int,double,boolean)转换为它们等价的字符串。为了演示这一特性,让我们添加一个静态的int变量到类HelloWorldAction中。

private static int helloCount =0;

public int getHelloCount(){
    return helloCount;
}

每次execute方法被调用,将会让helloCount的值增长1。那么,在HelloWorldAction类的execute方法中添加下面的代码:

增加helloCount

helloCount++;

无论何时用户点击一次index.jsp上的链接(活着提交表单),HelloWorldAction类的方法execute回被执行,静态变量 helloCount会被加1。
为了将helloCount的值在HelloWorld.jsp中,我们将使用Struts2的property标签。到在HelloWorld.jsp的h2标签之后,添加以下内容。

使用Property标签来显示helloCount值

<p>我已经说了 Hello <s:property value="helloCount" /> 次!</p>

这样,尽管getHelloCount方法返回一个整数类型,Struts2将它转换为String类型并且放置到 p 标签体中。
注意,尽管helloCount是静态的,但helloCount的get方法不是静态德。对于Struts2,是通过调用getHelloCount方法来获得helloCount的值,所以getHelloCount方法不能是静态的。
如果被get方法返回的值是一个对象,那么property标签将会引起Struts 2 调用对象的toString()方法。当然,你应当总是重写类对象的toString方法。添加以下的toString方法到MessageStore类中:

添加toString方法到类MessageStore中

public String toString(){
    return message+" (from toString)";
    }

添加以下内容到HelloWorld.jsp中:

使用Property标签来调用toString

<p><s:property value="messageStore" /></p>

由于 HelloWorldAction类的 getMessageStore返回了一个MessageStore对象,Struts2将调用类MessageStore的toString方法。被toString方法返回的字符串将会在浏览器中显示。

本教程涉及了不少内容,但只初级了使用Struts2标签的表面。阅读 《Struts2 Tag Reference》来获得更多关于Struts2标签的信息。

猜你喜欢

转载自blog.csdn.net/u010930289/article/details/76727308