实现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. Python基础笔记:字符串和编码

    1. 当处理文本时,需要现将文本转换为文字,一个字节为8位儿,一个字节最高表示整数255(1111 1111),对应255个状态: 最为人熟知的是ASCii码,ASCii码含128个状态,满足了英文编 ...

  2. 让vscode使用Pipenv工作环境

    1.查看Pipenv的位置 # 先激活Pipenv环境 pipenv shell # 获取当前虚拟环境的位置 pipenv --venv 2.打开setting.json配置文件 Ctrl+Shift ...

  3. Hibernate--起步

    1.配置对象 配置对象是你在任何 Hibernate 应用程序中创造的第一个 Hibernate 对象,并且经常只在应用程序初始化期间创造.它代表了 Hibernate 所需一个配置或属性文件.配置对 ...

  4. 三十七、SAP中文本资源的存放

    一.我们看看之前的代码内容 二.菜单转到->文本元素 三.在文本符号中写入需要替换的内容 四.修改一下代码,可以用text-001来等效替换 五.效果如下

  5. postgrepSQL数据库创建二级分区表

    数据库版本:version 10 以非继承的形式创建分区表,一级分区是城市,二级分区是天:指定分区有两种形式,RANGE和LIST,如果使用RANGE在创建分区语句中是通过FOR VALUES FRO ...

  6. spring boot配置druid连接池连接mysql

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  7. 区间DP----模板

    简介 区间dp,顾名思义就是在一段区间上进行动态规划.对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是分治思想的一种应用,将一个区间问题不断划分为更小的区间直至一个元素组成的区间,枚举他们 ...

  8. filter滤镜兼容ie的rgba属性

    要在一个页面中设置一个半透明的白色div.这个貌似不是难题,只需要给这个div设置如下的属性即可: background: rgba(255,255,255,0.1); 但是要兼容到ie8.这个就有点 ...

  9. matlab中自带的sobol的函数提供的sobol序列

    clc; clear all; close all; M=;% 维度,几个参数 nPop=; VarMin=[0.6, 0.10, 0.002, 0.02, 0.17, 0.0, 0.17, 0.0, ...

  10. python刷LeetCode:13. 罗马数字转整数

    难度等级:简单 题目描述: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II  ...