首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Struts2中阻截结果的监听器

2012-10-10 
Struts2中拦截结果的监听器???? 为了精确定义在execute方法执行结束后,再处理Result执行的动作,Struts2提

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>密&nbsp;&nbsp;码:</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方法...这会陷入死循环。

热点排行