`
wmuu
  • 浏览: 9583 次
  • 性别: Icon_minigender_1
  • 来自: 自己输入城市...
文章分类
社区版块
存档分类
最新评论

struts2配置文件struts.xml自动重加载(rabbit.struts2包)

    博客分类:
  • java
阅读更多

最近开始做点页面,于是用strtus2,发现每次改动struts.xml和action的时候都要重启应用,严重影响开发效率。

设置了

struts.i18n.reload = true
struts.configuration.xml.reload = true

struts.devMode = true

缺发现struts.configuration.xml.reload = true似乎总是不起作用。

怒了,于是随手写了2个简单的类。虽然还有很多功能可以补充进去,比如生产,开发模式的开关等一系列功能,将以后在持续添加。

 

希望目前简单的实现可以对碰到类似问题的人有所帮助。

java1.4

 

package rabbit.struts2.dispatcher;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * 
 * @author rabbit
 * 
 */
public class FilterDispatcherJava4 implements Filter {
	private volatile Filter filter;
	private FilterConfig filterConfig;
	private volatile long lastModified = -1;
	private ClassLoader classLoader;

	public void destroy() {
		synchronized (this) {
			if (filter != null) {
				filter.destroy();
			}
		}
	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		getFilter().doFilter(arg0, arg1, arg2);
	}

	public void init(FilterConfig arg0) throws ServletException {
		filterConfig = arg0;
		classLoader = this.getClass().getClassLoader();
	}

	private Filter getFilter() throws ServletException {
		URL url = classLoader.getResource("struts.xml");
		File f = null;
		try {
			f = new File(url.toURI());
		} catch (URISyntaxException e) {
			throw new RuntimeException(e);
		}
		synchronized (this) {
			long time = f.lastModified();
			if (lastModified == time) {
				return filter;
			}
			if (filter != null) {
				filter.destroy();
			}
			filter = new org.apache.struts2.dispatcher.FilterDispatcher();
			filter.init(filterConfig);
			lastModified = time;
			return filter;
		}
	}
}

 

 

 

java1.5

package rabbit.struts2.dispatcher;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * 
 * @author rabbit
 * 
 */
public class FilterDispatcherJava5 implements Filter {
	private volatile Filter filter;
	private FilterConfig filterConfig;
	private volatile long lastModified = -1;
	private ClassLoader classLoader;
	private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
	private Lock rl = rwl.readLock();
	private Lock wl = rwl.writeLock();

	public void destroy() {
		rl.lock();
		try {
			if (filter != null) {
				filter.destroy();
			}
		} finally {
			rl.unlock();
		}
	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		getFilter().doFilter(arg0, arg1, arg2);
	}

	public void init(FilterConfig arg0) throws ServletException {
		filterConfig = arg0;
		classLoader = this.getClass().getClassLoader();
	}

	private Filter getFilter() throws ServletException {
		URL url = classLoader.getResource("struts.xml");
		File f = null;
		try {
			f = new File(url.toURI());
		} catch (URISyntaxException e) {
			throw new RuntimeException(e);
		}
		rl.lock();
		try {
			if (lastModified == f.lastModified()) {
				return filter;
			}
		} finally {
			rl.unlock();
		}
		wl.lock();
		try {
			long time = f.lastModified();
			if (lastModified == time) {
				return filter;
			}
			if (filter != null) {
				filter.destroy();
			}
			filter = new org.apache.struts2.dispatcher.FilterDispatcher();
			filter.init(filterConfig);
			lastModified = time;
			return filter;
		} finally {
			wl.unlock();
		}
	}
}

 

web.xml部分将sturts的org.apache.struts2.dispatcher.FilterDispatcher简单替换为

	<filter>
		<filter-name>struts2</filter-name>
		<!--filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class-->
		<filter-class>rabbit.struts2.dispatcher.FilterDispatcherJava4</filter-class>
	</filter>

 

或者

	<filter>
		<filter-name>struts2</filter-name>
		<!--filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class-->
		<filter-class>rabbit.struts2.dispatcher.FilterDispatcherJava5</filter-class>
	</filter>

 

即可。

开发的时候可以是用rabbit.struts2的过滤器,发布生产版本改在该回原来的struts2过滤器。

3
1
分享到:
评论
1 楼 lotin_2001 2009-02-22  
这个问题也一直困扰本人,不过在基于O配置的情况下,使用convention插件,也是可以实现动态加载的。

相关推荐

    struts-2.3.14.3-lib.zip

    3. **配置文件**:Struts 2使用XML配置文件(通常为struts.xml)来定义Action类、结果类型、拦截器等。此外,可以使用注解方式简化配置。 4. **拦截器**:Struts 2的拦截器是实现AOP(面向切面编程)的关键,可以在...

    spring集成rabbitmq最初始的SSM项目信息

    博客通常会详细介绍如何配置SSM框架以集成RabbitMQ,包括XML配置、Java配置以及如何编写消息生产者和消费者的代码示例。这是一个很好的学习资源,可以帮助你理解每个步骤的实现原理。 通过这个项目,你可以深入理解...

    java开源包2

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包101

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包10

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包8

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包4

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    Java资源包01

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包1

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包11

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包3

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包6

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包5

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包7

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包9

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    zxl:本人的开源框架,其中包含了一系列的开源组件,xxoo已经正式更名为xmlbean-converter成为zxl框架的一部分

    提供配置化的bean映射工具 mapper-spring mapper与spring的整合 mq-rabbit 对于rabbitmq客户端的简单封装 mvc-common mvc框架的基础包 mvc-spring springmvc的简单封装 mvc-struts struts的简单封装 mvc-hbase 适于...

Global site tag (gtag.js) - Google Analytics