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。文件储存在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的动作。假设找不到,就会在默认命名空间中查找这个动作。


posted @ 2017-08-04 10:27  yangykaifa  阅读(160)  评论(0编辑  收藏  举报