Struts2中Action详解

掌握Struts2框架中的Action组件 本文还有配套的精品资源,点击获取 简介:Struts2是一个基于MVC模式的开源框架,广泛用于构建企业级Java Web应用。Action是该框架的核心组件之一,用于处理用户请求并将结果返回给视图层。本文深入解析了Action接口、配置、结果类型、ActionContext、拦截器、插件、扩展性、ActionSupport与OGNL等关键概念,并提供了学习资料以帮助开发者深... 阅读详情
 在Struts2中Action部分,也就是Controller层采用了低侵入的方式。为什么这么说?这是因为在Struts2中action类并不需要继承任何的基类,或实现任何的接口,更没有与Servlet的API直接耦合。它通常更像一个普通的POJO(通常应该包含一个无参数的execute方法),而且可以在内容定义一系列的方法(无参方法),并可以通过配置的方式,把每一个方法都当作一个独立的action来使用,从而实现代码复用。

例如:

package example;

public class UserAction {

       private String username;

       private String password;

    public String execute() throws Exception {

              //…………..

        return “success”;

    }

    public String getUsername() {

        return username;

    }

    public void setUsername(String username) {

        this.username = username;

    }

    public String getPassword() {

        return password;

    }

    public void setPassword(String password) {

        this.password = password;

    }

}

在这个Action类里的属性,既可以封装参数,又可以封装处理结果。系统并不会严格区分它们。

但是为了使用户开发的Action类更规范,Struts2为我们提供了一个接口Action,该类定义如下:

publicinterface Action {

    publicstaticfinal String ERROR="error";

    publicstaticfinal String INPUT="input";

    publicstaticfinal String NONE="none";

    publicstaticfinal String LOGIN="login";

    publicstaticfinal String SUCCESS="success";

    public String execute()throws Exception;

}

但是我们写Action通常不会实现该接口,而是继承该接口的实现类ActionSupport.

该类代码如下:

public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable {

     ................

    public void setActionErrors(Collection errorMessages) {

        validationAware.setActionErrors(errorMessages);

    }

    public Collection getActionErrors() {

        return validationAware.getActionErrors();

    }

    public void setActionMessages(Collection messages) {

        validationAware.setActionMessages(messages);

    }

    public Collection getActionMessages() {

        return validationAware.getActionMessages();

    }

       public Collection getErrorMessages() {

        return getActionErrors();

    }

       public Map getErrors() {

        return getFieldErrors();

    }

//设置表单域校验错误

    public void setFieldErrors(Map errorMap) {

        validationAware.setFieldErrors(errorMap);

    }

    public Map getFieldErrors() {

        return validationAware.getFieldErrors();

    }

    public Locale getLocale() {

        ActionContext ctx = ActionContext.getContext();

        if (ctx != null) {

            return ctx.getLocale();

        } else {

            LOG.debug("Action context not initialized");

            return null;

        }

    }

//获取国际化信息的方法

    public String getText(String aTextName) {

        return textProvider.getText(aTextName);

    }

    public String getText(String aTextName, String defaultValue) {

        return textProvider.getText(aTextName, defaultValue);

    }

    public String getText(String aTextName, String defaultValue, String obj) {

        return textProvider.getText(aTextName, defaultValue, obj);

    }

       .........

 //用于访问国际化资源包的方法

    public ResourceBundle getTexts() {

        return textProvider.getTexts();

    }

    public ResourceBundle getTexts(String aBundleName) {

        return textProvider.getTexts(aBundleName);

    }

//添加action的错误信息

    public void addActionError(String anErrorMessage) {

        validationAware.addActionError(anErrorMessage);

    }

//添加action的普通信息

    public void addActionMessage(String aMessage) {

        validationAware.addActionMessage(aMessage);

    }

    public void addFieldError(String fieldName, String errorMessage) {

        validationAware.addFieldError(fieldName, errorMessage);

    }

      

    public void validate() {

    }

    public Object clone() throws CloneNotSupportedException {

        return super.clone();

    }

 ..........

}

前面说到struts2并没有直接与Servlet的API耦合,那么它是怎么访问Servlet的API的呢?

原来struts2中提供了一个ActionContext类,该类模拟了Servlet的API。其主要方法如下:

1)Object get (Object key):该方法模拟了HttpServletRequest.getAttribute(String name)方法。

2)Map getApplication()返回一个Map对象,该对象模拟了ServletContext实例.

3)static ActionContext getContext():获取系统的ActionContext实例。

4)Map getSession():返回一个Map对象,该对象模拟了HttpSession实例.

