转载

Struts2 Action/动作

   

动作是Struts2框架的核心,因为他们的任何MVC(模型 - 视图 - 控制器)框架。每个URL将被映射到一个特定的动作,它提供了来自用户的请求提供服务所需的处理逻辑。

但动作也提供其他两个重要的能力。首先,操作从请求数据的传输中起着重要的作用,通过向视图,无论是一个JSP或其它类型的结果。二,动作必须协助的框架,在确定结果应该渲染视图,在响应该请求将被退回。

创建动作:

在Struts2的动作,唯一的要求是必须有一个无参数的方法返回String或结果的对象,必须是一个POJO。如果不带参数的方法是不指定,则默认动作是使用execute()方法。

也可以选择扩展ActionSupport类实现了6个接口,包括动作界面。动作界面如下:

 public interface Action {    public static final String SUCCESS = "success";    public static final String NONE = "none";    public static final String ERROR = "error";    public static final String INPUT = "input";    public static final String LOGIN = "login";    public String execute() throws Exception; }

让我们来看看Hello World示例的操作方法:

 package com.yiibai.struts2;  public class HelloWorldAction{    private String name;     public String execute() throws Exception {       return "success";    }        public String getName() {       return name;    }     public void setName(String name) {       this.name = name;    } }

为了说明这一点,操作方法控制视图,让我们做出以下更改执行方法和扩展类ActionSupport 如下:

 package com.yiibai.struts2;  import com.opensymphony.xwork2.ActionSupport;  public class HelloWorldAction extends ActionSupport{    private String name;     public String execute() throws Exception {       if ("SECRET".equals(name))       {          return SUCCESS;       }else{          return ERROR;         }    }        public String getName() {       return name;    }     public void setName(String name) {       this.name = name;    } }

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

 <?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>       <constant name="struts.devMode" value="true" />       <package name="helloworld" extends="struts-default">          <action name="hello"              class="com.yiibai.struts2.HelloWorldAction"             method="execute">             <result name="success">/HelloWorld.jsp</result>             <result name="error">/AccessDenied.jsp</result>          </action>       </package> </struts>

创建视图

让我们创建以下JSP文件 helloWorld.jsp 的WebContent文件夹在eclipse项目。要做到这一点,右键单击WebContent文件夹在项目资源管理器,选择New >JSP File。该文件将要求返回的结果是SUCCESS,这是一个字符串常量“success”的定义在动作界面:

 <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Hello World</title> </head> <body>    Hello World, <s:property value="name"/> </body> </html>

以下是由框架的动作的结果将被调用的文件,该文件是等于字符串常量“错误”的ERROR 。以下是AccessDenied.jsp 的内容

 <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Access Denied</title> </head> <body>    You are not authorized to view this page. </body> </html>

我们还需要在WebContent文件夹中创建index.jsp。该文件将作为初始动作URL,用户可以直接点击告诉Struts 2框架调用HelloWorldAction类的 execute方法,并呈现 helloWorld.jsp视图。

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

就是这样,不需要改变的web.xml文件,所以让我们用同一个web.xml,是之前我们已经创建了范例章。现在,我们已经准备好运行使用Struts 2框架的 Hello World应用程序。

执行应用程序

右键点击项目名称,并单击 Export > WAR File 创建一个WAR文件。然后在Tomcat 的webapps目录下部署这个WAR。最后,启动Tomcat服务器和尝试访问URL http://localhost:8080/HelloWorldStruts2/index.jsp。这会给出以下画面:

Struts2 Action/动作

让我们为“SECRET”,并输入一个字,应该看到以下页面:

Struts2 Action/动作

现在输入任何单词而非“SECRET”,应该看到以下页面: 

Struts2 Action/动作

建立多个动作:

经常会定义一个以上的动作,以处理不同的请求,并提供不同的用户的URL,因此可以定义不同的类定义如下:

 package com.yiibai.struts2; import com.opensymphony.xwork2.ActionSupport;     class MyAction extends ActionSupport{       public static String GOOD = SUCCESS;       public static String BAD = ERROR;    }     public class HelloWorld extends ActionSupport{       ...       public String execute()       {          if ("SECRET".equals(name)) return MyAction.GOOD;          return MyAction.BAD;       }       ...    }     public class SomeOtherClass extends ActionSupport{       ...       public String execute()       {          return MyAction.GOOD;       }       ...    }

在struts.xml文件中配置这些操作如下:

 <?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>  <constant name="struts.devMode" value="true" />    <package name="helloworld" extends="struts-default">       <action name="hello"           class="com.yiibai.struts2.HelloWorld"           method="execute">          <result name="success">/HelloWorld.jsp</result>          <result name="error">/AccessDenied.jsp</result>       </action>       <action name="something"           class="com.yiibai.struts2.SomeOtherClass"           method="execute">          <result name="success">/Something.jsp</result>          <result name="error">/AccessDenied.jsp</result>       </action>    </package> </struts>

正如看到在上述假设的例子,动作的结果是重复的SUCCESS和ERROR。要解决这个问题,建议创建一个类包含结果的结果。

   
正文到此结束
Loading...