暑期ssh框架之struts2学习笔记三

 拦截器是struts2的精髓所在,他能够较好地实现面向切向编程,举一个非常实际的例子,当我们在登陆自己的csdn帐号的时候,会输入自己的账号和密码,当账号和密码都输入成功时,会返回登陆成功页面,只要有其中一个输入错误,就会返回输入失败页面,如果这里不论输入成功或者失败,都会进行一次检查,这个检查的过程就是一个切面,下面将以书上的例子来讲解如何使用拦截器实现面向切向编程。整个工程的项目结构如下所示(本工程参照传智博客《SSH框架整合实战教程》第三章46-52页的实例),或点击查看源代码

 

整个工程模拟的是用户访问某图书馆数据库的操作。

在web-content目录下有一个*.jsp文件,代表一个文件蔟,里面是各种各样的逻辑视图,也就是呈现在用户眼前的页面,文件簇中有一个主页页面,其中有一个main.jsp页面,有如下语句:

<body>
    <a href="/chapter03/book_del">book_del</a><br>
    <a href="/chapter03/book_add">dook_add</a><br>
    <a href="/chapter03/book_update">dook_update</a><br>
    <a href="/chapter03/book_delete">book_delete</a><br>
</body>
呈现在用户面前的是四个超链接,当用户点击这四个超链接时,根据以往的知识,会跳转到不同的页面,假设我们点击了book_del超链接,紧接着,发产生一book_del.action,这个action会被“发送到”struts.xml中,在struts.xml中,有如下语句:

<!--关于book的操作-->
<action name="book_*" class="cn.itcast.action.BookAction" method="{1}">
    <result name="success">/success.jsp</result>
    <result name="login">/login.jsp</result>
    <interceptor-ref name="myStack">
</action>
由上可见,根据发送来的action,理应和类cn.itcast.action.BookAction实现类相通信,但是在这个节点下有一个interceptor标签,实现了一个拦截器,所以不会直接和cn.itcast.action.BookAction类相通信,而是先和拦截器中的类相通信,这个拦截器的name属性值是myStack,那么接下来就会和拦截器myStack中的java类相通信,配置这些实现类的拦截器放在哪里呢,也在struts.xml中其配置代码如下所示:

<struts>
    <package name="struts2" namespace="/" extends="struts-default">
        <!--声明拦截器-->
        <interceptors>
             <interceptor name="privilege" class="cn.itcast.interceptor.PrivilegeInterceptor"/>
             <!--声明拦截器栈时,已经声明的拦截器可以直接加入到拦截器栈中,但要在拦截器栈中加入自己设置的拦截器,必须先声明-->
             <interceptor-stack name="myStack">
                   <interceptor-ref name="defaultStack"/>
                   <!--声明自己的拦截器时,必须显式声明默认拦截器-->
                   <interceptor-ref name=privilege"/>
</interceptor-stack>
 </interceptors> <action>...</action> ....... <action>...</action> </package></struts>


在本例中,自定义拦截器的实现类cn.itcast.interceptor.PrivilegeInterceptor如下所示:

package cn.itcast.interceptor;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class PrivilegeInterceptor extends AbstractInterceptor {
	private static final long serialVersionUID = 1L;
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		ActionContext actionContext = invocation.getInvocationContext();// 得到ActionContext.
		Object user = actionContext.getSession().get("user");//获取user对象
		if (user != null) {
			return invocation.invoke(); // 继续向下执行.
		} else {
			actionContext.put("msg", "您还未登录,请先登录");
			return Action.LOGIN; //如果用户不存在,返回login值
		}
	}
}
因为我们到目前为止还没有输入任何数据,所以user不存在,所以会直接返回login.jsp,当下次发送请求时,由于不存在拦截器的问题,又变成了以前的知识,下面,以流程图的形式,从面向对象的角度来分析整个struts2框架实现c/s模式的过程。具体流程如图所示:

《java编程思想》中曾提及,一切皆是对象,程序的执行过程即是不同对象间的通信过程。

1、2、3:用户对象发出请求,请求和cn.itcast.action.BookAction对象进行通信

4、5、通信请求被拦截器myStack拦截,为了使原通信成功进行,先要和cn.itcast.PrivilegeInterceptor对象进行通信,由这个类审核成功后才能通信

6、对象cn.itcast.interceptor.PrivilegeInterceptor和servlet API session进行通信,发现user为null,故第一次通信失败

7、返回login.jsp(通信失败了不能就算了吧,服务器返给你一张单子,为下一次通信请求成功做准备)

8、9、10、发送通信请求,请求和cn.itcast.action.LoginAction进行通信,此时没有拦截器进行拦截,通信成功

11、若是用户名和密码不符合要求,返回login.jsp

12、若是用户名和密码符合要求,和servlet API session进行进行通信,为其中的user属性赋值

13、赋值成功后,返回main.jsp

14、15、16、17、和cn.itcast.interceptor.PrivilegeInterceptor对象进行通信

18、cn.itcast.interceptor.PrivilegeInterceptor对象和servlet API session进行通信,发现user的值存在,

19、返回successs.jsp

20、调用invoke()方法,由于没有其他的拦截器了,所以和cn.itcast.action.BookAction通信成功。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值