接下来我将为你详细讲解如何进行Java中的Struts2框架拦截器之实例代码操作攻略。
什么是Struts2框架拦截器
Struts2是一个基于MVC设计模式的Web框架,而拦截器是Struts2中较为重要的一部分。拦截器可以在Action被执行之前和之后做一些业务处理,例如权限控制、异常处理、日志记录等。
Struts2框架拦截器的使用步骤
1. 创建一个拦截器类
我们需要创建一个Java类,该类继承自Struts2的Intercepter类,实现接口中的intercept()方法,并在该方法中处理拦截器的逻辑代码。
package com.example;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class ExampleInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 在这个方法中写拦截器的逻辑代码
System.out.println("拦截器在Action执行前执行的代码");
String result = invocation.invoke();
System.out.println("拦截器在Action执行后执行的代码");
return result;
}
}
2. 在struts.xml文件中配置拦截器
在struts.xml中配置拦截器的全局或局部拦截器(也就是只拦截某些Action),例如:
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="exampleInterceptor"
class="com.example.ExampleInterceptor"/>
<interceptor-stack name="exampleStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="exampleInterceptor"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="exampleStack"/>
<action name="hello" class="com.example.HelloAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
在这里我们定义了一个名为exampleInterceptor
的拦截器,然后定义了一个名为exampleStack
的拦截器栈(Stack),该栈由defaultStack
和exampleInterceptor
两个拦截器构成。其中defaultStack
是Struts2框架默认提供的拦截器栈,主要包含了一些Struts2框架内置的拦截器。default-interceptor-ref
用于定义默认拦截器,也就是指定了一个Action被执行时默认使用的拦截器栈。
3. 在Action中使用拦截器
在Action类的方法上使用@InterceptorRef
注解,可以选择是否应用拦截器,例如:
package com.example;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
@Namespace("/")
@Results({@Result(name = "success", location = "/success.jsp")})
public class HelloAction extends ActionSupport {
private static final long serialVersionUID = 1L;
@Action(value = "hello", interceptorRefs = {
@InterceptorRef("exampleStack")
})
public String execute(){
System.out.println("Action被执行");
return SUCCESS;
}
}
在这个例子中,我们使用了@InterceptorRef("exampleStack")
注解来指定在执行Action时应用的拦截器栈。
现在,我们已经成功创建了一个Struts2拦截器和采用拦截器和Action的示例,下面会给出两条代码。
示例1
Suppose,现在我们给ExampleInterceptor
拦截器加入一个判断用户是否已经登陆成功的代码,如果没有登陆,直接重定向到登陆页面。我们先在拦截器中加入如下代码:
public class ExampleInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 在这个方法中写拦截器的逻辑代码
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if(user == null){
// 未登录,则重定向到登录页面
response.sendRedirect(request.getContextPath() + "/login.jsp");
return null;
}
System.out.println("拦截器在Action执行前执行的代码");
String result = invocation.invoke();
System.out.println("拦截器在Action执行后执行的代码");
return result;
}
}
那么如何在Action中设置这个user
Session值呢?我们可以在登陆Action中设置:
public class LoginAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String username;
private String password;
public String execute(){
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
session.setAttribute("user", username);
return SUCCESS;
}
// setter and getter methods
}
示例2
Suppose,我们现在需要记录日志,即在Action被执行前后都会输出一条记录日志的信息。我们可以在拦截器中加入如下代码:
public class ExampleInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
// 在这个方法中写拦截器的逻辑代码
System.out.println("执行Action [" + invocation.getAction().getClass().getName() + "]前的日志");
String result = invocation.invoke();
System.out.println("执行Action [" + invocation.getAction().getClass().getName() + "]后的日志");
return result;
}
}
这样,我们已经完成了记录日志的拦截器编写了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中的Struts2框架拦截器之实例代码 - Python技术站