Struts2框架的执行流程主要包括以下几个步骤:
- 用户请求:客户端初始化一个指向Servlet容器(例如Tomcat)的请求。
- 拦截器链:请求经过一系列的过滤器(Filter),这些过滤器可以对请求进行预处理,例如权限检查、数据验证等。
- Action处理:Struts2根据配置文件中的映射关系,找到对应的Action类来处理请求。Action类中封装了业务逻辑和数据处理。
- 返回结果:Action处理完成后,会返回一个Result对象,这个对象指示了下一步应该做什么,比如转发到另一个Action或者渲染一个视图。
- 视图呈现:最后,Struts2将Result对象与一个视图相关联,并将视图呈现给用户。
通过以上步骤,我们可以看到Struts2框架的工作流程是:用户请求 -> 拦截器链 -> Action处理 -> 返回结果 -> 视图呈现。
Struts2框架中的拦截器链用于在Action执行前后进行特定功能的处理。
以下是一些关于Struts2拦截器链的具体作用:
- 预处理请求:在Action方法执行之前,可以对请求数据进行校验、登录验证等预处理操作。
- 后处理响应:在Action方法执行之后,可以对响应结果进行处理,如添加特定的头部信息或对输出的数据进行格式化。
- 异常处理:如果Action中发生异常,拦截器可以捕获这些异常并进行相应的处理,比如返回用户友好的错误页面。
- 权限控制:通过拦截器可以实现权限控制,确保只有具备相应权限的用户才能访问某些资源。
- 日志记录:利用拦截器可以在每个请求被处理前后记录日志,便于跟踪和调试。
- 性能监控:可以通过拦截器来监控请求的处理时间,帮助识别性能瓶颈。
- 类型转换错误处理:特定的拦截器如
conversation
可以处理类型转换错误,将错误信息从ActionContext
中取出并转换为Action
错误。
此外,Struts2还提供了一些内建的拦截器,如alias
、i18n
、servletConfig
等,它们各自负责不同的功能,可以根据需要进行配置和使用。
综上所述,拦截器链是Struts2框架中一个非常强大的特性,它允许开发者以插件的形式增强框架的功能,使得代码更加模块化和易于维护。
在Struts2中,拦截器是一种可以在Action的执行过程中拦截请求并对其进行处理的组件。其作用就像是一个过滤器,可以拦截请求并处理请求,例如检查用户是否登录、记录日志等操作。在Struts2中,有很多内置的拦截器,同时也支持用户自定义拦截器来实现特定的需求。
自定义Struts2拦截器需要实现Interceptor接口,Interceptor接口提供了三个方法:init()、intercept()和destroy()。其中init()方法在拦截器被初始化时被调用,一般用于一些初始化的工作;intercept()方法是最重要的方法,它用于拦截请求并进行处理;destroy()方法在拦截器被销毁时被调用,一般用于一些清理工作。
在Struts2中,可以通过配置文件(例如struts.xml)来配置拦截器,具体配置方式可参考Struts2官方文档。同时,也可以通过继承AbstractInterceptor类来实现自定义的拦截器。下面是一个实现拦截器的例子:
from com.opensymphony.xwork2 import ActionInvocation, interceptor
class MyInterceptor(interceptor.AbstractInterceptor):
def intercept(invocation: ActionInvocation):
# Do something before action is executed
result = invocation.invoke()
# Do something after action is executed
return result
在Struts 2框架中,内置了许多拦截器用于处理常见的需求和问题,例如:参数校验,异常处理,国际化等等。以下是Struts2中内置的一些拦截器:
- params:对Action的参数进行校验,保证参数不为空或者合法。
- validation:提供了基于XML的验证框架,可以对Action中的属性进行验证。
- workflow:提供一种流程操作方式,可以通过配置文件控制Action的执行顺序。
- exception:用于捕获Action抛出的异常,并进行处理。
- i18n:用于国际化处理,可以根据用户的语言环境选择不同的资源文件。
- prepare:用于在Action执行前准备数据,也可以用于为Action注入依赖对象。
- chain:可以组合多个拦截器,形成一个拦截器链,方便集中处理一些问题。
以上只是Struts2框架中内置的部分拦截器,开发者还可以根据自己的需求编写自定义的拦截器。
在Struts2中配置自定义拦截器可以通过以下的步骤实现:
- 创建一个实现了Interceptor接口的Java类,对其进行功能定制。
- 在struts.xml中定义拦截器并配置其属性,或者继承自定义的拦截器栈。
下面是一个例子:
引用:用于配置自定义拦截器栈,一个拦截器栈由多个拦截器构成,也可以包含其他的拦截器栈
<interceptors>
<interceptor name="myInterceptor" class="com.example.MyInterceptor"/>
<interceptor-stack name="myInterceptorStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="myInterceptor"/>
</interceptor-stack>
</interceptors>
引用:继承MethodFilterInterceptor,功能定制拦截器拦截方法。
public class MyInterceptor3 extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//前处理
System.out.println("MyInterceptor前处理");
//如何进行放行
invocation.invoke();
//后处理
System.out.println("MyInterceptor后处理");
return null;
}
}