0 回顾
0.1 OgnlContext
0.2 Strut2与Ognl的结合
ValueStack
Root
:栈。栈顶:xxAction
ActionContext
:Map
- 转发中值的传递
- 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;
public class MyInterceptor1 implements Interceptor {
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("MyInterceptor1");
invocation.invoke();
return null;
}
}
1.1.2 方式二:继承AbstractInterceptor
- 空实现了
init()
和destroy()
,可只实现intercept()
方法
package a_interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor2 extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("MyInterceptor1");
invocation.invoke();
return null;
}
}
1.1.3 方式三!:继承MethodFilterInterceptor
package a_interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MyInterceptor3 extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("前处理");
System.out.println("后处理");
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>
<constant name="struts.devMode" value="true"></constant>
<package name="interceptor" namespace="/" extends="struts-default">
<interceptors>
<interceptor name="inter1" class="a_interceptor.MyInterceptor3">
<param name="includeMethods">add,delete</param>
</interceptor>
<interceptor-stack name="myStack">
<interceptor-ref name="inter1"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="defaultStack"></default-interceptor-ref>
<action name="Demo1Action_*" class="a_interceptor.Demo1Action" method="{1}">
<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>