Struts2中拦截结果的监听器
???? 为了精确定义在execute方法执行结束后,再处理Result执行的动作,Struts2提供了用于拦截结果的监听器,这个监听器是通过手动注册在拦截器内部的。
?
下面以登录为例介绍拦截结果的监听器:
?
1、登录页面login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>登录页面</title> <script type="text/javascript"> function register(){ //获取jsp页面中的一个表单元素 targetForm = document.form1; //动态修改目标表单的ation属性 targetForm.action = "login!register.action"; //提交表单 targetForm.submit(); } </script> </head> <body> <form name="form1" action="login.action" method="post"> <table align="center"> <caption>用户登录</caption> <tr> <td>用户名:</td> <td><input type="userName" name="userName"/></td> </tr> <tr> <td>密 码:</td> <td><input type="password" name="password"/></td> </tr> <tr align="center"> <td colspan="2"> <input type="submit" value="登录"/> <input type="button" onClick="javascript:register();" value="注册"/> </td> </tr> </table> </form> </body></html>
?
?
2、编写UserBean和LoginAction
UserBean.java:
package com.lee.action;/** * @author lijunjie */import java.text.SimpleDateFormat;import java.util.Date;public class UserBean {private String userName;private String password;private String tip;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getTip() {return tip;}public void setTip(String tip) {this.tip = tip;}}
?
LoginAction.java:
package com.lee.action;/** * @author lijunjie */import java.sql.SQLException;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;public class LoginAction extends ActionSupport implements ModelDriven<UserBean> {private UserBean model = new UserBean();@Overridepublic String execute() throws Exception {System.out.println("开始执行execute()");if("sortec".equals(model.getUserName()) && "sortec".equals(model.getPassword())){this.getModel().setTip("服务器提示:登录成功...嘎嘎");return SUCCESS;}else{return ERROR;}}public void hello(){System.out.println("hello...");}public UserBean getModel() {return model;}}
?
?
3、实现拦截器结果的监听器必须实现PreResultListener接口
编写监听器MyPreResultListener.java:
package com.lee.action;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.PreResultListener;public class MyPreResultListener implements PreResultListener {//定义在处理Result之前的行为public void beforeResult(ActionInvocation invocation, String resultCode) {//打印出执行结果System.out.println("返回的逻辑视图为:"+resultCode);}}
?
?
4、将监听器手工注册给拦截器
SimpleInterceptor.java:
package com.lee.action;/** * @author lijunjie */import java.util.Date;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class SimpleInterceptor extends AbstractInterceptor {//简单拦截器的名字private String name;//为简单拦截器设置名字的setter方法public void setName(String name) {this.name = name;}//拦截Action方法的intercept方法@Overridepublic String intercept(ActionInvocation invocation) throws Exception {//将一个拦截器结果的监听器注册给该拦截器invocation.addPreResultListener(new MyPreResultListener());System.out.println("execute()方法执行之前的拦截...");//调用下一个拦截器,或者Action的执行方法String result = invocation.invoke();System.out.println("execute()方法执行后的拦截...");return result;}}
?
?
5、配置拦截器和Action
struts.xml:
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"><struts> <include file="struts-default.xml"/> <package name="lee" extends="struts-default"> <interceptors> <!-- 配置方法过滤的拦截器 --> <interceptor name="mySimpleInterceptor" name="code">execute()方法执行之前的拦截...开始执行execute()返回的逻辑视图为:successexecute()方法执行后的拦截...
?
从以上信息可以看出,定义在MyPreResultListener 类中的beforeResult方法,定义在拦截器的intercept(ActionInvocation invocation)方法中在Result之前执行的动作,执行更早。
?
注:虽然beforeResult方法中也可以获得ActionInvocation实例,但千万不可通过该实例调用invoke()方法,如果再次调用invoke()方法,将会再次执行Action处理,Action处理之后紧跟的是beforeResult方法...这会陷入死循环。