ActionContext

每一个请求的处理都在一个独立的线程中。每一个线程都有一个ActionContext对象。它包括了ValueStack和HttpServletRequest的东西。

Struts把全部的变量统一放在一个方便的地方。而不是将数据传来传去,这个东西就是ValueStack。它贯穿于整个处理流程,所以拦截器和视图层都能够操作ValueStack中的内容。一般通过OGNL间接操作,而不是直接操作。每一个请求都会创建一个新的Action,因此不会有多线程冲突的问题。

动作

动作的作用就是封装业务逻辑、传输数据、决定响应视图。

动作能够看成是一个JavaBean。框架会将请求中的參数依照JavaBean规范填入到Action。之后在视图层能够读取Action中的数据。这就是传输数据的过程。为了简化问题,能够在Action中添加一个JavaBean类型的属性,这样视图层就能够将数据直接填到一个对象中,而不是填到动作中。另外能够让动作实现ModelDriven接口。这个接口的作用就是将全部的參数都定向到getModel这种方法中。

getModel须要返回一个JavaBean。

public class TestAction {
private Student student; // 返回一个JavaBean对象,这样就能够让參数填入对象
public Student getStudent() {
return student;
}
}

文件的上传。文件的上传是通过FileUploadInterceptor实现的。文件字段能够看成三个请求參数。假设表单中的字段名为XXX。那么Action会接收到三个參数:

  • XXX。

    File类型的数据,表示被上传的文件。

  • XXXContentType。文件的内容类型。
  • XXXFileName。文件储存在server上的文件名称。

对于多个文件,仅仅要将File改成File数组、String改成String数组就可以。在一次请求结束之后,文件会被拦截器删除。

框架对动作的父类没有不论什么要求,仅仅要实现execute方法就可以。

可是这样不能直接使用框架自带的便捷方法。因此能够引入ActionSupport基类。它的作用有数据验证、错误消息本地化等。

数据验证。DefaultWorkflowInterceptor会调用Action中的validate方法。开发人员能够复写这种方法来检查数据是否正确。假设发现错误。能够调用addFieldError(field,message)这种方法加入错误。框架检測到错误之后会跳转到input页面让用户又一次输入表单。ActionSupport还支持消息的本地化。首先要定义ActionName.properties,然后通过getText方法就能够获取。

以下介绍包的概念。

首先打个例如。将Struts中的动作比作Java中的类。

我们知道Java类一般都会放在一个包中。

Struts也会将动作放在包中。包的定义在struts.xml文件里,以下是一个包的演示样例:

<package name="helloWorld" namespace="/my/path/helloWorld" extends="struts-default">
<action name="Hello">
<result>/my/hello.jsp</result>
</action>
<action name="World">
<result>/my/world.jsp</result>
</action>
</package>

默认namespace和根namespace的差别。

默认namespace在定义的时候事实上是一个空的字符串(不指定namespace就可以)。而根空间在定义的时候是“/”。举个样例,有一个请求http://localhost/hello/world/nice.action,框架首先会在/hello/world这个空间中找一个名为nice的动作。假设找不到,就会在默认命名空间中查找这个动作。

Struts2动作的更多相关文章

  1. 如何删除Struts2动作的后缀扩展名

    在Struts2中,所有动作类有一个默认的后缀 .action 扩展. 例如, <struts> <package name="default" namespac ...

  2. Struts2学习笔记--Struts例子及开发流程

    参考资料:http://blog.csdn.net/hntyzgn2010/article/details/5547753 http://chenlh.iteye.com/blog/464341 入门 ...

  3. Struts2 Action/动作

    动作是Struts2框架的核心,因为他们的任何MVC(模型 - 视图 - 控制器)框架.每个URL将被映射到一个特定的动作,它提供了来自用户的请求提供服务所需的处理逻辑. 但动作也提供其他两个重要的能 ...

  4. Struts2 In Action笔记_页面到动作的数据流入和流出

    因为回答百度知道的一个问题,仔细查看了<Struts2 In Action>,深入细致的看了 “数据转移OGNL 和 构建视图-标签”,很多东西才恍然大悟. 一直觉得国外写的书很浮,不具有 ...

  5. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  6. Struts2框架基础

    Struts2框架基础 1.Java的框架 1.1.框架简介 在大型项目开发过程中,经常会使用到一些框架,这样做好的好处是能够提高工作效率,在java中最常用的的框架就是SSH,这其实是三个框架的简称 ...

  7. Struts2拦截器的执行过程浅析

    在学习Struts2的过程中对拦截器和动作类的执行过程一度陷入误区,特别读了一下Struts2的源码,将自己的收获分享给正在困惑的童鞋... 开始先上图: 从Struts2的图可以看出当浏览器发出请求 ...

  8. Struts2入门(二)——配置拦截器

    一.前言 之前便了解过,Struts 2的核心控制器是一个Filter过滤器,负责拦截所有的用户请求,当用户请求发送过来时,会去检测struts.xml是否存在这个action,如果存在,服务器便会自 ...

  9. SSH面试题(struts2+Spring+hibernate)

    struts2 + Spring +hibernate Hibernate工作原理及为什么要用?   原理:   1.读取并解析配置文件   2.读取并解析映射信息,创建SessionFactory ...

随机推荐

  1. appium+python自动化44-appium命令行模式

    前言 appium desktop有个客户端版本,每次运行脚本的时候都要去双击启动才能运行,很显然不太方便,影响效率.那么有没什么办法不启动桌面程序就能运行呢,比如cmd命令行执行? 环境: appi ...

  2. 修改centos7/osx的MAC地址

    change MAC Address in CentOS 7: nano /etc/sysconfig/network-scripts/ifcfg-ens160 systemctl restart n ...

  3. Boost::Lexical_cast 的使用

    .C++代码 #include <boost/lexical_cast.hpp> #include <iostream> int main() { using boost::l ...

  4. ylbtech-LanguageSamples-PythonSample

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-PythonSample 1.A,示例(Sample) 返回顶部 本示例演示如何使用 C ...

  5. 理解Vue的计算属性

    计算属性是一个很邪门的东西,只要在它的函数里引用了 data 中的某个属性,当这个属性发生变化时,函数仿佛可以嗅探到这个变化,并自动重新执行. 上述代码会源源不断的打印出 b 的值.如果希望 a 依赖 ...

  6. [Functional Programming Monad] Modify The State Of A State Monad

    Using put to update our state for a given state transaction can make it difficult to modify a given ...

  7. redis学习笔记——命令执行流程

    基础知识部分 如果需要掌握Redis的整个命令的执行过程,那么必须掌握一些基本的概念!否则根本看不懂,下面我就一些在我看来必备的基础知识进行总结,希望能为后面命令的整个执行过程做铺垫. 事件 Redi ...

  8. git使用 ——转

    转自:http://blog.csdn.net/jamesmf/article/details/17483787

  9. 屏幕录像大师如何把LXE文件转换为EXE文件

    EXE 和 LXE 实际上是同一种格式,文件大小完全相同,可以快速相互转换.区别是EXE复制到其它电脑上可以直接播放,LXE需要播放器播放,我们提供LXE播放器,而且是完全免费的.EXE的好处是复制到 ...

  10. toFixed 不能四舍五入问题

    最近在项目中遇见一个bug,数据在移动端与pc端不一致,金额少了0.01,原因是js在处理0.005的时候直接舍去了千分位,直接上解决方法 Number.prototype.toFixed = fun ...