0 回顾
0.1 OgnlContext
OgnlContext
Root
:对象Context
:Map
0.2 Strut2与Ognl的结合
ValueStack
Root
:栈。栈顶:xxAction- 取值:
属性名
- 取值:
ActionContext
:Map
#key.属性名
转发中值的传递
Action1 redirect Action2
<param name="参数名">${属性名}</param>
0.3 Struts2运行流程
进入核心过滤器
- 准备
ValueStack
- 准备
ActionContext
包装
request
对象 -getAttribute(key)
取值
- 从
request
域中 - 从
ValueStack
的Root
中取值 - 从
ActionContext
中
- 从
- 准备
执行20个拦截器,
Interceptor
- 递归方法
- 执行
Action
,得到resultCode
执行结果处理。4种
dispatcher
redirect
chain
redirectAction
- JSP显示
0.4 文件上传
表单设置
enctype="multipart/form-data"
method="post"
- 前端
<input type="file" name="file">
Action
提供File
类型file
属性- 提供
fileFileName
属性,接收文件名 - 提供
fileContentType
属性,接收文件类 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>