您的位置:首页 > 编程语言 > Java开发

Struts2拦截器简单示例

2010-11-23 08:58 218 查看
拦截器(Interceptor
)是Struts 2
的核心组成部分。很多功能(Feature
)都是构建在拦截器基础之上的,例如文件的上传和下载、国际化、转换器和数据校验等,Struts 2
利用内建的拦截器,完成了框架内的大部分操作。

在Struts 2
文档中对拦截器的解释为——拦截器是动态拦截Action
调用的对象。它提供了一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在Action
执行之前或者之后运行,也可以在一个Action
执行之前阻止Action

执行。同时也提供了一种可以提取Action
中可重用的部分的方式

拦截器在Struts2中的示意图:



从上图可以看出,Struts 2

架构的
Action

被一个或者多个拦截器(拦截器栈)所包围,所有的用户请求都会被拦截器所拦截,然后交给
Action

处理,处理结果以逻辑视图方式返回给用户。而这个调用执行流程,是由
Struts 2

的配置文件来实现的,后面会详细介绍。拦截器是
Struts 2

核心部分之一。

当用户请求到达
Struts 2


ServletDispatcher

时,
Struts 2

会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表(
List

),最后一个一个地调用列表中的拦截器

拦截器时序图如下图所示:




Struts 2

架构中,
Action

的调用都是通过拦截器来实现的。有的读者可能会疑惑,为什么没有明确说明拦截器,为什么可以直接调用
Action

?那是因为
Struts 2

架构如果不做显式的拦截器配置,则系统会调用默认的拦截器来调用
Action


,在用户看来,好像没有配置拦截器



Hello World拦截器示例.

程序要演示的是显示地让拦截器调用Action,来体会拦截器的用途。

一般情况下我们都会先写出一个Action,然后配置struts.xml文件

MyAction.java

public

class

MyAction
extends

ActionSupport {

//以下属性信息都是从前台(JSP页面获得)

private

String username;



private

String mymsg;



private

String password1;



private

String password2;



private

Date birthday;

public

String execute(){

if
(username!=null
&&this
.getPassword1().equals(this
.getPassword2())&&!this
.getUsername().trim().equals("")){



//输出调试信息

System.out.println("Action信息,正在执行Action.... "
);

return

SUCCESS;

}else
{

return

INPUT;

}

}





public

String getUsername() {

return

username;

}

public

void

setUsername(String username) {

this
.username = username;

}

public

String getMymsg() {

return

mymsg;

}

public

void

setMymsg(String mymsg) {

this
.mymsg = mymsg;

}

public

String getPassword1() {

return

password1;

}

public

void

setPassword1(String password1) {

this
.password1 = password1;

}

public

String getPassword2() {

return

password2;

}

public

void

setPassword2(String password2) {

this
.password2 = password2;

}

public

Date getBirthday() {

return

birthday;

}

public

void

setBirthday(Date birthday) {

this
.birthday = birthday;

}



}


自定义拦截器MyInterceptor.java

public

class

MyInterceptor
extends

AbstractInterceptor {

//拦截方法

public

String intercept(ActionInvocation invocation)
throws

Exception {

MyAction myA=(MyAction) invocation.getAction();

System.out.println("拦截器信息:hello world 拦截器"
);

//执行action或者下一个拦截器

String result=invocation.invoke();

System.out.println("拦截器信息:Action执行完毕"
);

return

result;

}

}

下面我们开始配置struts.xml文件

首先我定义了一个my.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
="mynew"

namespace
="/"

extends
="struts-default"
>




<
interceptors
>


<
interceptor

name
="myInterceptor"

class
="com.MyInterceptor"
>


</
interceptor
>


</
interceptors
>




<
action

name
="myAction"

class
="com.MyAction"
>


<
result

name
="success"
>
/success.jsp</
result
>


<
result

name
="input"
>
/index.jsp</
result
>


<!--
引用默认拦截器

-->

<
interceptor-ref

name
="defaultStack"
>
</
interceptor-ref
>


<!--
引用自定义拦截器

-->

<
interceptor-ref

name
="myInterceptor"
>
</
interceptor-ref
>


</
action
>


</
package
>


</
struts
>



这样的话就要在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
>


<
constant

name
="struts.devMode"

value
="true"

/>


<
include

file
="my.xml"
>
</
include
>


</
struts
>


如果读者不习惯的话完全可以写在struts.xml文件中

index.jsp

<
%@

page
language
="java"

import
="java.util.*"

pageEncoding
="UTF-8"
%>


<
%@

taglib
prefix
="s"

uri
="/struts-tags"

%>


<
html
>


<
head
>


</
head
>





<
body
>


<
s:form

method
="post"

action
="myAction"
>


<
s:textfield

name
="username"

label
="用户名"
>
</
s:textfield
>



<
s:password

name
="password1"

label
="密码"
>
</
s:password
>



<
s:password

name
="password2"

label
="确认密码"
>
</
s:password
>



<
s:submit

value
="注册"
>
</
s:submit
>



</
s:form
>



</
body
>



</
html
>



success.jsp

<%@ page language="java"

contentType="text/html; charset=UTF-8"


pageEncoding="UTF-8"
%>

<%@ taglib prefix="s"

uri="/struts-tags"

%>

<!DOCTYPE html PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type"

content="text/html; charset=UTF-8"
>

<title>Insert title here</title>

</head>

<body>

<h3>注册成功</h3>

用户名:<s:property value="username"
/><p>

密码: <s:property value="password1"
/>

</body>

</html>

后台输出结果:

拦截器信息:hello world 拦截器

Action信息,正在执行Action....

2010-11-1 20:39:11 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn

警告: Could not find property [org.apache.catalina.jsp_file]

拦截器信息:Action执行完毕
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: