Struts2之Action基础与配置
Action基础
Action是什么
在Struts2中,一个Action类代表一次请求或调用,每个请求的动作都对应于一个相应的Action类,一个Action类是一个独立的工作单元。也就是,用户的每次请求,都会转到一个相应的Action类里面,由这个Action类来进行处理,因此一个Action类代表了用户的一次请求或调用。简单来说,Action就是用来处理一次用户请求的对象。
Action能干什么

- public class HelloWorldAction implements Action {
- private String account;
- private String password;
- public String execute() throws Exception {
- System.out.println("用户输入的参数为===" + "account=" + account + ",password=" + password);
- return "toWelcome";
- }
- public String getAccount() {
- return account;
- }
- public void setAccount(String account) {
- this.account = account;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }

根据上面的Action实现,在Struts2里面,Action充当着MVC中模型的角色,也就是Action既封装了业务数据,又要处理业务功能。在实际的JavaEE开发中,逻辑部分会放到逻辑层去实现,这就变成Action只是去调用逻辑层来进行业务逻辑的处理,并不是真的在Action里面去实现业务逻辑的处理。上面Action的属性和属性对应的getter/setter方法,就是用来接收用户请求的数据,并把这些数据封装在Action中,在后续处理中可以访问这些数据。上面Action的实现中的execute方法的实现,你会发现execute方法里面实现的功能,正是前面学习的MVC的控制器部分的功能。从另外一个角度说,Struts2的Action也充当着MVC中控制器的角色。
那Struts2的Action相当于MVC中的控制器还是模型?
虽然两种说法都过得去,但是目前大家的共识是把Struts2的Action作为MVC中的模型角色来看待。原因是在Struts2运行的时候,是由Struts2中的前端控制器FilterDispatcher分发并调用相应的Action,此时Action仅仅相当于一次请求的命令处理,层面比较小,再加上已经有FilterDispatcher来做控制器进行分发调度,因此,一般不把 Struts2的Action当作MVC的控制器来看,而是当作MVC的模型来看。
Action的配置
不管Action采用何种实现方式,要正确运行,都需要在struts.xml中进行配置,这是使用Action的基础。
<package>的配置
Action需要在struts.xml中配置才可以使用,而且Action应该配置成为<package>元素的子元素,那么<package>元素的功能是什么?
<package>元素可以把逻辑上相关的一组Action、Result、Intercepter等元素封装形成一个独立的模块,package可以继承其他的package,也可以作为父包被其他的package继承,比如配置“<package name="helloworld" extends="struts-default">”,helloworld这个包就继承了struts-default这个包。
<package>元素有如下属性:
name:包的名称。必须配置
extends:要继承的包,后面配置的是被继承的包的名称。可选
namespace:包的命名空间。可选
abstract:定义包为抽象的,也就是不能包含Action的定义。可选
namespace配置的是包的命名空间,同一个命名空间里面不能有同名的Action,当然不同的命名空间里面是可以有同名的Action的。类似于Java的包的功能,namespace可以有效的防止action重名的冲突,因为配置了namespace后,在访问action的时候就需要添加namespace来作为action的前缀。如果不配置namespace,表示是默认的namespace,那么访问的时候不需要添加namespace前缀。
abstract用来定义包为抽象的,也就是不能包含Action的定义,但是抽象包可以被其他包继承,因此里面可以定义其他包需要的元素,比如ResultType、Interceptor等等。
<action>的配置
虽然Action在Struts2的开发中非常重要,但是其配置非常简单,基本的规则如下:
<action>元素是<package>元素的子元素,应该配置在<package>元素里面
<action>元素通常需要配置name和class属性,其中name是必须的
<action>元素可以包含其他的子元素:比如<param>、<result>、<interceptor-ref>、<exception-mapping >
通常也就是配置name和class属性,然后配置<result>子元素。
为何可以不配置<action>的class属性?
<package>元素的extends属性配置“struts-default”,说明了这个包继承了一个叫“struts- default”的包,这是Struts2默认配置好的各个<package>元素的公用配置。打开它,可以发现这个文件类似于我们熟悉的struts.xml。根元素也是<struts>,<struts>元素下面有一个子元素<package>,这个<package>的name属性的值正是“struts-default”。看最后的配置<default-class-ref class="com.opensymphony.xwork2.ActionSupport"
/>,这说明<action>元素不写class属性的时候,默认配置就是使用ActionSupport类。这种做法有什么用?大多数情况下都是需要配置<action>的class属性的值的,因为我们需要把自己写的,用来处理请求的Action类配置上去,而不是使用默认的配置。考虑一种情况,在实际开发中对安全性要求较高的web项目,往往把jsp放在WEB-INF文件夹中,这样可以防止外界直接通过URL来访问jsp页面,这时的jsp就一定要是Servlet或Action的后继页面,才可以被访问到。因此,如果我们有一个jsp页面在WEB-INF下,但在它之前不需要Action访问逻辑层,相当于需要直接访问这个jsp页面。就可以让这个jsp作为ActionSupport的后继页面,使用default-class-ref,可以减少重复配置。
Struts2之Action基础与配置的更多相关文章
- struts2 之 Action的优化配置
总结:struts2种action的配置文件会随着业务的增加而增加,导致配置文件膨胀.struts2中提供了三种方案来解决这个问题: 1. 动态方法调用来实现. 2. 通配符配置来解决. 3. 使用注 ...
- Struts2第三篇【Action开发方式、通配符、Struts常量、跳转全局视图、action节点默认配置】
前言 上篇Struts博文已经讲解了Struts的开发步骤以及执行流程了-..对Struts的配置文件有了了解-..本博文继续讲解Struts在配置的时候一些值得要学习的细节- Action开发的三种 ...
- Struts2之配置文件中Action的详细配置
在Struts2之配置一文中,我们知道一个struts配置文件可以分为三部分:常量配置 包含其他配置文件的配置 Action配置 . 这其中 常量配置 和 包含其他配置文件的配置 二 ...
- 关于Struts2中 Action 配置method的解读
为Action配置method属性: 将Action类中的每一个处理方法都定义成一个逻辑Action方法. <!DOCTYPE struts PUBLIC "-//Apache Sof ...
- 【struts2基础】配置详解
一.struts2工作原理(网友总结,千遍一律) 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做Action ...
- struts2的占位符*在action中的配置方法
转自:https://blog.csdn.net/u012546338/article/details/68946633 在配置<action> 时,可以在 name,class,meth ...
- Struts2之Action
Struts2之Action MVC模式中需要有一个控制器来负责浏览器与服务器之间的通信,实现用户与服务器的交互.在Struts2框架中实现这一功能的是Action,它是整个框架最核心的部分.Acti ...
- struts2的action是线程安全的,struts1的action不是线程安全的真正原因
为什么struts2的action是线程安全的,struts1的action不是线程安全的? 先对struts1和struts2的原理做一个简单的讲解 对于struts1 ,当第一次**.do的请求过 ...
- struts2的action是多例,servlet是单例
struts2中action是多例的,即一个session产生一个action如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修改时间不同,两个用户访问得到的 属性不一样,操作得出的 ...
随机推荐
- <转> 纸牌屋1-4集分析
原文:http://blog.sina.com.cn/s/blog_b86c61490102v56t.html 第一季第一集 主人公弗兰克的出场,是以对待一只邻家将死之狗的态度展开的,充分显示了主人公 ...
- c#鼠标在控件上面,然后显示文字
先添加toolTip控件到界面 然后每个控件的属性会多一项 ToolTip 第一种:直接给里面加文字 第二种: private void pictureBox_topmost_MouseHover(o ...
- C++常量指针与常量数据
常量指针即指针是常量的,一但声明指向某个数据后不能被更改,但是指向的数据可以被更改.声明格式如下: ; int * const p = &demo; 常量数据是指数据是常量的,一但被初始化后不 ...
- php+mssql 已经写好的万能函数
<?php /****************************************************************************************** ...
- windows安装composer方法和使用方法
最近在学习yii2的框架的相关知识,对于yii2的许多新特性,最好还是去查看官网文档最好,如果有中文翻译的网站就更好了. 学习yii2的第一个门槛就是得安装composer这个依赖管理工具(但目前我认 ...
- js获取IP地址的方法小结
s代码获取IP地址的三种方法,在js中取得客户端的IP地址. 原文地址:http://www.jbxue.com/article/11338.html 1,js取得IP地址的方法一 <scrip ...
- Python爬虫学习:三、爬虫的基本操作流程
本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将 ...
- Nutshell.ThreadWorkerPool .Net线程池设计
功能描述: 支持创建多个线程池,并统一管理 支持不同线程池的容量控制,以及最少活动线程的设置 支持不同线程池中活动线程的闲时设置,即线程空闲时间到期后即自动被回收 结构设计: ThreadWorker ...
- CART剪枝
与上篇文章中提到的ID3算法和C4.5算法类似,CART算法也是一种决策树分类算法.CART分类回归树算法的本质也是对数据进行分类的,最终数据的表现形式也是以树形的模式展现的,CART与ID3,C4. ...
- Effective Java2读书笔记-类和接口(四)
第19条:接口只用于定义类型 这一条就举了一个反例,说有些接口中只包含常量.这是对接口的不良使用.要实现相同的功能,应该使用不可实例化的工具类(第4条说过). public class Physica ...