最近闲来无事,从网上download struts2的源代码来看看,由于这里讲的是拦截器机制,我们直接进入DefaultActionInvocation类的核心方法invoke
(注:本人语言表达能力一般,技术一般,属于刚毕业的菜鸟,有错的地方还请前辈大牛们多多指定)
我们知道Invocation是struts2是核心调试器,在这个类中,可以看到invoke方法依次迭代拦截器有(上图黄色部分)
,最后执行invokeActionOnly方法(红色部分,在invokeActonOlny中实例化我们定义的Action类,通过方法反射调用我们在Action中业务逻辑方法。这里不多讲)
struts2源代码就到这里,我们来看一张被大家经常使用的struts2执行流程图
图中红色圈圈部分对应上面的DefaultActionInvocation类,我们看到一个拦截器包围另一个拦截器,层层包围,最后到最里面的Action层,但具体代码该怎么写呢,上面的代码太复杂,我们把它简化一下
来我们来用最简单的代码演示
package com.jetway.gateway.system.utils.test;
import java.util.Iterator;
public class MyInvocation {
private Iterator<Interceptor> interceptors;
public String invoke() {
if (interceptors.hasNext()) {
Interceptor interceptor = interceptors.next();
return interceptor.interceptor(MyInvocation.this);
}
return "success";
}
}
class Interceptor {
public String interceptor(MyInvocation invocation) {
// 在这里做拦截,如果想继续执行后面的拦截器继续就调用invocation.invke(),
//也可以直接返回一个字符串,后面的拦截器将不再执行,
return invocation.invoke();
//如果这样还不好理解,那就这样写
// String result=invocation.invoke;
// return result;
}
}
这样就更清晰了,上面的代码我想大家都会写,仔细琢磨,好像跟有策略模式很像(本人也不怎么懂设计模式,姑且这样称呼)
这又让我们想起了前不久我在iteye上提的一个问题,怎么消除代码中过多的if{}else{},来看看我之前贴的代码
@Description(info = "登陆系统", actionId = "1")
public String login() {
boolean loginpass = false;
Pckey pckey = null;
// 密码验证标识
int validate = 0;
Integer keyright = 1;
HttpServletRequest request = ServletActionContext.getRequest();
String passFlag = request.getParameter("validate");
if (StringUtils.isNotEmpty(passFlag)) {
validate = Integer.parseInt(passFlag);
}
if (StringUtils.isNotEmpty(username)) {
keyright = Integer.parseInt(userright);
pckey = pckeyService.findKey(username, keyright);
}
if (pckey != null) {
boolean locked = pckeyService.isLocked(pckey);
// 没锁定
if (!locked) {
if (pckeyService.reachMaxCount(pckey)) {
pckeyService.clearErrorCount(pckey);
}
// 验证密码标识
if (validate == 100) {
pckeyService.clearErrorCount(pckey);
HttpSession session = ServletActionContext.getRequest()
.getSession();
session.setAttribute("keyname", username);
session.setAttribute("keyright", userright);
Calendar c = Calendar.getInstance();
c.add(Calendar.HOUR_OF_DAY, 10);
session.setAttribute("logintime", c.getTime().toString());
loginpass = true;
} else {
int errorCount = pckeyService.addErrorCount(pckey);
if (errorCount > 0) {
msg = "密码错误,剩余<font style='font-size:18px;font-weight:bold;'>"
+ errorCount + "</font>次key将被锁定";
} else {
msg = "密码错误,此key已被限制登陆," + pckey.getLimitdate()
+ "分钟后系统自动解锁";
pckeyService.setLockDate(pckey);
}
}
} else {
// 锁定
msg = "此key已经被锁定,您无法登陆系统";
}
} else {
// key 不合法
msg = "请插入合法key";
}
return loginpass == true ? SUCCESS : "error";
}
一个简单的登陆验证功能,代码中充斥着if,else,很不好读。怎样模仿struts2的拦截器让上面的代码看起来更beautiful些呢
可以这样(不管是不是策略模式,小弟在这里就借用一下命名哈)
1:定义一个策略接口(里面只有一个execute方法)
package com.jetway.gateway.system.utils.test;
public interface Strategy {
public String execute(StrategyExecutor executor);
}
2.定义一个策略执行者类(实际上也就是struts2中的调度者),假设如果所有验证都通过,则返回"success",如果有一个验证不通过,则返回对应的错误信息
package com.jetway.gateway.system.utils.test;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class StrategyExecutor {
private Iterator<Strategy> sIterator;
public StrategyExecutor(Strategy... strategies) {
if (strategies.length > 0) {
List<Strategy> list = Arrays.asList(strategies);
sIterator = list.iterator();
}
}
public String invoke() {
if (sIterator != null) {
if (sIterator.hasNext()) {
Strategy strategy = sIterator.next();
return strategy.execute(StrategyExecutor.this);
}
}
return "success";
}
}
3.定义两个策略实现类,也就是具体的验证逻辑,比如验证密码,登陆次数,,这里只是简单模拟
a.用户名密码验证
package com.jetway.gateway.system.utils.test;
import org.apache.commons.lang.StringUtils;
public class AuthorityStraty implements Strategy {
private String name;
private String pwd;
public AuthorityStraty(String name, String pwd) {
this.name = name;
this.pwd = pwd;
}
public String execute(StrategyExecutor executor) {
// demo
if (StringUtils.isNotBlank(name) && StringUtils.isNotBlank(pwd)
&& name.equals("11") && pwd.equals("11")) {
return executor.invoke();
}
return "用户名或密码错误";
}
b.再来一个时间验证
package com.jetway.gateway.system.utils.test;
public class TimeOutStrategy implements Strategy {
private int hours;
public TimeOutStrategy(int hours) {
this.hours = hours;
}
public String execute(StrategyExecutor executor) {
if (hours > 9) {
return executor.invoke();
}
return "时间不能小于9小时";
}
}
4:最后就是我们的客户端调用
package com.jetway.gateway.system.utils.test;
public class Client {
public static void main(String[] args) {
Strategy logincheck = new AuthorityStraty("11", "11");
Strategy timecheck = new TimeOutStrategy(10);
String resultInfo = new StrategyExecutor(logincheck, timecheck)
.invoke();
System.out.println(resultInfo);
}
}
在不改变代码的情况下,我们可以添加,删除任意接口实现,并且业务逻辑更清晰。
- 大小: 79 KB
- 大小: 54.1 KB
- 大小: 71.9 KB
分享到:
相关推荐
### Struts2拦截器详解 #### 一、Struts2拦截器概述 Struts2框架作为Java Web开发中的一种流行框架,其核心组件之一便是**拦截器**。...理解并合理运用拦截器,对于提升项目的开发效率和代码质量具有重要意义。
Struts拦截器(Interceptors)是Struts2框架的核心组件之一,它们在处理请求时扮演着重要的角色。拦截器的工作原理类似于AOP(面向切面编程),允许开发者在动作执行前后插入自定义逻辑,比如权限检查、日志记录、...
在Struts2中,拦截器扮演着至关重要的角色,它们允许我们在动作执行前后插入自定义逻辑,提升代码的可复用性和模块化。本篇文章将深入探讨如何使用Struts2的拦截器技术来实现页面检测和用户注册功能。 首先,我们...
1. **Struts拦截器**: - 拦截器是Struts2的核心组件之一,它们是基于Java的动态代理机制实现的。在Action调用前后,拦截器可以执行一系列预定义的任务,如日志记录、权限验证、数据校验等。 - 拦截器链是由多个...
Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展且易于管理的企业级应用程序。在Struts2中,拦截器扮演着至关重要的角色,它们是实现...通过理解并熟练运用拦截器,我们可以构建更健壮、更安全的Web应用。
Struts2是一个强大的Java web框架,它提供了许多功能来简化MVC(模型-视图-控制器)应用程序的开发。在Struts2中,拦截器(Interceptor)是一个至关...在实际项目中,灵活运用拦截器可以显著提高开发效率和代码质量。
本文将深入探讨Struts2的拦截器使用,结合实例和源码分析,帮助你更好地理解和运用这一特性。 一、拦截器的概念与作用 拦截器是Struts2框架的核心组件之一,它是在动作执行前后插入的一段代码,能够对请求进行...
### Struts2.0拦截器详解 #### 一、拦截器概述 在Struts2框架中,拦截器(interceptor)是一种非常重要的机制,用于在...此外,深入学习Struts2的拦截器机制还有助于更好地掌握AOP思想,从而在实际项目开发中灵活运用。
通过阅读和理解这些代码,你可以更好地掌握Struts2拦截器的工作原理,并在实际项目中灵活运用。 此外,`web.xml`主要配置了Struts2的前端控制器`DispatcherServlet`,确保Struts2能够正确地处理HTTP请求。在理解...
Struts2是一个流行的Java Web框架,它极大地简化了MVC(模型-视图-控制器)应用的开发。拦截器是Struts2的核心组件之一,它基于AOP(面向切面编程)的...理解并熟练运用拦截器,对于高效地开发Java Web应用至关重要。
Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括类型转换、拦截器和校验机制。本文将深入探讨这些关键知识点,并通过实际例子来帮助你理解它们的工作原理和应用。 首先,我们来看看**类型转换...
Struts2是一个强大的Java web应用程序框架,它提供了一种组织和控制MVC(模型-视图-控制器)架构的方式。拦截器是Struts2框架的核心特性之一,...理解并熟练运用拦截器,对于提升Struts2应用的开发效率和质量至关重要。
Struts2 拦截器是 Struts2 框架中的一个重要组成部分,它是一种设计模式,用于在请求到达Action之前或之后执行特定的操作。...通过深入理解和熟练运用拦截器,我们可以更高效地构建和维护Struts2应用程序。
Struts2是一个强大的Java web开发框架,它极大地简化了基于MVC模式的应用程序构建过程。在Struts2中,拦截器扮演着至关重要的角色,它们是...了解并熟练运用这些拦截器,对于提高代码质量、简化项目维护具有重要意义。
在Struts2中,拦截器扮演着至关重要的角色,它们是框架的核心组件,能够增强应用的功能并实现诸如日志记录、权限检查、事务管理等通用任务。本文将深入探讨如何模拟Struts2的拦截器,并通过一个实际的Filter类来阐述...
Struts2 拦截器是其核心特性之一,它为开发者提供了强大的功能,用于处理请求、响应以及在业务逻辑执行前后进行各种操作。在 Struts2 框架中,...在实际项目中,理解并熟练运用拦截器能够使你的应用更加健壮和高效。
Struts2 拦截器是其核心特性之一,它是一种强大的机制,允许开发者在请求到达 Action 之前或之后执行自定义逻辑。拦截器在 Struts2 框架中扮演着...因此,熟悉并熟练运用拦截器是每一个 Struts2 开发者的必备技能。
Struts2作为一款流行的Java Web框架,其核心机制之一就是拦截器(Interceptor)。拦截器是AOP(面向切面编程)思想在Struts2中的具体实现,它允许开发者在动作执行前后插入自定义的处理逻辑,提升了代码的可复用性和...
Struts2 框架是Java Web开发中广泛使用的MVC框架之一,它极大地简化了企业级应用的构建。在Struts2中,拦截器扮演着至关重要的角色,它们允许...通过理解和熟练运用拦截器,可以更高效地开发和维护Struts2应用程序。
Struts2是一个强大的Java EE框架,它用于构建和维护可扩展且易于管理的企业级Web应用程序。在Struts2中,拦截器(Interceptor...通过不断学习和实践,你可以更熟练地运用Struts2拦截器来构建高效、安全的Web应用程序。