这里主要以案例演示:涵盖以下知识点
1、动态方法调用:使用关键 符号 ! 进行操作 例如:/命名空间 ! 方法名
2、动态结果集:就是说,通过后台返回的结果 ${} 获取,重定向到符合预期的页面。

3、万能通配符:*_* :第一个 * 为 类名、第二个 * 为方法名;{1}是第一个 *
4、内部方法的调用:就是说 Action 类中的 A() 调用 B() A方法返回B()的结果集
5、跳转Action:就是说访问一个方法,根据返回的结果匹配 result中的 name 值 跳入下一个action (result type=chain)

6、OGNL:(不过多讲述相关概念,这里以代码为核心)
值栈的内部结构分为两部分:
第一部分:root,结构是 list 集合一般操作的都是 root 里面的数据
第二部分:context,结构为 Map 集合
使用经历:
root 单列集合下的 前台获取的时候不需要写 #
context 双列集合 前台获取的时候需要写 #
1、往 单列集合中推送 集合类型的数据时,不能触碰到集合的引用名称。
将泛型集合推送到值栈中:

使用 <s:debug/> 标签查看 值栈的信息:

2、值栈的访问顺序为 从上往下 寻址。如有同名的属性名,则寻址离值栈顶端最近的。

核心代码截取:推送到root 也就是单列集合下

使用 <s:debug/> 标签查看 值栈的信息:

3、在我们实现 Action 接口 或 继承ActionSupport 的类中的成员属性都是放在 root 单列集合下的


4、往值栈 context 推送 key那一列会有我们指定的引用名称(需要获取的时候需要 #)


以上为可能会遇到的问题。
完整Demo展示:
