实现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. 091-PHP数组过滤函数array_filter,过滤非整数

    <?php function not_int($x){ //定义过滤非整数的函数 if(is_int($x)) return TRUE; } $arr=array(1,2,'a',3,4,'c' ...

  2. 调试ASP.NET程序

    用VS打开你的项目 从VS中找到"调试"-----"附件到进程",然后选中w3wp.exe,点击附件到进程,然后再发送数据进行调试就可以了

  3. Flink on yarn以及实现jobManager 高可用(HA)

    on yarn https://ci.apache.org/projects/flink/flink-docs-release-1.8/ops/deployment/yarn_setup.html f ...

  4. 干货分享|留学Essay怎么写?

    留学生活其实就是分割成一个个deadline,留学就是赶完一个又一个deadline.朋友同学的革命情感源自赶一个个deadline时候的不离不弃,相知相守,无数个夜里大家群里打卡,你今天Essay写 ...

  5. python函数-迭代器&生成器

    python函数-迭代器&生成器 一.迭代器 1 可迭代协议 迭代:就是类似for循环,将某个数据集内的数据可以“一个挨着一个取出来” 可迭代协议: ① 协议内容:内部实现__iter__方法 ...

  6. UVA - 1645 Count (统计有根树)(dp)

    题意:输入n(n <=1000),统计有多少个n结点的有根树,使得每个深度中所有结点的子结点数相同.输出数目除以109+7的余数. 分析: 1.dp[i],i个结点的有根树个数 2.假设n=7, ...

  7. 【Vue中的坑】Vue中的@mouseenter没反应?

    在开发中想实现鼠标悬浮,然后发现事件不由被出发,查找资料,发现并不是所有情况都不能用 下面就简单的说一下如何避免这种情况 如果你的悬浮事件是在 a 标签上,那么你直接使用就会出问题,你需要加一个nat ...

  8. 小程序实现textarea行数自动增加

    查找网上案例很多,但是都不是很满意,参考大牛案例终结了一下,话不多说代码如下: 实现效果: 前段代码 <view class="text-box"> <view& ...

  9. ACM蒟蒻防bug专用 ( •̀ ω •́ )✧

    /*********************************************** * _ooOoo_ * * o8888888o * * 88" . "88 * * ...

  10. Android自定义View——刮刮卡效果

    想要红包的实现效果的可以关注我的博客,仿饿了么红包 下层图片:我们的红包的图片 上层图片:有两部分 一部分是灰色背景 一部分是拥有透明度为0,并且模式为交集的画笔 使用滑动监听,滑动时,用透明度为0的 ...