实现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. 01-JAVA语言基础——课程作业1—编写一个程序,此程序从命令行接收多个数字,求和之后输出结果。

    1.题目:编写一个程序,此程序从命令行接收多个数字,求和之后输出结果. 2.程序设计思想: 通过运行配置输入数字后,其保存类型为String类型,因此需要采用Integer.valueOf(arg)将 ...

  2. Mac电脑上怎么设置环境变量

    https://jingyan.baidu.com/article/8065f87f47b29523312498e4.html 环境变量是电脑操作系统中常用的一些变量,作用类似于将一些常用命令所在的文 ...

  3. C# 并行线程调用

    参考 一.异步委托开启线程 Action<int, int> a = add; a.BeginInvoke(, , null, null);//前两个是add方法的参数,后两个可以为空 C ...

  4. C#当前程序路径获取

    //获取当前进程的完整路径,包含文件名(进程名).string str = this.GetType().Assembly.Location;result: X:\xxx\xxx\xxx.exe (. ...

  5. JavaScript——装饰者模式

    今天打算开始系统的学习设计模式,虽然之前有看过<大话设计模式>但是没能够静下心来写学习笔记导致很多内容都只是有一个概念而不会去应用.这次要记下学习的过程.接下来进入主题. 何为设计模式?设 ...

  6. php条件判断(9.29 第十五天)

    超级全局变量:$GLOBALS //包含全部变量的全局组合数组$_SERVER //包含请求头中的信息,用户的IP.用户的UA.头信息$_REQUEST //包含用户提交的所有数据(POST/GET ...

  7. UVA - 12545 Bits Equalizer (比特变换器)(贪心)

    题意:输入两个等长(长度不超过100)的串S和T,其中S包含字符0,1,?,但T只包含0和1,你的任务是用尽量少的步数把S变成T.有以下3种操作: 1.把S中的0变成1. 2.把S中的“?”变成0或1 ...

  8. (转)null和NULL和nullptr和””区别

    突然想到这个有趣的问题:C语言和C++对大小写是敏感的,也就是说null和NULL是区别对待的.NULL代表空地址,null只是一个符号.便来深究,看了很多资料,总结如下: 其实null和NULL都是 ...

  9. java String字符串判断

    判断空字符串:StringUtils.isBlank StringUtils.isBlank(null) = true StringUtils.isBlank("") = true ...

  10. 吴裕雄--天生自然 JAVASCRIPT开发学习:字符串

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...