5)Map getParameters():获取所有的请求参数,模拟了HttpServletRequest.getParameterMap()

你也许会奇怪为什么这些方法老是返回一个Map?这主要是为了便于测试。至于它是怎么把Map对象与实际的Servlet API的实例进行转换的,这个我们根本就不要担心,因为struts2已经内置了一些拦截器来帮我们完成这一转换。

为了直接使用Servlet的API,Struts2为我们提供了以下几个接口。

1)ServletContextAware:实现该接口的Action可以直接访问ServletContext实例。

2)ServletRequestAware:实现该接口的Action可以直接访问HttpServletRequest实例。

3)ServletResponseAware:实现该接口的Action可以直接访问HttpServletResponse实例。

以上主要讲了action访问servlet,下面让我们来看一下Struts2的Action是如何实现代码复用的。就拿UserAction来说,我如果让这个action既处理用户注册(regist)又处理登录(longin)该如何改写这个action呢?改写后的UserAction如下:

package example;

public class UserAction extends ActionSupport {

       private String username;

       private String password;

    public String regist() throws Exception {

              //…………..

        return SUCCESS;

    }

 public String login() throws Exception {

              //…………..

        return SUCCESS;

    }

    public String getUsername() {

        return username;

    }

    public void setUsername(String username) {

        this.username = username;

    }

    public String getPassword() {

        return password;

    }

    public void setPassword(String password) {

        this.password = password;

    }

}

是不是这么写就ok了,当然不行我们还必须在struts.xml文件中配置一下。配置方法有两种:

1)      使用普通的方式为Action元素指定method属性.

<action name=”loginAction” class=”example.UserAction” method=”login”>

       <result name=”success”>/success.jsp</result>

</action>

<action name=”registAction” class=”example.UserAction” method=”regist”>

       <result name=”success”>/success.jsp</result>

</action>

2)      采用通配符的方式为Action元素指定method属性。

<action name=”*Action” class=”example.UserAction” method=”{1}”>

       <result name=”success”>/success.jsp</result>

</action>

使用通配符的方式过于灵活,下面是一个较复杂的配置情况。

<action name=”*_*” class=”example.{1}Action” method=”{2}”>

……….

 </action>

其中占位符{1}与_的前一个*匹配,{2}与后一个*匹配。

 
百元DIY手机荧光计:低成本荧光检测平台搭建与实战 荧光检测是一种基于物质受特定波长光激发后发射更长波长荧光的分析技术,其核心原理在于光与物质的相互作用。通过选择性激发与检测,该技术能实现对痕量物质的高灵敏度、高特异性定量分析,在生物医学、环境监测和食品安全等领域具有重要价值。传统荧光分光光度计虽精度高,但成本昂贵、体积庞大且操作复杂,限制了其在现场快检和普及教育中的应用。本文聚焦于如何利用智能手机的高性能摄像头和处理器,结合低成本光学滤光片和LED光源,构建一个便携、经济的DIY荧光检测平台。该方案通过简化光路设计,采用带通滤光片进行波长选择,并利用图像处 阅读详情

相关推荐

人工势场法三大致命缺陷?我用ROS+Gazebo做了组对比实验

本文通过ROS与Gazebo仿真实验,深入剖析了人工势场法(APF)在机器人路径规划中的三大经典问题:局部最小值、目标不可达和路径震荡。文章不仅复现了这些缺陷,还对比测试了虚拟目标点法、改进斥力场及运动平滑等主流改进方案,为工程选型提供了基于数据的实用建议。

dapp9builder的博客 218

2、struts2_action详解

一action详解                           Struts 2.0 无须继承任何类型或实现任何接口。虽然,理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重载(Override)此类里的String

未名胡的博客 703

从一个过气考渣的角度看LLM智能化测试用例生成

根据业务需求生成测试用例,会涉及到相关上下文的召回、用例生成等场景。除了用例生成之外,也可以考虑应用LLM进行用例评审。因此,本文将涉及以下内容。

software_test010的博客 829

Struts2配置详解_配置Action

Struts2配置详解_配置Action 分类: ssh 2012-05-08 16:07 33408人阅读 评论(14) 收藏 举报 strutsactiondelete框架classurl Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2...

146

Python+gensim【中文LDA】简洁模型

文章目录完整代码过程详解words_lsdictionarydictionary.doc2bow函数corpuslda 完整代码 from gensim import corpora, models import jieba.posseg as jp # 待分析文本集 text1 = '美国教练坦言,没输给中国女排,是输给了郎平' text2 = '中国女排世界排名第一?真实水平如何,听听巴西和美...

ArYe 2万+

