首页 新闻 会员 周边

java struts 函数自动执行。

0
悬赏园豆:10 [待解决问题]

最近在看Struts的源码,看到filterDispatcher的doFilter方法会自动执行,我找到这个是实现自servlet的Filter接口,我的问题是doFilter的方法为什么会自动执行,是因为覆写了代码后,就会自动执行吗?还比如action类继承了Action接口后就会自动执行excute方法,为什么回自动执行呢?

都督的主页 都督 | 初学一级 | 园豆:192
提问于:2012-11-09 15:28
< >
分享
所有回答(4)
0

这就是接口的意义啊,你提供给它实现了什么类型的接口对象,调用者就知道去调用实现接口的方法。

向往-SONG | 园豆:4853 (老鸟四级) | 2012-11-09 15:53

但是我自己在本地实验发现我已经实现了接口的代码,但是子类也没有自动执行父类的方法啊。

支持(0) 反对(0) 都督 | 园豆:192 (初学一级) | 2012-11-09 15:58

@都督: 

子类也没有自动执行父类的方法? 代码怎么写的,怎么配置的?

支持(0) 反对(0) 向往-SONG | 园豆:4853 (老鸟四级) | 2012-11-09 16:04

@向往-SONG: 


public abstract interface Father {
    public abstract void init();

    public abstract void doFilter();

    public abstract void destroy();
}

子类

package com.duqiao;

public class Son implements Father{
    private String dien ;
    
    public Son(String dien){
        this.dien = dien;
    }

    public void destroy() {
        System.out.println("destroy");
        
    }

    public void doFilter() {
        System.out.println("doFilter--"+dien);
        
    }

    public void init() {
        System.out.println("init");
        
    }

    public String getDien() {
        return dien;
    }

    public void setDien(String dien) {
        this.dien = dien;
    }
    public static void main(String[] args)  {
        Son s = new Son("123");
//        s.doFilter();
    }
    
}

这个还需要配置,怎么配置的呢

支持(0) 反对(0) 都督 | 园豆:192 (初学一级) | 2012-11-09 16:09

@都督: 

--! 我以为你是写Struts Filter类,不是实现接口它就会自动执行接口方法啊。

会执行那是别的代码调用了接口方法。

如:

public void Test(Father f){

   f.doFilter();

}

Son s = new Son("123");

Test(s);

此时doFilter就会自动执行(你所谓的自动执行其实是别的代码调用了接口的方法)。

支持(0) 反对(0) 向往-SONG | 园豆:4853 (老鸟四级) | 2012-11-09 16:16

@向往-SONG: 还的仔细问你一下,这个是
是struts2的源码 这个接口Filter的代码

public abstract interface Filter
{
  public abstract void init(FilterConfig paramFilterConfig)
    throws ServletException;

  public abstract void doFilter(ServletRequest paramServletRequest, ServletResponse paramServletResponse, FilterChain paramFilterChain)
    throws IOException, ServletException;

  public abstract void destroy();
}

这个是实现了接口的FilterDispatcher的

public class FilterDispatcher
  implements StrutsStatics, Filter
{
  private static final Log LOG = LogFactory.getLog(FilterDispatcher.class);
  private String[] pathPrefixes;
  private final Calendar lastModifiedCal = Calendar.getInstance();
  private static boolean serveStatic;
  private static boolean serveStaticBrowserCache;
  private static String encoding;
  private static ActionMapper actionMapper;
  private FilterConfig filterConfig;
  protected Dispatcher dispatcher;

  public void init(FilterConfig filterConfig)
    throws ServletException
  {
    this.filterConfig = filterConfig;

    this.dispatcher = createDispatcher(filterConfig);
    this.dispatcher.init();

    String param = filterConfig.getInitParameter("packages");
    String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging";
    if (param != null) {
      packages = param + " " + packages;
    }
    this.pathPrefixes = parse(packages);
  }

  public void destroy()
  {
    if (this.dispatcher == null)
      LOG.warn("something is seriously wrong, Dispatcher is not initialized (null) ");
    else
      this.dispatcher.cleanup();
  }

这里的方法init和destroy 都没有别的代码调用啊(还是我没有看到)还请详细解释一下。不胜感激。

支持(0) 反对(0) 都督 | 园豆:192 (初学一级) | 2012-11-09 16:31

@都督: 

你配置了FilerDispatcher相当于在web.xml里配置了servlet的Filter。都是由容器来调用的,你只要提供实现接口的类就行了。通过你的配置创建FilerDispatcher对象,并转换为Filter的接口类型,它就能调用实现类的方法了,类似:

Filter filter=(Filter)getInstance(配置...);

filter.doFilter();

支持(0) 反对(0) 向往-SONG | 园豆:4853 (老鸟四级) | 2012-11-09 16:43

@向往-SONG: 

但是有的类我也没有配置啊,但是实现了Filter接口之后,他也自动执行了这个方法,这又怎么解释呢,比如public class ActionContextCleanUp
  implements Filter

支持(0) 反对(0) 都督 | 园豆:192 (初学一级) | 2012-11-09 17:03

@都督: 

那就是Struts自动查找你项目里所有实现了Filter接口的类调用的,总之是有个调用者找到对应接口的实现类去调用。

支持(0) 反对(0) 向往-SONG | 园豆:4853 (老鸟四级) | 2012-11-09 17:12

@向往-SONG: 可能是我太钻牛角尖了不过还是感谢你这么长时间,耐心地回答。谢谢。

支持(0) 反对(0) 都督 | 园豆:192 (初学一级) | 2012-11-09 17:17
0

第一句话喜欢,特熟悉,因为我最近也在看struts源码。这就是容器的强大之处。你理解了容器的概念,你就会懂的。那个Filter是配置在web.xml文件中的,启动Tomcat或别的服务器的时候,程序会读那个文件,然后就调用那个接口中的方法。也算是反射机制的一种运用。

angelshelter | 园豆:9887 (大侠五级) | 2012-11-09 16:09

你说的容器是servlet容器吗,我知道FilerDispatcher是配置到web.xml,filter是配置到那里了吗,我不知道这个是怎没配置的,程序读取了web.xml文件,他自动执行了从Filter接口中实现的三个方法,我就是想知道他为什么会自动执行,反射也要实现代码吧,还请详细解释一下。谢谢。

支持(0) 反对(0) 都督 | 园豆:192 (初学一级) | 2012-11-09 16:25

@都督: 其实上面那家伙已经回答很详细了,我没必要再补充了。

支持(0) 反对(0) angelshelter | 园豆:9887 (大侠五级) | 2012-11-09 17:30
0

都是回调操作。什么叫自动调用,汗。

爱吃皮皮虾 | 园豆:54 (初学一级) | 2012-11-22 14:51
0

方法是不会自动执行的,如果要执行肯定是被调用了。不知道你有没有自定义过过滤器,比如解决乱码的过滤器或者控制权限的过滤器,那样对你理解过滤器的工作原理应该会有些帮助

cel | 园豆:380 (菜鸟二级) | 2013-05-09 23:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册