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
  2. 执行20个拦截器,Interceptor

    • 递归方法
  3. 执行Action,得到resultCode
  4. 执行结果处理。4种

    1. dispatcher
    2. redirect
    3. chain
    4. redirectAction
  5. JSP显示

0.4 文件上传

  1. 表单设置

    1. enctype="multipart/form-data"
    2. method="post"
  2. 前端 <input type="file" name="file">
  3. Action提供File 类型 file属性
  4. 提供 fileFileName 属性,接收文件名
  5. 提供 fileContentType 属性,接收文件类
  6. 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>
Last modification:September 5th, 2019 at 08:20 pm