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}与后一个*匹配。

 
VMware 安装 Windows11 一、下载win11的镜像文件 可以在MSDN网站下载: MSDN系统库-致力于原版windows生态服务 二、创建虚拟机 1.双击打开VMware虚拟机,点击创建新的虚拟机 2.选择典型(推荐),然后点击下一步 3.在安装程序光盘映像文件下,点击浏览按钮,选择Windows 11ISO镜像文件所在的路径,在Windows 11安装文件路径中不要有中文或其他特殊符号,否则有可能引起错误。然后点击下一步 4.在选择客户机操作系统界... 阅读详情

相关推荐

PMAC上位机通信原理(C#)

基础是引用 两个 ODT dll 原理是先注册到communication.AsyncDataAvailable事件中去 if (bSuccess1) { communication.AsyncDataAvailable += communication_AsyncDataAvailable; } bool bSuccess2 = communication1.GPAsciiConnect(strIP, iPort, strName, strPassword); i

weixin_45507349的博客 1087

2、struts2_action详解

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

未名胡的博客 703

架构决策之消息中间件MQ系列六-Pulsar

一、架构

恰恰虎的博客 7253

Struts2配置详解_配置Action

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

146

Gephi新手必看:如何用Excel整理CSV数据快速生成网络图(附模板)

本文为Gephi新手提供了一份从Excel数据整理到生成专业网络图的完整指南。详细讲解了如何构建规范的节点表和边表CSV文件,并导入Gephi进行可视化分析。通过实战案例,帮助读者快速掌握利用Excel整理数据、规避常见错误,并运用布局算法与视觉编码,将复杂关系数据转化为直观的网络洞察。

weixin_28487433的博客 389

实战:如何用MIPI CSI-2高效传输RAW10图像数据(附带宽优化技巧)

本文深入探讨了MIPI CSI-2协议在RAW10图像数据传输中的高效应用,详细解析了4像素5字节打包机制及其带宽优化技巧。通过动态Lane分配、位深度自适应压缩和虚拟通道交错传输等实战方法,显著提升传输效率,适用于IoT摄像头开发等低功耗场景。

css33的专栏 732

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

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

yangchou168的博客 729

Linux中断子系统(二)—— 通用框架处理

1、数据结构分析 (1)中断描述符结构structirq_desc: 1)打开CONFIG_SPARSE_IRQ宏(中断编号不连续),中断描述符以radix- tree来组织,用户在初始化时进行动态分配,然后再插入radix-tree中; 2)关闭CONFIG_SPARSE_IRQ宏(中断编号连续),中断描述符以数组的 形式组织,并且已经分配好; 3)不管哪种形式,最终都可以通过linuxirq号来找到对应的中断描述符; (2)stru...

weixin_38428439的博客 4871

Struts2中的Action详解

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

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

Langfuse实战:从评估打分到问题解决的完整指南

本文详细介绍了如何利用开源LLM工程平台Langfuse对AI应用进行系统性评估与优化。从创建评估数据集、设计自动化评分函数,到深入排查常见问题并关联Trace进行精准打分,提供了完整的实战指南。最后,探讨了如何利用评估结果驱动提示词迭代与A/B测试,并给出了生产环境部署与性能优化的关键考量,帮助开发者构建可测量、可分析、可改进的LLM应用。

backprop5master的博客 651

超分辨率重建:ESPCN与SRGAN技术对比

超分辨率重建:ESPCN与SRGAN技术对比​ 人工智能,计算机视觉,大模型,AI,超分辨率重建是一种通过技术手段,将低分辨率图像转换为高分辨率图像的过程。它的目的是恢复低分辨率图像中丢失的细节信息,使图像具有更高的清晰度和视觉质量。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 7万+

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

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

指尖弹奏绚丽生活 369

ThingsBoard教程(十九):规则节点概览介绍

在ThingsBoard的CE V2.5.6版本中,一共有这几种类型在每一种类都有包含了多个节点,每一种类型的节点都有不同的颜色表示本篇文章做一个简单的概括,后续的文章会详细讲解每一个种类的节点如何使用,每一个节点的使用。一共有10个,使用黄色表示 过滤器节点用于消息过滤和路由。一共有9个,使用绿色 属性节点用于更新传入消息的元数据。一共三个,使用蓝色 转换节点用于更改传入消息字段,如发起者、消息类型、有效负载和元数据。一共21个,使用红色标识 动作节点根据传入的消息执行各种动作。一共9个,使用黄色表示,

知无涯 1万+

【struts2】struts2中的Action详解

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

lmb55的专栏 3186

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Struts2之Action详解

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

djai0102的博客 208

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

struts2_Action的基本使用

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

Onion的博客 2615

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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、付费专栏及课程。

余额充值