Struts2入门教程(全新完整版) 联系客服

发布时间 : 星期六 文章Struts2入门教程(全新完整版)更新完毕开始阅读1fd042cc376baf1ffd4fad14

结合配置说明:当我们为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文件,主要配置内容如下:

/success.jsp

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; public NativePlaceFormAction(){

place=new ArrayList(); place.add(\山东省\); place.add(\山西省\); place.add(\河南省\); place.add(\河北省\); place.add(\四川省\);

place.add(\云南省\); }

...省略place的get/set方法 }

NativePlaceMapFormAction主要代码为: package com.asm;

public class NativePlaceMapFormAction extends ActionSupport {

private Map place; public NativePlaceMapFormAction() {

place = new HashMap(); place.put(1, \山东省\); place.put(2, \山西省\); place.put(3, \河南省\); place.put(4, \河北省\); place.put(5, \四川省\); place.put(6, \云南省\);

43

}

...省略place的get/set方法 }

NativePlaceProFormAction主要代码为: package com.asm;

public class NativePlaceProFormAction extends ActionSupport { private List place;

public NativePlaceProFormAction(){

place=new ArrayList(); new Province(1,\山东省\,\济南\);

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页面的源码。另外,这三种实现其实都依赖了设定的对象,如果我们不希望依赖来设定,可以通过配置action来实现:下面我们以NativePlaceFormAction说明:首先在struts.xml中配置此action,配置内容如下:

/login2.jsp

随后,我们在login.jsp中增加如下内容:

/my/npf.action\>另一个注册页面

其中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