使用 Struts 2标签

      翻译自Struts官方文档,原文:http://struts.apache.org/getting-started/using-tags.html

      这个教程假设你已经完成了上一篇《Hello World》教程,并且已经有一个能够运行的helloworld项目。这个教程的示例项目“using-tags”,你可以到Struts 2 的Github仓库struts-examples查看或下载。这个示例项目使用Maven作为依赖管理和项目构建工具。 

      在Hello World教程中,我们在index.jsp中添加了一个Struts 2 url标签,创建了一个链接到hello.action的超链接。这篇教程我们将探索这个url标签和其他Struts 2标签特性。

      Web应用程序与传统网站不同的是,Web应用程序可以创建动态响应,以便更容易地从页面引用动态数据。Struts 2框架提供了一套标签库。有些标签模仿标准的HTML标签,同时提供额外的作用。其他标签的创建虽然不是标准的,但是它们是很有用的控件。

     要想在视图页面使用Struts 2标签库,你必须包含一个标签库指令: <%@ taglib prefix="s" uri="/struts-tags" %>。这样所有的Struts 2标签将以 为前缀。如果你想阅读Struts 2标签的TLD文件,你可以到Struts 2 核心jar包中的 META-INF 文件夹下找到它。

Struts 2 url 标签

     Struts 2 URL标签的一个用途是创建与其他web资源的链接,特别是在本地应用程序中的其他资源。

     虽然HTML提供了一个创建超链接的简单标签,但是使用HTML标签无法避免的会包含一些冗余信息。另外,HTML标签不能很容易的访问框架提供的动态数据。

    在Web应用中一个非常普遍的用途就是创建一个链接到其他页面的超链接。 在《Hello World》教程中,我们使用Struts 2 url标签在 index.jsp 中添加了一个链接到hello.action 的超链接。有关url标签的更多信息,请参考 url documentation 。

index.jsp

<!DOCTYPE html>
<%@ 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》教程中的项目时,将鼠标悬停在通过Struts 2 url标签创建的Hello World超链接你将看到URL为hello.action(相对于web 上下文的根路径)。

      在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>
...

      上面的action节点配置了 hello.action 到HelloWorldAction类的execute方法的映射。如果execute方法返回success,视图页面HelloWorld.jsp(在web context root文件夹)将被返回给用户。

       一个常见的用例是,URL还需要一个值作为查询字符串参数使用Struts 2 param标签将查询字符串参数嵌套在url标签中。

      修改 index.jsp 像下面这样:

带参数的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标记作为锚标记的href属性的值,而是将s:url标记分隔到它自己的代码块中,Struts 2 param标签被嵌套在url标签内。这个标记允许您指定一个参数名称(例userName)和该参数的值(例如Bruce Phillips)。

     注意这个var属性的使用。这个var属性的值是我们稍后在代码中可以用来引用创建的url的引用。

     检查上面的a标签。注意href属性的值是${helloLink}. 视图页面将用${helloLink}引用的url标签替换我们创建的超链接。注意,查询字符串参数将被正确地url编码(Bruce+Phillips)。

     在下一个教程中,我们将介绍Struts如何访问查询字符串参数值。

Struts 2 Form 标签

     很多应用都会使用数据输入表单。Struts 2标签创建输入表单很容易。有关Struts 2 表单标签详情,请查阅 Form Tags Reference 。

     Struts 2每一个表单标签都有一些属性,这些属性模拟了正常HTML表单标签属性。

创建表单的外壳使用Struts 2的form标签。action属性设置提交的action名字。

 在 index.jsp 中添加form标签:

Struts 2 Form

<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>

     Struts 2 textfield标签提供了一个带标签文本的HTML输入标签,submit标签创建一个提交按钮。当index页面被服务器返回时在浏览器中你会看到下面的页面:

    

     Struts form、textfield和 submit 标签被转换成下面的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>

    请注意Struts 2是如何在表单内创建一个table来定位表单元素的。在后面的教程中,你将学到如何使用布局(table,CSS)。Struts 2 textfield标签创建了一个带有名称值的文本输入标签,该标签与textfield标记的名称值相匹配。Struts 2还创建了一个基于textfield标签label属性值的HTML  label 标签。

    在下一个教程中,我们将介绍如何使用Struts 2去处理表单的提交。

Struts 2 property 标签

    在 Hello World 教程的示例应用的JSPHelloWorld.jsp 文件中有下面的代码:

Struts Property 标签

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

   这个property标签最常见的用法是,通过调用(Action类的)公有get方法“get”属性的返回值,然后将这个值包含在HTML中返回到浏览器。

    正如Hello World教程中所讨论的,messageStore.message 的作用是命令Struts 2首先要调用Action类的getMessageStore方法。这个方法返回一个 MessageStore 对象。 .message 部分命令Struts 2 调用MessageStore对象的getMessage方法。 getMessage 方法返回一个字符串,包含在HTML中返回到浏览器中。

     Struts 2 property标签一个非常有用的特性是,它可以自动转换常用的数据类型 (int, double, boolean)为字符串。为了验证这个特性,我们在HelloWorldAction类中添加一个静态的int变量:

添加静态属性

private static int helloCount = 0;
	
public int getHelloCount() {
    return helloCount;
}

     每次调用execute方法,我们使helloCount自增1。添加下面的代码到HelloWorldAction类的execute方法 。

自增 helloCount

helloCount++;

   每当用户点击index.jsp页面的超链接一次(或提交表单),HelloWorldAction类的execute方法将被执行,静态属性helloCount将自增1。

     我们可以使用property标签将helloCount 属性的值包含在HelloWorld.jsp中。将下面的代码添加到HelloWorld.jsp 中: 

使用Property标签展示helloCount的值

<p>I've said hello <s:property value="helloCount" /> times!</p>

  所以即使getHelloCount方法返回一个整型,Struts 2也能将它转换为字符串类型,并包含在p标签中。

   注意:即使是helloCount一个静态域但是它的get方法不能是静态的。Note that even though helloCount is a static field, the get method for helloCount is not static. Struts 2通过调用getHelloCount方法获取helloCount的值,getHelloCount方法不能是静态方法。

   如果get方法的返回值是一个对象,property标签将使Struts 2去调用对象的toString方法。当然,你应该总是在你的model类中覆盖掉Class 对象的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对象,Struts 2调用MessageStore类的toString方法返回一个字符串,这个字符串最终展示在浏览器中。

using_tags_hello.png

     虽然我们在这个教程中介绍了很多东西,但是我们实际上只是触及了如何使用Struts 2标签的表面。有关所有Struts 2标签的更多信息请查阅Struts 2 Tag Reference 。

上一篇 Struts 2 Hello Worldor下一篇 编写Struts 2 Action

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值