实现Action

 对于开发者来说,Action才是应用的核心,开发者需要提供大量的Action类,并在Struts.xml文件中配置Action。Action类中包含了用户请求的处理逻辑,Action也被称为业务控制器。

 相对于Struts1来说,Struts2采用了低侵入式的设计,Struts2不要求Action类继承任何的Struts基类,或者实现任何的Struts2的接口,在这种设计方式下,Struts2 的Action类只是一个普通的POJO(简单的Java对象),通常包含一个无参数的execute方法,从而有很好的代码复用性。

Struts2通常是使用Action来封装HTTP请求参数的,因此Action中还应包含于请求参数对应的属性,并且为这些属性提供getter和setter方法

例如:用户请求参数包含了user和pass两个请求参数,那么Action应该提供user和pass两个属性用来封装用户的请求参数,如下

package com.strtus2.action;

//处理用户请求的Action类只是一个普通的Java类
public class LoginAction {
private String user;
private String pass; public String getUser() {
return user;
} public void setUser(String user) {
this.user = user;
} public String getPass() {
return pass;
} public void setPass(String pass) {
this.pass = pass;
} // Action类默认处理用户请求的方法:execute()
public String execute() { // 返回处理结果字符串
return resultStr;
}
}

即使Action需要处理的请求包含了user和pass两个HTTP请求参数,Action类也可以不包含user和pass变量,因为系统是通过对应的getter和setter方法来处理请求参数的,而不是通过变量名来处理请求参数的,也就是说,如果包含了user的HTTP请求参数,Action类是否包含了user变量并不重要,重要的是包含了void setUser(String user)和 String getUser()两个方法

Action类里的属性,不仅可以用于封装请求参数,还可以用于封装处理结果。例如,我们希望将服务器提示的“登录成功”或者其他的信息在下一个页面输出,那么可以在Action中增加一个tip属性,并未该属性提供对用的setter和gettier方法,既为Action类增加如下代码。

   private String tip;

    public String getTip() {
return tip;
} public void setTip(String tip) {
this.tip = tip;
}

  

一旦在Action中设置了tip属性的值,就可以在下一个页面中使用Struts2标签来输出该属性的值,例如在JSP页面中输出了tip属性值

  <s:property value="tip"/>

  系统不会严格的区分Action中哪个是用于封装请求参数的值,哪个属性是用来封装处理结果的,对系统而言,封装请求参数和封装处理结果的属性是完全平等的。如果系统中包含了名为tip的请求参数,则系统回调用Action类的void setTip(String tip)方法,通过这种方法,名为tip的请求参数就可以传入Action实例,如果没有void setTip(String tip)方法,那么名为tip的请求参数是不能传入到Action实例的。

  同样,在JSP页面中输出Action属性时,它也不会区分该属性时用于封装请求参数还是用于封装处理结果,因此,使用Struts2的标签库既可以输出Action的处理结果,也可以输出请求参数的值。

  从上面可以看出,使用struts2的标签库可以输出一个简单的字符串,使用<s:property..../>标签来控制输出,实际上,Action类中可以封装非常复杂的属性,包括其他用户自定义的类,数组,集合对象和Map对象,对于这些复杂类型的输出,一样可以通过Struts2的标签来完成。

一.Action接口和ActionSupport基类

  为了让用户开发的Action更规范,Struts2提供了一个Action接口,这个接口定义了Struts2的Action处理类应该实现的规范。

public class Action {
// 定义Action接口中的一些字符串
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public static final String NONE = "none";
public static final String SUCCESS = "success"; // 定义用户请求的execute方法
public String execute() throws Exception { return null; }
}

  Action中定义了一个execute方法,该接口的规范规定了Action类应该包含一个execute方法,该方法返回一个字符串,除此之外,该接口还定义了5个字符串常量,它们的作用是统一execute方法的返回值,如果开发者希望使用特定的字符串作为返回值也是可以的。

  另外,Struts2还提供了一个ActionSupport类,该类是实现Action接口的类,该类中提供了许多的默认方法,因为ActionSupport完全符合一个Action的要求,多有我们可以直接使用ActionSuppot作为业务控制器,如果我们配置Action是没有指定特定的类(既用户没有提供Action类),系统就会自动使用ActionSupport类作为Action处理类。

