B/S架构中一个简单的struts2回路,采用MyEclipse创建Web Project:
1 视图层提交请求(如:360浏览器界面):
点击“计算”按钮,向servlet提交了一个请求;
页面源码为Jsp,请求中包含了form表单中的信息
2 servlet过滤请求
在Web项目中web.xml中配置过滤器,如上图,这里只负责匹配.action, *的内容这里无需理会,但会传递给Action代理;
所有提交的add.action由工具类org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter过滤后转到Action代理(WebWork 核心 API);
3 Action代理
相关配置(Struts.xml)如下:
从过滤器传递来的信息中匹配到acttion的name="add";跳到action类com.action.CalAction
4 开发者自定义action类的执行过程
代码如下:
CalAction执行过程如下:
a)调用set方法将浏览器界面输入的值传递过来并一一赋值给CalAction中自定义的私有变量(一般建议自定义的变量名与视图层传递过来的参数名保持一致);
注意:set方法后面的属性名由Jsp中设置的input name所决定,两者必须一致;例如在Jsp中定义数字1的name="num0";则传递参数至action的方法名为setNum0();
b)在默认的execute()方法中对视图层传递过来的参数进行处理;
这里对传递过来的参数进行处理,若为数字类型则数字相加,若为字符串类型则合并字符串
c)execute()方法返回sucess,在struts.xml配置中按result的name属性匹配到<result>/index.jsp</result>(<result>等同于<result name="success">),
页面跳转到/index.jsp并通过getRes()方法获取JSP中${res}所请求的参数res;
注意:get方法后面的属性名与视图层没有直接关系,它只需要确保与CalAction定义的属性名一致即可;
Jsp中请求的参数实质是CalAction类定义的私有属性;
5 浏览器将更新的Jsp页面展示出来
小结:本次测试重点在于判断action从视图层中获取参数及传递参数到视图层的过程;
了解了其中的过程后才能相当灵活地处理这些参数;
例如,上面的例子我们若将execute方法中的逻辑写到getRes()方法中,execute方法中只负责return "success"去更新页面,我们会得到下面的结果。
以下为更新的方法源码:
我们可以看到第二次获取的参数与第一次并不一样,这是因为我们每次调用get方法传递参数的时候都会对参数值进行一次修改,
我们输入的res为12+a=;第一次调用get方法时res="12+a="+"12"+"a",也就是12+a=12a;
第二次获取同样的参数,再次调用get方法,res="12+a=12a"+"12"+"a",也就是12+a=12a12a;
所以一般情况下不建议在get方法中进行逻辑运算,这叫剑走偏锋;
但如果想循环调用或者做一些验证之类的话,这也不失为一个比较好的偏方吧。
以下为老师提供的struts2的原理图,留个纪念: