有时候我们需要在Action执行完毕后而Result还没执行时做一些功能,就需要PreResultListener,这是一个监听器。要实现这个监听器首先就要有一个实现PreResultListener的类,在这个类里面去实现事件的处理
写一个类实现PreResultListener
public class MyPreResult implements PreResultListener{
@Override
public void beforeResult(ActionInvocaiton actionInvocation, String result){
System.out.println("现在处理Result执行前的功能,result="+result);
}
}
这个类中有ActionInvocaiton对象,这个对象封装了Action运行所需要的数据,甚至可以通过它来执行Action
然后在Action的方法中注册这个监听器
public class firstAction extends ActionSupport {
@Override
public String execute() throws Exception {
//注册监听器
ActionContext context = ActionContext.getContext();
MyPreResult pr = new MyPreResult();
context.getActionInvocation().addPreResultListener(pr);
return SUCCESS;
}
}
当Action运行之后,监听器监听到相应的事件并执行相关的功能,之后才会执行Result
Struts2的异常映射
在struts2中有时遇到异常需要我们去处理,这里有两种处理异常的方式
1.自己去实现异常的处理
public class firstAction extends ActionSupport {
@Override
public String execute() throws Exception {
try{
int a = 5/0;
}catch(Exception e){
e.printStackTrace();
return "catchError";
}
return SUCCESS;
}
然后通过这个返回的字符串去执行对应的Result
2.使用struts的异常机制
在<action>元素中设置<exception-mapping>元素,可以指定在方法抛出指定异常时跳到那个指定的页面
public class firstAction extends ActionSupport {
@Override
public String execute() throws Exception {
int a = 5/0;
return SUCCESS;
}
}
需要在struts.xml中去配置一下
<action name="xxx" class="xxx" method="execute">
<exception-mapping result="math-exception" exception="java.lang.ArithmeticException">
<exception-mapping result="math-exception" exception="java.lang.Exception">
<result name="math-exception">/error.jsp</result>
<result>/welcome.jsp</result>
</action>
exception属性指定的是一个Exception的全类名,如果Action的方法抛出的错误是这个Exception的实例或是其子类的实例,就会跳转到对应的result属性指定的结果。
如果<action>配置了<exception-mapping>元素时,则会按顺序寻找,直到找到第一个符合的exception-mapping元素,如果没有找到,则会交给web容器处理
上面写的<exception-mapping>只对本<action>有效,可以将这个<exception-mapping>做成全局映射。如果要做成全局映射,这个<exception-mapping>应该放在<global-exception-mappings>中,这个是<package的子元素,配置了<global-exception-mappings>就需要配置<global-results>,因为配置了异常处理之后就自然要配置处理后要去的页面
<package name="xx" extends="struts-default" namespace="/">
<global-results>
<result name="math-exception">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="math-exception" exception="java.lang.ArithmeticException">
<exception-mapping result="math-exception" exception="java.lang.Exception">
</global-exception-mappings>
</package>
如果想在页面上显示错误信息,可以是使用struts2提供的标签
<s:property value="exception" /> 打印exception对象的例外消息
<s:property value="exceptionStack"> 打印exception对象的堆栈消息