Struts2拦截器实验报告

priestmoon 2010-01-12 11:00:39
struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<package name="struts2" extends="struts-default">

<interceptors>
<interceptor name="myInterceptor3" class="com.test.interceptor.MyInterceptor3"></interceptor>
</interceptors>

<action name="register"
class="com.test.action.RegisterAction">
<result name="success">/success.jsp</result>
<result name="input">/register2.jsp</result>

<interceptor-ref name="myInterceptor3">
<param name="includeMethods">validate,execute</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>


RegisterAction2.java

package com.test.action;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction2 extends ActionSupport {

/* 一些Bean的属性和方法(略) */

public String execute() throws Exception {
System.out.println("execute~~~~");
return SUCCESS;
}

public void validate() {
System.out.println("validate~~~");
}
}


MyInterceptor3.java

package com.test.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

public class MyInterceptor3 extends MethodFilterInterceptor {

protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("MyInterceptor3");
System.out.println("My Interceptor3's method: "+invocation.getProxy().getMethod().toString());
String result=invocation.invoke();
return result;
}
}



实验明细:
(1)不加任何拦截器。程序在执行完validate()后,根据校验结果选择是否调用execute()。如果校验失败,则在jsp页面显示出错提示信息。实验成功。
(2)试图用MyInterceptor3拦截RegisterAction的validate()方法(通过设置includeMethods="validate"),无效。实验失败。
(3)由于Jsp页面用到了输入校验,照道理,如果validate()校验未通过的话,程序不可能执行execute()。这一点可以从未加拦截器之前的实验结果证实。然而,如果在MyInterceptor3中加入"includeMethods=execute"指定拦截execute(),则点击按钮提交表单校验失败后,会发现在执行validate()之前,拦截execute,但execute()函数却未执行。
(控制台日志:
MyInterceptor3
My Interceptor3's method: execute
2010-1-12 22:42:47 com.opensymphony.xwork2.validator.ActionValidatorManagerFactory <clinit>
信息: Detected AnnotationActionValidatorManager, initializing it...
validate~~~~)

如果输入校验通过,则发现execute被调用。


问题:
(1)为什么设置了对validate()的拦截却无效呢?
(2)拦截器在执行validate()方法之前对execute()进行拦截,为什么?
(3)拦截器对execute()进行了拦截,却没有执行execute()方法,这又是为什么?
...全文
314 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
SambaGao 2010-01-14
  • 打赏
  • 举报
回复
validate()的过程

1.
将请求参数转换为Bean的属性
2.
是否出现异常(Exception) 否
3.
通过反射调用validatexxx()方法
4.
调用validate()方法
5。
是否存在fieldError 否
6.
调用Action方法(如execute())
priestmoon 2010-01-13
  • 打赏
  • 举报
回复
up
zishanyan 2010-01-13
  • 打赏
  • 举报
回复
深夜发帖啊,顶一下,慢慢看
priestmoon 2010-01-12
  • 打赏
  • 举报
回复
自己先顶一下!
相信这个实验对于理解Struts2的拦截器很有帮助。
回帖者最好从程序流程和代码的角度剖析实验现象和结果。
集思广益,大家共同学习进步!
代码下载地址: https://pan.quark.cn/s/48b01f0717eb 本文将详细研究有关rtl8822蓝牙驱动及其适配的相关信息。rtl8822是由Realtek公司设计的一种无线通信芯片,主要应用于提供Wi-Fi和蓝牙功能。该芯片被广泛应用于多种现代电子设备中,例如笔记本电脑、路由器、智能手机以及平板电脑等。 我们首先需要理解“驱动”的定义。驱动程序充当计算机硬件与操作系统之间的中介,负责将硬件指令解释为操作系统能够识别的语言。对于rtl8822芯片而言,蓝牙驱动是控制该芯片执行蓝牙通信的核心软件模块,它确保设备能够准确识别并连接其他蓝牙设备。 rtl8822驱动资料通常包括以下几个部分: 1. **Bluetooth Baseband (BB) 驱动**:这一部分负责处理蓝牙的底层通信,包括射频信号的编码与解码,以及数据包的发送和接收。 2. **Bluetooth Host Controller Interface (HCI)**:HCI层是蓝牙驱动的重要组成部分,它确立了蓝牙主机(例如CPU)与控制器(例如rtl8822芯片)之间的接口协议。借助HCI,应用程序能够与蓝牙设备进行互动,如配对、建立连接、传输数据等。 3. **移植文档**:移植文档是将rtl8822蓝牙驱动适配至不同操作系统或平台的关键指南,其中通常包含了详尽的步骤、注意事项以及可能遇到的问题的解决方案。这些文档有助于开发者理解驱动的工作原理,并根据目标系统进行必要的调整。 4. **芯片手册**:Realtek为rtl8822芯片提供的手册是开发和调试驱动的重要参考资料,其中涵盖了芯片的硬件特性、寄存器布局、接口规范、功耗管理等内容。熟悉这些信息能够帮助开发者更深入地...

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