详解Struts2拦截器机制
1. 什么是Struts2拦截器
Struts2拦截器是一个非常重要的组件,用于对请求进行拦截和处理,同时也是整个Struts2框架的核心。
在Struts2中,每个请求都会经过多个拦截器的处理,每个拦截器只是完成了部分工作,多个拦截器组合在一起,最终完成了一个完整的请求处理流程。
2. Struts2拦截器机制的流程
Struts2拦截器机制的流程如下:
-
请求发起:当用户在浏览器中输入URL,请求到达Struts2 Controller时,请求被拦截器拦截。
-
拦截器链:所有的拦截器按照Struts.xml中定义的顺序组成拦截器链。拦截器链是一个有序集合,按照定义的顺序执行。
-
执行拦截器:拦截器链中的每个拦截器都会执行自己的逻辑,并将请求传递给下一个拦截器。
-
Action执行:当拦截器链中的所有拦截器执行完成后,请求最终被传递给Action,Action执行自己的逻辑。
-
结果返回:Action执行完成后,结果被返回给拦截器链,拦截器链进行后续处理,最终将结果返回给浏览器。
3. Struts2拦截器的分类
Struts2拦截器根据其功能和执行位置的不同,可以分为以下几类:
-
控制拦截器(Control Interceptor):决定是否执行Action。如:params、prepare、validation、workflow等。
-
工作流拦截器(Workflow Interceptor):用于工作流控制,如:exception、debug、profiling等。
-
处理拦截器(Execution Interceptor):管理Action执行流程,如:action、result等。
-
输入拦截器(Input Interceptor):管理如何将请求参数绑定到Action属性中。
-
输出拦截器(Output Interceptor):将Action的执行结果转换为最终的输出格式。
-
安全拦截器(Security Interceptor):管理一个请求是否可被理解为受控请求,使用安全拦截器可以配置哪些请求进行安全控制,如:authentication、authorization等。
4. 示例1:自定义拦截器
下面以示例的形式,演示如何自定义一个控制拦截器。
- 创建拦截器类:示例中使用java类实现拦截器。
public class CustomInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
@Override
public void destroy() {
System.out.println("Interceptor destroyed");
}
@Override
public void init() {
System.out.println("Interceptor initialized");
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("Interceptor invoked");
return invocation.invoke();
}
}
- 在struts.xml中配置自定义拦截器:
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="custom" class="com.example.interceptor.CustomInterceptor"/>
<interceptor-stack name="myStack">
<interceptor-ref name="custom"></interceptor-ref>
<interceptor-ref name="params"></interceptor-ref>
<interceptor-ref name="validationWorkflowStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
</package>
- 使用拦截器:使用在Struts.xml中定义的自定义拦截器。
<action name="login" class="com.example.action.LoginAction" method="login">
<interceptor-ref name="myStack"></interceptor-ref>
<result name="success">welcome.jsp</result>
</action>
5. 示例2:使用Struts2内置拦截器实现表单验证
下面以示例的形式,演示如何使用Struts2内置拦截器实现表单验证。
- 编写Action
public class LoginAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String username;
private String password;
@Override
public String execute() throws Exception {
if(username.equals("admin") && password.equals("admin123")) {
return SUCCESS;
}
else {
addActionError(getText("error.login"));
return INPUT;
}
}
public void setUsername(String username) {
this.username = username;
}
public String getUsername() {
return username;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return password;
}
}
- 配置struts.xml:
<action name="login" class="com.example.action.LoginAction" method="execute">
<result name="input">/login.jsp</result>
<result name="success">/welcome.jsp</result>
<interceptor-ref name="defaultStack">
<param name="validation.excludeMethods">execute</param>
</interceptor-ref>
</action>
- 在JSP中使用标签库实现前端验证
<%@taglib prefix="s" uri="/struts-tags" %>
<s:form action="login">
<s:textfield name="username" label="username" />
<s:password name="password" label="password" />
<s:submit value="login" />
</s:form>
在以上示例中,通过配置defaultStack拦截器完成了表单验证的功能。参数validation.excludeMethods指定了执行Action的方法不应该进行表单验证。在login.jsp中,通过使用struts标签库,可以实现前端验证的功能。
6. 总结
了解Struts2拦截器机制可以帮助我们更好的掌握Struts2框架,并实现更灵活的工作流程。Struts2提供了许多内置的拦截器,同时也可以通过自定义拦截器来满足个性化需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Struts2拦截器机制 - Python技术站