课程表

Struts2 教程

Struts2 标签

Struts2 集成

工具箱
速查手册

Struts2 Actions动作

当前位置:免费教程 » Java相关 » Struts2

Actions是Struts2框架的核心,因为它们适用于任何MVC(Model View Controller)框架。 每个URL映射到特定的action,其提供处理来自用户的请求所需的处理逻辑。
但action还有另外两个重要的功能。 首先,action在将数据从请求传递到视图(无论是JSP还是其他类型的结果)方面起着重要作用。 第二,action必须协助框架确定哪个结果应该呈现在响应请求的视图中。

创建Action

Struts2中actions的唯一要求是必须有一个无参数方法返回String或Result对象,并且必须是POJO。如果没有指定no-argument方法,则默认是使用execute()方法。
你还可以扩展ActionSupport类,该类可实现六个接口,包括Action接口。Action的接口如下:

  1. public interface Action {
  2. public static final String SUCCESS = "success";
  3. public static final String NONE = "none";
  4. public static final String ERROR = "error";
  5. public static final String INPUT = "input";
  6. public static final String LOGIN = "login";
  7. public String execute() throws Exception;
  8. }

让我们来看看在Hello World示例中的action方法:

  1. package com.w3xue.struts2;
  2.  
  3. public class HelloWorldAction{
  4. private String name;
  5.  
  6. public String execute() throws Exception {
  7. return "success";
  8. }
  9. public String getName() {
  10. return name;
  11. }
  12.  
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. }

为了说明action方法控制视图的要点,让我们对execute方法进行以下更改,并扩展ActionSupport类如下:

  1. package com.w3xue.struts2;
  2.  
  3. import com.opensymphony.xwork2.ActionSupport;
  4.  
  5. public class HelloWorldAction extends ActionSupport{
  6. private String name;
  7.  
  8. public String execute() throws Exception {
  9. if ("SECRET".equals(name))
  10. {
  11. return SUCCESS;
  12. }else{
  13. return ERROR;
  14. }
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19.  
  20. public void setName(String name) {
  21. this.name = name;
  22. }
  23. }

在这个例子中,我们在execute方法中使用一些逻辑来查看name属性。如果属性等于字符串“SECRET”,我们返回SUCCESS作为结果,否则我们返回ERROR作为结果。因为我们已经扩展了ActionSupport,所以我们可以使用String常量、SUCCESS和ERROR。 现在,让我们修改struts.xml文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <constant name="struts.devMode" value="true" />
  7. <package name="helloworld" extends="struts-default">
  8. <action name="hello"
  9. class="com.w3xue.struts2.HelloWorldAction"
  10. method="execute">
  11. <result name="success">/HelloWorld.jsp</result>
  12. <result name="error">/AccessDenied.jsp</result>
  13. </action>
  14. </package>
  15. </struts>

创建视图

让我们在你的eclipse项目的WebContent文件夹中创建下面的jsp文件HelloWorld.jsp。右键单击项目资源管理器中的WebContent文件夹,然后选择“New”> “JSP File”。如果返回结果是SUCCESS将调用此文件(这个字符串常量“success”是在Action接口中定义的):

  1. <%@ page contentType="text/html; charset=UTF-8" %>
  2. <%@ taglib prefix="s" uri="/struts-tags" %>
  3. <html>
  4. <head>
  5. <title>Hello World</title>
  6. </head>
  7. <body>
  8. Hello World, <s:property value="name"/>
  9. </body>
  10. </html>

如果action的结果是ERROR,即字符串常量为“error”,下面的文件将被框架调用。 以下是AccessDenied.jsp的内容:

  1. <%@ page contentType="text/html; charset=UTF-8" %>
  2. <%@ taglib prefix="s" uri="/struts-tags" %>
  3. <html>
  4. <head>
  5. <title>Access Denied</title>
  6. </head>
  7. <body>
  8. You are not authorized to view this page.
  9. </body>
  10. </html>

我们还需要在WebContent文件夹中创建index.jsp文件。此文件将用作初始的action URL,用户可以单击它以命令Struts 2框架调用HelloWorldAction类的execute方法并呈现HelloWorld.jsp视图。

  1. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  2. pageEncoding="ISO-8859-1"%>
  3. <%@ taglib prefix="s" uri="/struts-tags"%>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  5. "http://www.w3.org/TR/html4/loose.dtd">
  6. <html>
  7. <head>
  8. <title>Hello World</title>
  9. </head>
  10. <body>
  11. <h1>Hello World From Struts2</h1>
  12. <form action="hello">
  13. <label for="name">Please enter your name</label><br/>
  14. <input type="text" name="name"/>
  15. <input type="submit" value="Say Hello"/>
  16. </form>
  17. </body>
  18. </html>

这样,没有改变web.xml文件的需求,所以我们可以使用前面在Hello World示例章节中创建的的web.xml文件。现在,我们准备好使用Struts 2框架运行我们的Hello World应用程序了。

执行应用程序

右键单击项目名称,然后单击“Export”>“WAR File”创建WAR文件。 然后在Tomcat的webapps目录中部署这个WAR文件。最后,启动Tomcat服务器并尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp。显示的图示如下:

输入

让我们输入一个单词为“SECRET”,你会看到如下页面:

secret成功

现在输入除“SECRET”之外的任何词,你会看到如下页面:

错误

创建多个Actions

你会需要频繁定义多个action来处理不同的请求,并为用户提供不同的URL,因此你将如下定义的不同类:

  1. package com.w3xue.struts2;
  2. import com.opensymphony.xwork2.ActionSupport;
  3.  
  4. class MyAction extends ActionSupport{
  5. public static String GOOD = SUCCESS;
  6. public static String BAD = ERROR;
  7. }
  8.  
  9. public class HelloWorld extends ActionSupport{
  10. ...
  11. public String execute()
  12. {
  13. if ("SECRET".equals(name)) return MyAction.GOOD;
  14. return MyAction.BAD;
  15. }
  16. ...
  17. }
  18.  
  19. public class SomeOtherClass extends ActionSupport{
  20. ...
  21. public String execute()
  22. {
  23. return MyAction.GOOD;
  24. }
  25. ...
  26. }

你将如下在struts.xml文件中的配置这些action:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. struts>
  6. <constant name="struts.devMode" value="true" />
  7. <package name="helloworld" extends="struts-default">
  8. <action name="hello"
  9. class="com.w3xue.struts2.HelloWorld"
  10. method="execute">
  11. <result name="success">/HelloWorld.jsp</result>
  12. <result name="error">/AccessDenied.jsp</result>
  13. </action>
  14. <action name="something"
  15. class="com.w3xue.struts2.SomeOtherClass"
  16. method="execute">
  17. <result name="success">/Something.jsp</result>
  18. <result name="error">/AccessDenied.jsp</result>
  19. </action>
  20. </package>
  21. </struts>

正如你在上面的例子中看到的,action的结果SUCCESS和ERROR是重复的。为了解决这个问题,建议您创建一个包含结果的类。

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号