Struts学习笔记_拦截器

1.Struts架构图

 

2.Struts执行过程分析

3.Interceptor拦截器过程模拟

//main.java
public class Main {
    public static void main(String[] args) {
        new ActionInvocation().invoke();
    }
}

 

//ActionInvocation .java
public class ActionInvocation {
    List<Interceptor> interceptors = new ArrayList<Interceptor>();
    int index = -1;
    Action a = new Action();
    
    public ActionInvocation() {
        this.interceptors.add(new FirstInterceptor());
        this.interceptors.add(new SecondInterceptor());
        
    }
    
    public void invoke() {
        index ++;
        if(index >= this.interceptors.size()) {
            a.execute();
        }else {
            
            this.interceptors.get(index).intercept(this);
        }
    }
}

 

//FirstInterceptor .java
public class FirstInterceptor implements Interceptor {

    public void intercept(ActionInvocation invocation) {
        System.out.println(1);
        invocation.invoke();
        System.out.println(-1);
    }

}

 

//SecondInterceptor .java
public class SecondInterceptor implements Interceptor {

    public void intercept(ActionInvocation invocation) {
        System.out.println(2);
        invocation.invoke();
        System.out.println(-2);
    }

}

 

//Interceptor .java
public interface Interceptor {
    public void intercept(ActionInvocation invocation) ;
}

 

//Action .java
public class Action {
    public void execute() {
        System.out.println("execute!");
    }
}

 

4.定义自己的拦截器(不常用)

//MyInterceptor .java
public class MyInterceptor implements Interceptor {

    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    public void init() {
        // TODO Auto-generated method stub
        
    }

    public String intercept(ActionInvocation invocation) throws Exception {
        long start = System.currentTimeMillis();
        String r = invocation.invoke();
        long end = System.currentTimeMillis();
        System.out.println("action time = " + (end - start));
        return r;
    }

}

 

<struts>


    <constant name="struts.devMode" value="true"></constant>
    <package name="test" namespace="/" extends="struts-default">
        <interceptors>
            <interceptor name="my" class="com.bjsxt.interceptor.MyInterceptor"></interceptor>
        </interceptors>


        <action name="test" class="com.bjsxt.action.TestAction">
            <result>/test.jsp</result>
            <interceptor-ref name="my"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>

    </package>


</struts>

 

5.使用token拦截器控制重复提交(很少用)

 

6. 类型转换

   写自己的转换器:

//方法一
public
class MyPointConverter extends DefaultTypeConverter{ @Override public Object convertValue(Object value, Class toType) { if(toType == Point.class) { Point p = new Point(); String[] strs = (String[])value; String[] xy = strs[0].split(","); p.x = Integer.parseInt(xy[0]); p.y = Integer.parseInt(xy[1]); return p; } if(toType == String.class) { return value.toString(); } return super.convertValue(value, toType); } }

//方法二
public class MyPointConverter extends StrutsTypeConverter{



    @Override
    public Object convertFromString(Map context, String[] values, Class toClass) {
        
            Point p = new Point();
            String[] strs = (String[])values;
            String[] xy = strs[0].split(",");
            p.x = Integer.parseInt(xy[0]);
            p.y = Integer.parseInt(xy[1]);
            return p;
        
        
    }

    @Override
    public String convertToString(Map context, Object o) {
        // TODO Auto-generated method stub
        return o.toString();
    }

}

 

 

 三种注册方式:

      i.      局部:XXXAction-conversion.properties

    p(属性名称) =  converter

   ii.      全局:xwork-conversion.properties

    com.xxx.XXX(类名)= converter (java.awt.Point=com.bjsxt.converter.MyPointConverter)

   iii.      Annotation

 

  如果遇到非常麻烦的映射转换

  1.         i.      request.setAttribute();
  2.        ii.      session

 

posted @ 2014-11-26 20:17  enjoy_clh  阅读(152)  评论(0编辑  收藏  举报