实现Action的更多相关文章

  1. redux-amrc:用更少的代码发起异步 action

    很多人说 Redux 代码多,开发效率低.其实 Redux 是可以灵活使用以及拓展的,经过充分定制的 Redux 其实写不了几行代码.今天先介绍一个很好用的 Redux 拓展-- redux-amrc ...

  2. 尝试asp.net mvc 基于controller action 方式权限控制方案可行性

    微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...

  3. ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results

    原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...

  4. java中Action层、Service层和Dao层的功能区分

    Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...

  5. SpringMVC的Action在同一时间里只允许同一个浏览器的单次进入?

    最近用SpringMVC写了一个很简单的测试程序,代码如下: @Controller public class LongTimeTaskController { @RequestMapping(val ...

  6. No result defined for action com.lk.IndexAction and result success

    意图访问一个 /es/index.action 竟然出现: [SAE ] ERROR [05-11 13:54:32] [http-80-5] com.opensymphony.xwork2.util ...

  7. 实现MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器

    MVC开发中几种以AOP方式实现的Filters是非常好用的,默认情况下,我们通过App_Start中的FilterConfig来实现的过滤器注册是全局的,也就是整个应用程序都会使用的,针对单独的Fi ...

  8. ASP.NET MVC 5调用其他Action

    引用代码: @Html.Action("Index", "BaseData", new { d = "variety" }) 后台获取参数: ...

  9. C#基础知识六之委托(delegate、Action、Func、predicate)

    1. 什么是委托 官方解释 委托是定义方法签名的类型,当实例化委托时,您可以将其实例化与任何具有兼容签名的方法想关联,可以通过委托实例调用方法. 个人理解 委托通俗一点说就是把一件事情交给别人来帮助完 ...

  10. 在Application_Error事件中获取当前的Action和Control

    ASP.NET MVC程序处理异常时,方法有很多,网上也有列举了6种,下面是使用全局处理在Global.asax文件的Application_Error事件中实现.既然是ASP.NET MVC,我需要 ...

随机推荐

  1. <强化学习>无模型下计算给定策略对应的价值函数,Model free Prediction,评估一个给定策略的表现

    一.Intro Prediction只是评估给定策略的表现,直白的说它是找 “在环境ENV下,AGENT按照给定的策略pai,AGENT的价值函数”. 这篇blog只介绍三种计算方法,没有涉及到 “求 ...

  2. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring声明式事务管理(基于Annotation注解方式实现)

    在 Spring 中,除了使用基于 XML 的方式可以实现声明式事务管理以外,还可以通过 Annotation 注解的方式实现声明式事务管理. 使用 Annotation 的方式非常简单,只需要在项目 ...

  3. Node.js NPM Package.json

    章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json Nod ...

  4. junit基础学习之-多线程测试(6)

    步骤: 1.定义单个TestRunner 2.重载单个TestRunner的runTest() 3.定义TestRunner数组,并添加多个TestRunner 4.MultiThreadedTest ...

  5. java集合对象实现原理

    1.集合包 集合包是java中最常用的包,它主要包括Collection和Map两类接口的实现. 对于Collection的实现类需要重点掌握以下几点: 1)Collection用什么数据结构实现? ...

  6. [题解] Luogu P4245 [模板]任意模数NTT

    三模NTT 不会... 都0202年了,还有人写三模NTT啊... 讲一个好写点的做法吧: 首先取一个阀值\(w\),然后把多项式的每个系数写成\(aw + c(c < w)\)的形式,换句话说 ...

  7. mysql初始化出现:FATAL ERROR: Neither host 'DB01' nor 'localhost' could be looked up with

    初始化时: FATAL ERROR: Neither host 'DB01' nor 'localhost' could be looked up with /application/mysql/bi ...

  8. promise 核心技术3 使用

    什么是promise?(加深理解) 抽象表达:(比较高的高度 看这门技术) Promise是js中进行异步操作的新的解决方案(旧形式:纯回调的形式) 具体表达: 从语法上,Promise是一个构造函数 ...

  9. Json字符串转Java对象和List集合

    对象POJO和JSON互转 public class JsonUtil { /** * JSON 转 POJO */ public static <T> T getObject(Strin ...

  10. 学生选课系统(Java语言期末前测试)

      测试具体要求: 2.系统要求与功能设计 2.1 页面要求 (1)能够在Tomcat服务器中正确部署,并通过浏览器查看: (2)网站页面整体风格统一: (3)首页(登录页)要求实现不同用户登录后,进 ...