Action在Struts框架中有着举足轻重的分量,Action本身只是定义了简单的String类型变量,并且是final类型的,我们一般使用他的高级接口ActionSupport,具体原因去其他博客获取更多信息。
客户端在发送请求的时候并不只是通过表单的方式发送数据(比如超链接),页面中的表单form其实只是客户端定义的一种动作,最终还是将提交的数据以Get中的URL重写方式发送出去,或者以POST方式,如果以post方式好像只有通过表单的方式,其他没见过,但不代表没有;我这里想表达的是表单本身是一种定义发送数据的动作,本质上与服务器没有关联,他只是一种描述,最终的数据还是要体现在URL或者POST方式或者其他方式中(说的不是很清楚,就是想说:理解知识最后要将知识本身脱离他原本的形态,然后形成一种思维,而不是简单的记忆;比如form之所以为form是因为设计者给他起了那么一个名字为form,设计者在设计的时候完全可以将它设计为dudu,haha或者其他,设计的思维逻辑才是精华)。还要注意的一点是,客户端发送的数据一般都是以键值对的方式发送的。
请求到达服务器的时候首先要经过过滤器,拦截器等处理以后才会到达action,action最后也是被框架中的逻辑以反射的方式来调用的,为什么我们要重写execute方法,而不是自定义一个方法,因为框架反射的逻辑调用的就是execute这个方法,假如action中有多个方法被框架中的反射逻辑调用,那么此时很显然就有了这些方法的调用顺序,事实上确实存在这个方法validate,这个方法就是在execute调用之前先调用的,如果有兴趣我们可以修改框架的源码,让他先调用execute方法,或者添加其他自定义的方法,因此不要把框架或者其他技术看的太高大上,只要把基础学好就会逐渐理解里边的本质。
表单请求(或者是URL重写)发送的数据值会被框架赋值到action中相应的属性(setName,这里注意action中的属性名称要与发送的数据的键值对中的键相对应),但是要明白一点:在view(<s:Property/>)中调用action中的属性值得时候与请求没有任何关系,它仅仅是通过getName方法获取getName这个方法返回的值,我们完全可以不定义name对应的属性,而是直接在getName方法中返回自己想返回的值,并且可以在这个方法中随意修改从客户端传进来并被框架赋值到对应属性的值,这些处理流程之间并没有绝对的联系,仅仅是Java基本语法的组合,然后形成的高大上的业务逻辑。