文章目录

  • 0 回顾
  • 0.1 OgnlContext
  • 0.2 Strut2与Ognl的结合
  • 0.3 Struts2运行流程
  • 0.4 文件上传
  • 一、自定义拦截器
  • 1.1 拦截器的创建方式
  • 1.1.1 方式一:实现Interceptor接口
  • 1.1.2 方式二:继承AbstractInterceptor
  • 1.1.3 方式三!:继承MethodFilterInterceptor
  • 1.2 Action类
  • 1.2.1 Demo1Action
  • 1.2.2 Demo2Action
  • 1.2.3 配置文件(重要!拦截器相关注册、指定方法拦截)


0 回顾

0.1 OgnlContext

  • OgnlContext
  • Root:对象
  • ContextMap

0.2 Strut2与Ognl的结合

  • ValueStack
  • Root:栈。栈顶:xxAction
  • 取值:属性名
  • ActionContextMap
  • #key.属性名
  • 转发中值的传递
  • Action1 redirect Action2
  • <param name="参数名">${属性名}</param>

0.3 Struts2运行流程

  1. 进入核心过滤器
  1. 准备ValueStack
  2. 准备ActionContext
  3. 包装request对象 - getAttribute(key)
  • 取值
  1. request域中
  2. ValueStackRoot中取值
  3. ActionContext
  1. 执行20个拦截器,Interceptor
  • 递归方法
  1. 执行Action,得到resultCode
  2. 执行结果处理。4种
  1. dispatcher
  2. redirect
  3. chain
  4. redirectAction
  1. JSP显示

0.4 文件上传

  1. 表单设置
  1. enctype="multipart/form-data"
  2. method="post"
  1. 前端 <input type="file" name="file">
  2. Action提供File 类型 file属性
  3. 提供 fileFileName 属性,接收文件名
  4. 提供 fileContentType 属性,接收文件类
  5. FileUtils.copyFile(src, dest);
  • dest文件名通常是生成的不重复的字符串 uuid

一、自定义拦截器

1.1 拦截器的创建方式

1.1.1 方式一:实现Interceptor接口

  • 拦截器生命周期:随项目的启动而创建,随项目关闭而销毁。
package a_interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

// 方式一:实现Interceptor接口
public class MyInterceptor1 implements Interceptor {
	@Override
	// 对象销毁时调用
	public void destroy() {
		
	}

	@Override
	// 对象创建初始化时调用
	public void init() {
		
	}

	@Override
	// 核心拦截方法
	public String intercept(ActionInvocation invocation) throws Exception {
		// Action前处理
		System.out.println("MyInterceptor1");
		
		// 放行 - 下一个拦截器
		invocation.invoke();
		
		// Action后处理
		// 返回值
		return null;
	}
	
}

1.1.2 方式二:继承AbstractInterceptor

  • 空实现了init()destroy(),可只实现intercept()方法
package a_interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

// 方式二:继承AbstractInterceptor类
public class MyInterceptor2 extends AbstractInterceptor {

	@Override
	// 核心拦截方法
	public String intercept(ActionInvocation invocation) throws Exception {
		// Action前处理
		System.out.println("MyInterceptor1");
		
		// 放行 - 下一个拦截器
		invocation.invoke();
		
		// Action后处理
		// 返回值
		return null;
	}
	
}

1.1.3 方式三!:继承MethodFilterInterceptor

  • 定制拦截器的拦截的方法
  • 定制哪些方法需要拦截
  • 定制哪些方法不需要拦截
package a_interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

// 方式三:继承MethodFilterInterceptor类
public class MyInterceptor3 extends MethodFilterInterceptor {

	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		System.out.println("前处理");
		// 放行
		//invocation.invoke();
		
		System.out.println("后处理");
		// 放行后,返回值无效
		// 如果不放行,返回值取代的就是Action中的返回值,指定结果
//		return "error";
		return invocation.invoke();
	}
}

1.2 Action类

1.2.1 Demo1Action

package a_interceptor;

import com.opensymphony.xwork2.ActionSupport;

public class Demo1Action extends ActionSupport {
	public String add() {
		System.out.println("add");
		return SUCCESS;
	}
	public String delete() {
		System.out.println("delete");
		return SUCCESS;
	}
	public String update() {
		System.out.println("update");
		return SUCCESS;
	}
	public String find() {
		System.out.println("find");
		return SUCCESS;
	}
}

1.2.2 Demo2Action

package a_interceptor;

import com.opensymphony.xwork2.ActionSupport;

public class Demo2Action extends ActionSupport {
	public String add() {
		System.out.println("Demo2Action add");
		return SUCCESS;
	}
	public String delete() {
		System.out.println("Demo2Action delete");
		return SUCCESS;
	}
	public String update() {
		System.out.println("Demo2Action update");
		return SUCCESS;
	}
	public String find() {
		System.out.println("Demo2Action find");
		return SUCCESS;
	}
}

1.2.3 配置文件(重要!拦截器相关注册、指定方法拦截)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<!-- 开发模式:热加载
		 struts.devMode = false -->
	<constant name="struts.devMode" value="true"></constant>
	
	
	<package name="interceptor" namespace="/" extends="struts-default">
		<!-- 1.注册拦截器 -->
		<interceptors>
			<interceptor name="inter1" class="a_interceptor.MyInterceptor3">
				<!-- 哪些方法拦截 -->	
				<param name="includeMethods">add,delete</param>
				<!-- 排除哪些方法,不进行拦截 -->
				<!-- <param name="excludeMethods">update,find</param> -->
			</interceptor>
			<!-- 2.注册拦截器栈 -->
			<interceptor-stack name="myStack">
				<!-- 自定义的拦截器,建议放在默认的20个拦截器之前 -->
				<interceptor-ref name="inter1"></interceptor-ref>
				<!-- 引入默认的20个拦截器 -->
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		
		<!-- 3.指定拦截器栈 -->
		<!-- 给当前包中所有的Action指定默认的拦截器栈 -->
		<default-interceptor-ref name="defaultStack"></default-interceptor-ref>
		
		<action name="Demo1Action_*" class="a_interceptor.Demo1Action" method="{1}">
			<!-- 给Action单独指定拦截器栈 -->
			<interceptor-ref name="myStack"></interceptor-ref>
			<result name="success">/success.jsp</result>
			<result name="error">/form.jsp</result>
		</action>
        
		<action name="Demo2Action_*" class="a_interceptor.Demo2Action" method="{1}">
			<result name="success">/success.jsp</result>
		</action>
	</package>
	<package name="tag" namespace="/" extends="struts-default">
		<action name="tag" class="b_tag.TagAction">
			<result>/tag1.jsp</result>
		</action>
	</package>
	
	
</struts>