vins-mono前端详解(2)——imu预积分

本篇文章详细讲解了vins-mono中imu预积分内容,包括复杂的公式推导。

weixin_44587828的博客 1194

Struts2的Action(业务逻辑控制器)

相对与Struts1而言,struts2采用了低侵入式的设计,struts不要求Action类继承任何的Struts2基类,或者实现任何Struts2接口,在这种设计下,Struts2的Action类是一个普通的POJO,通常只需要包含一个无参的execute方法,从而有很好的代码复用性。 但为了让用户开发Action类更加规范,Struts2提供了一个Action接口,这个接口定义了Strut...

yangchou168的博客 729

【Unity大规模RTS/攻城战框架】Large Scale Combat System - RTS Sieges深度解析

本文介绍了Unity专业级大规模RTS战斗框架Large Scale Combat System(LSCS)。该系统通过Job System+Burst技术解决了万人级单位的性能问题,提供完整的RTS操作体系、动态阵型系统、战术AI和攻城战功能。其亮点包括可破坏城门、行走城墙、战术AI配置系统,支持URP渲染管线,适用于Total War风格的大规模兵团对战项目。LSCS不仅提供核心战斗系统,还包含UI、小地图等配套模块,是Unity中少有的专业级RTS解决方案,特别适合需要深度战术玩法和大规模战斗的开发者

2403_88403568的博客 1334

Struts2中的Action详解

1.Action的由来  struts2框架中有一种java类叫做Action,这种说法就像J2EE项目中有一种java类加Servlet.(人们的生活中有一种人的职业叫警察)struts2框架底层还是封装了Servlet的相关内容而实现出来的.只不过struts2框架除了servlet的功能以外还扩展出了很多其他的功能,同时还大大简化了以前在servlet中繁琐的操作.    在st

重心开始,重新开始 2万+

【fpdlink显示】DS90UB948关于941连接948 GPIO调试问题

