当前位置:首页 > Struts2入门教程(全新完整版)
结合配置说明:当我们为LoginAction配置了AnnotationWorkflowInterceptor拦截器时,LoginAction中的所有注解方法才真正生效。下面重点是来讨论这些方法的执行顺序及作用。
加@Before注解的方法:will be invoked before the action method. If the returned value is not null, it is returned as the action result code。意思是在action的execute方法执行之前被调用,但是此方法如果返回不为空的话,它的返回结果将是真正的返回结果,比如这里我们return LOGIN,这样无论以什么用户名登录,它总会返回到login result(这里为login.jsp页面) 。但是从执前结果来看,在返回前仍执行了标记为@BeforeResult的方法:will be invoked after the action method but before the result execution。意思是在返回结果集前调用此方法。下面我们把public String myBefore()方法中的return LOGIN注释掉,并让修改此方法的返回类型为void。随后登录测试(注意要重新部署当前项目),可以发现执行结果如下:
调用myBefore方法 ---调用set方法 调用execute方法
----调用myBeforeResult方法 ----调用myAfter方法
从执行的顺序来看,标记为@After的方法最后执行,并且可以发现:它会延时5秒执行,但是在延时执行时,浏览器并没有成功跳到success.jsp页面,而是在5秒后,控制台打印出myArter方法中的内容同步跳转到success.jsp页面。@After :will be invoked after the action method and result execution。意为在execute方法执行并且返回结果后此方法被调用。但是从测试来看,标记为@After的方法是会影响到结果的返回(延时返回)。 强调:注意方法的执行顺序,相关的内容可以参看AnnotationWorkflowInterceptor类的api文档。
8.使用PreResultListener实现回调 在进行本实例前请前复习:五.2自定义拦截器。因为PreResultListener对象一般是绑定在拦截器上使用。 下面我们新建struts2PreResultListener项目进行测试。
步骤一,建立类,实现PreResultListener接口,主要代码如下:
package com.asm;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.PreResultListener; public class MyPreResultListener implements PreResultListener { }
public void beforeResult(ActionInvocation invocation, String res) {
// System.out.println(invocation.getAction()); // System.out.println(invocation.getResultCode());
/**回调Action中的方法:
* LoginAction lg = (LoginAction) invocation.getAction(); try { * lg.execute(); } catch (Exception e) { e.printStackTrace(); } */
System.out.println(\检验到PreResultListener被执行\); }
步骤二,copy前面在自定义拦截器中用到的三个拦截器,并绑定MyPreResultListener对象,首先是在MyInterceptor类中,我们只需要修改intercept方法即可,代码如下:
public String intercept(ActionInvocation invocation) throws Exception {
invocation.addPreResultListener(new MyPreResultListener()); System.out.println(\开始拦截\);
41
}
String result = invocation.invoke(); System.out.println(\结束拦截\); return result;
随后在MyMethodFilterInterceptor类中作类似修改。为了区别,我们在MyAbstractInterceptor类中不绑定MyPreResultListener对象。
步骤三,编写struts.xml文件,主要配置内容如下:
class=\>
class=\>
步骤四,编写相应的jsp页面,发布测试。
说明:此实例的只是简要地演示了PreResultListener的使用,所以相对简单。对于其它相关操作,我们可以从MyPreResultListener类注释掉的内容中找到一此端倪。强调:从执行结果来看,
PreResultListener对象会在返回结果前执行,请注意结合拦截器执行的顺序来看。此实例目前作为了解。
六、使用标签
1.基础表单标签
准备工作:建立struts2tag项目,搭建好struts2的开发环境。在html我们常用的基础表单标签主要有文本域、密码域、提交、重置四种。它们在strust2中可以通过标签来生成。下面建立login.jsp页面,与这四种标签相关的内容如下:
<%@ page language=\pageEncoding=\%> <%@ taglib uri=\prefix=\%>
42
说明:label中的内容是显示在表单前的提示内容,required设为true,表示此表单项为必填内容。 2.单选按钮和复选框:
3.三种方式实现下拉列表
说明:三种方式实现下拉列表分别对应了三个java类,这三个类的内容为: NativePlaceFormAction主要代码为:
package com.asm;
public class NativePlaceFormAction extends ActionSupport {
private List
place=new ArrayList
place.add(\云南省\); }
...省略place的get/set方法 }
NativePlaceMapFormAction主要代码为: package com.asm;
public class NativePlaceMapFormAction extends ActionSupport {
private Map
place = new HashMap
43
}
...省略place的get/set方法 }
NativePlaceProFormAction主要代码为: package com.asm;
public class NativePlaceProFormAction extends ActionSupport { private List
public NativePlaceProFormAction(){
place=new ArrayList
place.add(new Province(1,\山东省\,\济南\)); place.add(new Province(2,\山西省\,\太原\)); place.add(new Province(3,\河南省\,\郑洲\)); place.add(new Province(4,\河北\,\石家庄\)); place.add(new Province(5,\四川\,\成都\));
place.add(new Province(6,\云南\,\昆明\)); }
...省略place的get/set方法 }
说明:此三种实现效果一样,但是在它们提交时传递给服务器的参数不同,具体可以参看login.jsp页面的源码。另外,这三种实现其实都依赖了
随后,我们在login.jsp中增加如下内容:
其中login2.jsp中的关键内容为:
我们可以发现:在login2.jsp中填写list的值时并没有用ognl表达式,因为我们通过npf.action来访问时,此Action已经被写入到了值栈中,所以我们可以直接引用。 后面所用到的实例,我们都会把这样的类做成Action,这样如果我们想通过这种方式访问便只需要在struts.xml中配置即可 4.二级联动
list=\ name=\ doubleList=\ doubleListKey=\doubleListValue=\ doubleName=\ listKey=\listValue=\ label=\籍贯4(二级联动)\>
它所依赖的TwoSelectAction类的主要代码如下:
package com.asm;
44
共分享92篇相关文档