Struts2动作

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。文件储存在服务器上的文件名。

对于多个文件,只要将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的动作,如果找不到,就会在默认命名空间中查找这个动作。

时间: 2024-11-01 17:35:43

Struts2动作的相关文章

struts2动作方法通配符

struts.xml: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>

struts整理

Value注入值,ref注入对象 Jsp实时编译的,freemarker是预编译的 EL表达式只能取session.application.request的值 将String[]转换为List<String> Arrays.<String>alist(数组对象) Struts中上传文件大小不得大于2mb Struts中xml有继承的概念 拦截器方法在action执行前或之后执行,动态代理的原理,ref引用对象 Struts中没有404错误,一般为struts的异常模板,除非转发页面

笔记之_java整理struts

weixinAPI微信对接 Struts标签库 Xml的地址:http://blog.csdn.net/xiazdong/article/details/7293177 Struts注入优先考虑modelDirven中找,其次才是setter方法 Value注入值,ref注入对象 Jsp实时编译的,freemarker是预编译的 EL表达式只能取session.application.request的值 将String[]转换为List<String> Arrays.<String>

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

因为回答百度知道的一个问题,仔细查看了<Struts2 In Action>,深入细致的看了 “数据转移OGNL 和 构建视图-标签”,很多东西才恍然大悟. 一直觉得国外写的书很浮,不具有操作性,但其实,Coding多了,才发现国外的书写的深刻.清晰.能传道解惑. 一.主要收获 1. Struts2 框架的数据流入和流出 使用 Struts2 标签时,所有非字符串属性都被当作 OGNL表达式进行解析. 使用  %{expression} 语法可以强制将字符串属性当作 OGNL表达式解析. 2.

深入分析JavaWeb 44 -- Struts2开发核心之动作类Action

一.Action动作类(一般用**Action结尾) struts2 的Action可以是POJO(Plain Old Java Object) 为了让用户开发的Action更加规范struts2提供了一个Action接口 通过method属性指定Action执行方法 没有指定method属性,默认执行execute方法 <action name="addCustomer" class="xgp.struts.actions.CustomerAction" /

Struts2 Action/动作

动作是Struts2框架的核心,因为他们的任何MVC(模型 - 视图 - 控制器)框架.每个URL将被映射到一个特定的动作,它提供了来自用户的请求提供服务所需的处理逻辑. 但动作也提供其他两个重要的能力.首先,操作从请求数据的传输中起着重要的作用,通过向视图,无论是一个JSP或其它类型的结果.二,动作必须协助的框架,在确定结果应该渲染视图,在响应该请求将被退回. 创建动作: 在Struts2的动作,唯一的要求是必须有一个无参数的方法返回String或结果的对象,必须是一个POJO.如果不带参数的

Struts2:Result结果类型

常用的结果类型 Struts中自带了一些结果类型.dispatcher表示将结果转交给JSP或者Servlet,redirect表示重定向到另外一个URL,redirectAction表示重定向到另外一个Struts动作.默认的都是dispatcher类型.dispatcher类型的返回结果中可以使用OGNL表达式,主要是为了便于实现显示动态的页面.redirect结果类型中也可以使用OGNL表达式.下面是定义dispatcher结果的一个例子: <action name="Test&qu

【struts2】预定义拦截器

1)预定义拦截器 Struts2有默认的拦截器配置,也就是说,虽然我们没有主动去配置任何关于拦截器的东西,但是Struts2会使用默认引用的拦截器.由于Struts2的默认拦截器声明和引用都在这个Struts-default.xml里面,因此我们需要到这个文件的struts-default包里去看一下.定义如下: 1 <interceptors> 2 <interceptor name="alias" class="com.opensymphony.xwor

Java Struts2 (三)

一.国际化概念(了解) 1.什么是国际化 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的.符合来访者阅读习惯的页面或数据. 2.什么需要国际化 程序:需要国际化. 数据:是什么样的就是什么样的. 比如: 用户注册的表单,有用户名,密码这5个汉字,在zh_CN语言环境,显示的就是用户名和密码.但是在en_US语言环境,显示的就应该是username和password.这就是程序. 用户名输入的是[张三],密码输入的是[test],那无论在