- 浏览: 118733 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
panqun:
jquery.mytime.js这个js请问你有么
基于JFinal的后台业务框架通用模块 -
tyc1920:
http://localhost/jcbase/res/js/ ...
基于JFinal的后台业务框架通用模块 -
breeze_86:
哥们有没有源码啊?能不能发一份!353474917@qq.co ...
dwr之IM项目(一) -
逍遥bxf飞雪:
哥们有没有源码啊?能不能发一份!396941223@qq.co ...
dwr之IM项目(一) -
yulon:
w156445045 写道nameKey JSONArray ...
jquery autoComplete 在实际项目的运用
由于拦截器的重要性,决定将其从(struts2.1两天快速入门第一天下午 抽取出来讲)
本讲将结合模拟用户权限验证展开:判断用户是否有权限请求访问某一模块或页面.
第九讲、自定义拦截器
9.1 首先定义一个User实体类,如下:
public class User implements Serializable { private String username; private String password; 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; } }
9.2 编写一个用户登陆的Action类,如下:
public class UserLoginAction { //接收复合类型的参数,与struts1.x相类似,此时表单的元素名称 //应该为:user.username user.password private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String execute(){ //模拟用户登陆,实际应用是从数据库里取的,这里只是为了方便测试和学习 if("yulon".equals(user.getUsername())&&"123456".equals(user.getPassword())){ //为了不让我们看到真正的session,struts2框架对其作了一层封装,用一个Map对象来存储. //Map map = ActionContext.getContext().getSession(); //map.put("user", user); //把两段代码合成一段,就不用导入Map类 ActionContext.getContext().getSession().put("user", user); return Action.SUCCESS; //返回到欢迎页面 } ActionContext.getContext().put("msg", "用户登陆失败!"); //返回到登陆页面,struts定义了一系列字符串常量,方便用户使用,统一的好处 return Action.LOGIN; } }
知识提示:注意这里返回的是login,而不是LOGIN.查看ActionContext部分源码及相关文档可知,它是一个与线程相关的类,同一个线程内获取的都是同一个ActionContext实例,原理与ThreadLocal相关,之前有讲过ThreadLocal相关知识,ThreadLocal实现在同一个线程内的数据共享,可以更深入得理解ActionContext底层的实现原理.
9.3 在struts.xml配置文件里新增一个package包,名称叫testinterceptor,命名空间定义为/test2,如下配置:
<package name="testinterceptor" namespace="/test2" extends="struts-default"> <!--定义一个转发到登陆页面的Action--> <action name="loginUI"> <result>/WEB-INF/jsp/login.jsp</result> </action> <action name="login" class="cn.gkit.action.UserLoginAction" method="execute"> <!--重定向到同一个包内名字叫index的Action--> <result name="success" type="redirectAction">index</result> <result name="login">/WEB-INF/jsp/login.jsp</result> </action> <!--为了方便测试,同时也定义一个登出的Action--> <action name="logout" class="cn.gkit.action.UserLogoutAction" method="execute"> <result name="success" type="redirectAction">loginUI</result> </action> <!--用户登陆成功后的欢迎页面--> <action name="index"> <result name="success">/WEB-INF/jsp/welcome.jsp</result> <result name="login" type="redirectAction">loginUI</result> </action> </package>
9.4 编写UserLogoutAction类
public class UserLogoutAction { public String execute(){ //取出当前登陆的用户 User user = (User)ActionContext.getContext().getSession().get("user"); if(user!=null){ //注销用户信息 ActionContext.getContext().getSession().remove("user"); } return Action.SUCCESS; } }
9.5 编写\WEB-INF\jsp\login.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>用户登陆</title> </head> <span>${msg}</span> <body> <s:form action="login" namespace="/test2" method="post"> 用户名: <s:textfield title="填写用户名" name="user.username" ></s:textfield><br/> 密 码 :<s:password title="填写密码" name="user.password"></s:password><br/> <s:submit value="登陆"></s:submit> </s:form> </body> </html>
知识提示:使用struts2标签首先在导入相关uri, 可以在struts2核心包下的META-INF目录下找到struts-tags.tld文件,里面就有uri的定义,具体标签的使用暂不在本章细讲,大家可以先琢磨一下.
9.6 编写\WEB-INF\jsp\welcome.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>欢迎首页</title> </head> <body> 欢迎用户${sessionScope.user.username}的到来!<br /> <a href='<s:url action="logout" namespace="/test2" />'>退出</a> </body> </html>
在没有使用拦截器之前,是可以直接访问/struts2.1/test2/index请求的.
9.7实现自己的拦截器cn.gkit.web.interceptor.UserAuthInterceptor(有三种方法)
第一种方法是实现com.opensymphony.xwork2.interceptor.Interceptor接口,实现相应的方法就行.
public class UserAuthInterceptor implements Interceptor{ public void destroy() { } public void init() { init() System.out.println("服务器启动过程中自动加载"); } public String intercept(ActionInvocation invocation) throws Exception { //ActionContext.getContext().getSession().get("user"); Map map = invocation.getInvocationContext().getSession(); if(map.get("user")==null){ System.out.println("用户还没登陆"); return Action.LOGIN; //struts定义了一系统字符串常量,注意这里返回的是login,而不是LOGIN. }else { String result = invocation.invoke();//如果用户已登陆就通过验证,继承执行下一个拦截器 System.out.println("返回结果:"+result); return result; } } }
知识提示:invocation.getInvocationContext()获取到的是一个与ActionInvocation相关的ActionContext ,但使用ActionContext.getContext()也一样可以取得.
第二种方法是继承AbstractInterceptor抽象,此类的设计思想跟之前讲的类型转换器类似.它本身也是实现了Interceptor接口,由于我们一般都不用到init()方法和destroy()方法,因此通常情况下都是通过继承AbstractInterceptor来实现我们的拦截器.如下:
public class UserAuthInterceptor extends AbstractInterceptor{ @Override public String intercept(ActionInvocation invocation) throws Exception { //ActionContext.getContext().getSession().get("user"); Map map = invocation.getInvocationContext().getSession(); if(map.get("user")==null){ System.out.println("用户还没登陆"); return Action.LOGIN; }else { String result = invocation.invoke(); System.out.println("返回结果:"+result); return result; } } }
知识提示:查看AbstractInterceptor源码,你会感到惊讶,如下:
public abstract class AbstractInterceptor implements Interceptor { public void init() { } public void destroy() { } public abstract String intercept(ActionInvocation invocation) throws Exception; }
知识提示:你没有看错,就是几行代码,它只是帮我们实现了两个不常用到的方法,并且还是空实现. 但里面包含的一种设计思想值得我们去学习研究,所以说学习框架的最高境界是学习它的思想,思想就存在代码当中,大家有时间可以多查看一下它的源码.
9.8 将我们编写好的拦截器类加载到struts.xml配置文件中,如下定义:
<interceptors> <!-- 加载自己编写的拦截器 --> <interceptor name="authInterceptor" class="cn.gkit.web.interceptor.UserAuthInterceptor" /> </interceptors>
9.9 将我们编写好的拦截器应用到具体的action类上,将struts.xml 名称为index的<action>改如下:
<action name="index"> <result name="success">/WEB-INF/jsp/welcome.jsp</result> <result name="login" type="redirectAction">loginUI</result> <interceptor-ref name="authInterceptor"></interceptor-ref> </action>
此时:若访问/struts2.1/test2/index,请求将先会被自己定义的authInterceptor拦截器拦截,执行intercept方法的代码,判断用户若没有登陆则转到登陆页面,若存在才会放行(即执行下一步,这里的下一步会执行请求对应的Action方法).
问题:为什么说拦截器是struts2的核心呢?是因为struts2的很多工作都是通过拦截器来实现的,在你定义的<package>的同时,只要你extends 了struts-default包,就同时拥有了struts-default包内定义的全部内容.通过查看struts-default.xml文件可知,它里面定义了很多拦截器,每个拦截器负责完成不同的工作.如里面名字为params的拦截器的作用是会将页面表单的参数会自动赋值到action里的属性。其中在最后定义了一个默认的拦截器栈<default-interceptor-ref name="defaultStack"/>,默认情况下默认拦截器栈会应用到包内定义的所有action身上. 但如果你手工在一个<action>添加一个额外的拦截器后,此时默认的拦截器栈对本<action>不起作用.解决的办法如下:
第一种解决方案:重新引入defaultStack拦截器栈,将index改如下:
<action name="index"> <result name="success">/WEB-INF/jsp/welcome.jsp</result> <result name="login" type="redirectAction">loginUI</result> <interceptor-ref name="authInterceptor"></interceptor-ref> <!-- 重新引入 defaultStack--> <interceptor-ref name="defaultStack"></interceptor-ref> </action>
第二种解决方案:定义自已的拦截器栈,如下:
<interceptors> <!-- 加载自己编写的拦截器 --> <interceptor name="authInterceptor" class="cn.gkit.web.interceptor.UserAuthInterceptor" /> <!-- 定义拦截器栈 --> <interceptor-stack name="myInterceptorStack"> <!-- 引用用户定义的拦截器 --> <interceptor-ref name="authInterceptor"></interceptor-ref> <!-- 同时也要重新把默认的拦截器栈引入进来 --> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors>
将自己定义好的拦截器栈应用到具体action类中,如将<action>改写成:
<action name="index"> <result name="success">/WEB-INF/jsp/welcome.jsp</result> <result name="login" type="redirectAction">loginUI</result> <!-- 引入自定义拦截器栈 --> <interceptor-ref name="myInterceptorStack"></interceptor-ref> </action>
第三种解决方案:重新定义默认拦截器栈
<interceptors> <!-- 加载自己编写的拦截器 --> <interceptor name="authInterceptor" class="cn.gkit.web.interceptor.UserAuthInterceptor" /> <!-- 定义拦截器栈 --> <interceptor-stack name="myInterceptorStack"> <!-- 引用用户定义的拦截器 --> <interceptor-ref name="authInterceptor"></interceptor-ref> <!-- 同时也要重新把默认的拦截器栈引入进来 --> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 重新定义默认的拦截器栈,覆盖掉struts-default定义的默认拦截器栈 --> <default-interceptor-ref name="myInterceptorStack"></default-interceptor-ref>
注意:此时在testinterceptor包内定义的所有<action>默认都会被myInterceptorStack拦截器拦截,index不用重新定义拦截器,改如下:
<action name="index"> <result name="success">/WEB-INF/jsp/welcome.jsp</result> <result name="login" type="redirectAction">loginUI</result> </action>
具体使用哪一种方法按项目需求而定
9.10 在 9.7节里面还有一种自定义拦截器的方法没讲到:就是方法过滤拦截器(MethodFilterInterceptor)
编写方法过滤拦截器第一步:编写继承于MethodFilterInterceptor抽象类的拦截器
public class MyMethodFilterInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("执行了MyMethodFilterInterceptor拦截器");
String resultString = invocation.invoke();
System.out.println("返回的结果:"+resultString);
return resultString;
}
}
第二步,在上次编写的test包内加载这个拦截器,如下:<interceptors>
<interceptor name="mymethodinterceptor" class="cn.gkit.web.interceptor.MyMethodFilterInterceptor"></interceptor>
</interceptors>
第三步,在具体的action里应用该拦截器,如下:<package name="test" namespace="/test" extends="gkit">
<interceptors>
<!-- 定义方法过滤拦截器 -->
<interceptor name="mymethodinterceptor" class="cn.gkit.web.interceptor.MyMethodFilterInterceptor"/>
</interceptors>
<action name="*User" class="cn.gkit.action.HelloWorldAction" method="{1}" >
<param name="message">属性注入</param>
<result name="success">/WEB-INF/jsp/helloworld.jsp</result>
<interceptor-ref name="mymethodinterceptor">
<!--指定要拦截的方法 includeMethods的优先级比excludeMethods的要高-->
<param name="includeMethods">add,execute</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
评论
对我帮助很大
希望有更好的文章发布
期待中~~~~·
不知不觉中就会了呵。。
发表评论
-
struts2两天快速入门第二天上午(输入校验)
2010-01-11 09:48 18911、新建一个UserRegAction,为了方便编程,继承于A ... -
struts2.1.x两天快速入门后期课程发布
2009-12-29 19:19 1488由于近段时间较忙,后续课程抽不出时间发布. 预计到下个星期将继 ... -
struts2.1两天快速入门(第二天上午)
2009-12-23 12:27 0第二天上午学习目录列表: 十一、实现手动输入 ... -
已经会struts1.x了为何还要学习struts2呢
2009-12-22 18:36 2433一、首先,一个新版本的程序是为了解决老版本的一些bug而出世. ... -
struts2.1两天快速入门第二天上午之手工输入校验
2009-12-22 15:53 0一 -
struts2.1两天快速入门(第一天下午)
2009-12-20 11:23 3339第一天下午学习目录列表: 六、Struts2 ... -
struts2专题之文件上传及异步上传头像
2009-12-20 09:11 0文章目录: 一、实现一个简单的上传文件 ... -
struts2.1两天快速入门(第一天上午)
2009-12-19 13:56 9153第一天上午学习目录列表: 一、 ...
相关推荐
书中通过大量的示范性实例(全书范例近百个),逐一、详细地讲解了Struts2各知识点的用法,并细致地讲解每个用法的各种参数、选项,可以帮助读者入门到精通。 3.配合案例,快速提高 《Struts 2.1权威指南》最后配备...
3. **拦截器(Interceptors)**:Struts2的拦截器是AOP(面向切面编程)思想的具体体现,它们可以对Action调用前后进行拦截,实现如日志记录、权限检查、性能监控等功能。常见的拦截器有params(参数校验)、i18n...
请求被Struts 2的过滤器拦截。 3. 过滤器根据配置文件找到对应的Action。 4. Action通过Interceptor进行预处理。 5. 执行Action中的业务逻辑。 6. Action返回一个Result。 7. Result负责渲染视图并响应给用户...
1. **拦截器机制**:Struts2的核心特性之一是其强大的拦截器链,它允许我们在请求处理过程中插入自定义的逻辑,如日志记录、权限验证、性能监控等。 2. **动态方法调用**:Struts2支持动态方法调用,使得可以根据...
3. **Interceptor(拦截器)**:拦截器是Struts 2中的一个重要概念,它们可以插入到Action调用的流程中,执行预处理或后处理任务,如日志记录、权限检查、事务管理等。 4. **Result**:Result是Action执行后的结果...
这个插件允许开发者在Struts 2中轻松地创建能够返回JSON的Action,使得前端(通常使用JavaScript库如jQuery)可以获取到JSON数据并进行进一步处理。 现在我们来详细讨论这两个库在实际应用中的作用: 1. **json-...
- `struts-2.1.8.1.jar`:核心库,包含了Struts2的主要实现。 - `struts2-convention-plugin-2.1.8.1.jar`:约定优于配置插件,简化了Action和结果的配置。 - `struts2-core-2.1.8.1.jar`:核心框架组件。 - `struts...
-拦截器(Interceptors):Struts2的拦截器机制类似于AOP(面向切面编程),可以实现事务管理、日志记录、性能监控等多种功能。 -插件架构:Struts2拥有丰富的插件支持,如Freemarker、JSP、Velocity等视图技术,...
18_黑马程序员_struts2.1视频教程_自定义拦截器.rar是关于Struts2的拦截器(Interceptor)机制,拦截器是Struts2的一大亮点,它可以拦截请求,执行预处理或后处理操作。通过自定义拦截器,开发者可以实现如日志记录...
2. **拦截器(Interceptor)**:Struts2的核心特性之一,拦截器链可以理解为一系列预定义的处理步骤,这些步骤在Action调用前后执行,如日志记录、权限验证、异常处理等。开发者可以根据需要自定义拦截器。 3. **...
1. **配置文件**:需要在`struts.xml`或`struts-default.xml`中定义Action、Result和Interceptor。 2. **注解支持**:Struts 2.1支持使用注解来声明Action、Result和Interceptor,简化XML配置。 3. **安全问题**:...
3. **Interceptor(拦截器)**:拦截器是Struts 2中的一个重要概念,它允许在Action执行前后插入自定义逻辑。拦截器可以实现如日志记录、权限检查、事务管理等功能,增强了框架的灵活性和可扩展性。 4. **...
李刚的Struts 2.1权威指南:基于WebWork核心的MVC开发,写的很详细。一共有九个压缩文件。
1. **配置文件**:`struts.xml`是Struts2的核心配置文件,定义了Action、结果类型、拦截器栈等信息。 2. **Action类**:每个Action类对应一个用户请求,负责处理业务逻辑,并返回一个结果。 3. **模型-视图-控制器**...
Struts2.1权威指南 李刚的著作 共四个部分 用7-zip解压
1. **Struts 2框架**:Struts 2是MVC(Model-View-Controller)设计模式的一个实现,它整合了WebWork和Struts 1的优点,提供了强大的动作调度、拦截器、结果类型、国际化和异常处理等功能。Struts 2.1.8.1是该框架的...
2. **配置文件**:Struts2的配置主要分为两个部分:struts.xml和struts-default.xml。前者是用户自定义的配置,用于指定Action类、Action映射、结果类型等;后者是框架默认的配置,包含了大部分的默认行为和拦截器链...
4. **配置Struts2**:在WEB-INF下创建struts.xml文件,配置Struts2的核心拦截器栈、Action和结果类型。例如: ```xml <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false"/> ...
接下来是`struts-2.1.dtd`,这是Struts 2的一个更新版本。随着框架的发展,Struts 2引入了一些新特性,可能修改或扩展了原有的配置元素。例如,可能增加了新的拦截器或者动作配置选项。开发者需要根据这个DTD来更新...
2. **配置文件**:主要包括`struts.xml`,这是Struts2的核心配置文件,用于定义Action、结果类型、拦截器栈等。通过XML或者注解方式配置,可以实现动态路由和灵活的配置管理。 3. **Interceptor(拦截器)**:拦截...