1. 前言 使用一个941连接2 948显示: 941的GPIO0/1/2/3到前948的GPIO0/1/2/3和941的D_GPIO0/1/2/3到948的GPIO0/1/2/3。 设置gpio3输出,则941的D_GPIO3设置高,而948的gpio3设置不高; 但设置gpio3输入后,看到941的D_GPIO3跟随948的gpio3变化。 2. 原理图连接 3. 测试代码 static int du90ub941_enable_port(struct goodix_ts_d

jzwjzw19900922的博客 2555

用 SAP Fiori Launchpad Content Manager 做目录传输:把 Catalog 变更稳稳送到目标系统

摘要:SAP Fiori项目中,目录传输是确保应用一致交付的关键环节。开发团队常遇到目录在不同系统/客户端间不一致的问题,核心在于理解Launchpad内容管理的两种作用域:系统级(/UI2/FLPCM_CONF)使用workbench请求跨系统传输,客户端级(/UI2/FLPCM_CUST)通过customizing请求按SCC4设置传输。混淆作用域会导致目录分叉,如系统级目录被客户端本地修改后形成独立副本。官方推荐使用Content Manager而非过时的Launchpad Designer,并强调手

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 105

在Struts2中action占MVC中哪一个部分?

在Struts2中action占MVC中哪一个部分?是M?还是C? 我感觉Action在MVC模式中担任控制部分的角色,应该占C中,可是大多数资料,把action划到M中。为什么呢?

指尖弹奏绚丽生活 369

Open3D 点云重叠区域检测【2025最新版】

本文介绍了一种基于八叉树和KD树的点云重叠区域检测方法。算法提供两种检测模式:八叉树(快速)和KD树(精确),支持可视化显示和详细统计信息输出。实现功能包括边界扩展、索引去重、精度调节等,可通过max_depth参数控制八叉树细分程度,distance_threshold调整检测精度。代码使用Open3D库,能自动计算并显示各点云的重叠比例和点数统计,最终结果以不同颜色区分重叠与非重叠区域。该方案适用于三维点云数据处理中的重叠分析任务。

点云侠的博客 599

【struts2】struts2中的Action详解

在传统的MVC框架(如struts1、Spring等)中,Action都需要实现特定的接口,这些接口都是MVC框架定义的,实现MVC的接口会与MVC框架耦合。struts2的Action要灵活得多,可以实现struts2接口,也可以不实现。 一、ActionSupport类 自定义Action一般直接继承自ActionSupport类,并定义变量,覆盖execute()方法。变量的值会被str...

lmb55的专栏 3186

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Struts2之Action详解

在MVC中,要有一个控制器来负责浏览器与服务器的通信,实现服务器与用户的交互。Struts2控制器最重要的组成部分是Action。 Action接收来自视图层的请求,并接收请求参数,同时负责调用模型Model层方法来完成业务逻辑的处理,最后控制程序的流程,选择一个合适的视图,将结果显示给用户。 Struts2会为每一个Action创建一个线程,因此是线程安全的。 尽量不要将商业逻辑...

djai0102的博客 208

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

struts2_Action的基本使用

Actions是Struts2框架的核心,因为它们适用于任何MVC(Model View Controller)框架。 每个URL映射到特定的action,其提供处理来自用户的请求所需的处理逻辑。 Struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用get和set方法把request中的数据注入。 创建Action类 实现Action接口 // // Sourc...

Onion的博客 2615

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Struts2的Action详解

Struts2中的action,主要是完成业务逻辑操作。Action替代在servlet中完成的作用。Action的学习主要有两点:如何创建一个struts2的action如果访问一个struts2的action1.Action类创建方式(三种)创建一个pojo类Pojo(plani Ordinary java object)简单的java对象Pojo类就是没有实现任何接口没有继承任何类优点:无耦...

缺钙的蜗牛 383

Struts2基于注解的Action配置

使用注解来配置Action的最大好处就是可以实现零配置,但是事务都是有利有弊的,使用方便,维护起来就没那么方便了。 要使用注解方式,我们必须添加一个额外包:struts2-convention-plugin-2.x.x.jar。 虽说是零配置的,但struts.xml还是少不

Java高知社区 1万+

Struts2之Action跳转

[整理]在struts2.0中 action跳转 在struts2.0中 action跳转有两种方式,特别要指出的是仅在同一package范围内生效。不同Package的Action跳转使用param参数即可。 第一种通过action 转接 第二种为action链方式。 方法一: 1. 设置type="redirect"     action name   /ind

loganyang123的专栏 726

Struts2的核心配置之Struts2的常量配置与Action的配置

&nbsp;&nbsp;&nbsp;&nbsp;最近在学习SSH框架,之前Javaweb学的不扎实。所以做好笔记,方便以后的学习。 1. Struts2常量的配置 &nbsp;&nbsp;&nbsp;&nbsp;Struts2常量的配置通常采用3种方式,分别如下: 在struts.xml文件中使用&lt; constant &gt;元素配置常量(最常用的方式); name:该属性指定了常量的常...

YYxiaobao0726的博客 469

java struts action_Struts2 Action配置详解

Action 是用于处理请求操作的,它是由 StrutsPrepareAndExecuteFilter 分发过来的。这一节主要详细的介绍 action 的配置。实现Action控制类在 Struts2 框架中,Action 是框架的核心类,被称为业务逻辑控制器,主要用于实现对用户请求的处理。一个 Action 类代表一次请求或调用,每个请求的动作都对应一个相应的 Action 类。也就是说,用户的...

weixin_35513122的博客 413

Struts2的Action

Struts2的Action、 Action实现类、Action接口和ActionSupport工具类 Action访问ActionContext、Action直接访问ServletAPI、Action的配置 Action的动态方法调用、通配符配置

gzx2080205的专栏 1525

struts2之实现Action

介绍:Action类作为业务逻辑控制器,包含了对用户请求的处理逻辑, struts2通常直接使用Action封装Http请求参数,因此Action里还应该包含与请求参数对应的实例变量,并提供setter和getter方法,Action类=普通pojo+excute()方法,Action类是否包含是否包含实例变量并不重要,重要的是包含setter和getter方法,因为系统是通过这两个方法处理HTT...

weixin_43638314的博客 177

Struts2中的Action

多数的MVC框架中的Control层,都是一个Java对象。按照惯例,我们通常会把这个层次上面的Java对象统称为Action层。 Action的生命周期  接下来,我们再来看看Struts2中的Action的生命周期: 这张图来自于Struts2的Reference,我们能够在图中看到许多我们不熟悉的名词,比如ActionProxy,Interceptor等等。这些都是St

1200

struts2 action详解

转载自:http://blog.chinaunix.net/uid-7602921-id-2048554.html 有Struts 1.x经验的朋友都知道Action是Struts的核心内容,当然Struts 2.0也不例外。不过,Struts 1.x与Struts 2.0的Action模型很大的区别。   Struts 1.x 必须继承org.apache.struts.action.Acti

Martin_72530的博客 327
上一篇: Struts2中有关struts-default.xml,struts.xml,struts.properties文件详解
下一篇: Struts2中使用Common-FileUpload实现文件上传
flustar
博客等级 码龄20年 10粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值