"这是一份赵栋关于Struts2框架的笔记,主要涵盖了2013年的学习内容,包括Struts2中Action方法调用、通配符的使用以及值栈的操作方法。"
Struts2是Java Web开发中常用的一个MVC框架,它简化了模型与视图的交互。这篇笔记详细介绍了如何在Struts2中调用Action方法。通过在URL中添加"!"后跟方法名,可以不依赖`method`属性来指定Action执行的具体方法。例如,`example.action!doSomething` 将直接调用名为`doSomething`的方法。
通配符在Struts2中也是一项重要特性,使用`*`可以匹配任意方法名。例如,配置`<action name="example_*" class="com.example.ExampleAction">`,则`example_find`、`example_save`等URL都将映射到同一个Action,并根据URL中指定的方法名自动调用相应的Action方法。
笔记中还详细讲解了Struts2的值栈(ValueStack)机制。值栈的生命周期与一次HTTP请求相对应,每次请求时,值栈中的内容都会发生变化。获取值栈有三种方式:
1. 使用`ActionContext.getContext().getValueStack();`
2. 通过`ServletActionContext.getValueStack(ServletActionContext.getRequest());`
3. 直接从HttpServletRequest中获取,`ServletActionContext.getRequest().getAttribute("struts.valueStack");`
值栈底层的实现类是OgnlContext,它扩展了标准的Java `Map`接口,使得在值栈中可以方便地存储和访问对象。值栈内的数据组织形式如同一张内存结构图,包含了请求、session、application等多个作用域,每个作用域都相当于一个Map,存放不同范围内的数据。
在值栈中存取数据时,可以通过Ognl表达式访问Action的属性。如果属性名称相同,Ognl会从栈顶开始查找,找到第一个匹配的属性值。使用`#`前缀可以明确表示引用的是Map集合,有助于区分对象栈和Map中的数据。例如,`#action.property`引用Action的属性,而`map.property`则是引用Map中的键值对。
这篇笔记详细解析了Struts2框架中Action方法的调用方式、通配符的使用以及值栈的生命周期和操作方法,对于理解和使用Struts2进行Web开发具有很高的参考价值。