动态网页设计网站建设/sem是什么方法
昨天的blog中提到,实现WebApplicationinitializer的类都可以在web应用程序启动时被加载。
这个是通过SpringServletContainerIntializer实现ServletContainerIntializer才能实现的。
我自己建了一个项目用来实现这种方式:
首先建个WebApplicationInitializer.java
package com.boventech.config;import javax.servlet.ServletContext;
import javax.servlet.ServletException;/*** WebApplicationInitializer接口* @author hu.sun*/public interface WebApplicationInitializer{public void config(ServletContext context) throws ServletException;}
继续,由于必须通过SpringServletContailnerIntializer才能加载,再建个SpringServletContailnerIntializer类:
package com.boventech.config;import java.lang.reflect.Modifier;
import java.util.Set;import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.HandlesTypes;@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer{@Overridepublic void onStartup(Set<Class<?>> webApplicationInitializers, ServletContext servletContext)throws ServletException {if (webApplicationInitializers != null) {for (Class<?> webApplicationInitializerClass : webApplicationInitializers) {if (!webApplicationInitializerClass.isInterface() && !Modifier.isAbstract(webApplicationInitializerClass.getModifiers()) &&WebApplicationInitializer.class.isAssignableFrom(webApplicationInitializerClass)) {try {((WebApplicationInitializer) webApplicationInitializerClass.newInstance()).config(servletContext);}catch (Throwable ex) {throw new ServletException("Failed to instantiate webApplicationInitializer class", ex);}}}}}
}
注意:
要实现ServletContainerInitializer接口,必须指定实现的类。@HandlesTypes就起到关键性作用。
还有一个最重要的:就是昨天提到的,在Libraries->Spring -web-x.x.x.jar->META-INF/services/javax.servlet.ServletContainerInitializer里面的内容必须是实现ServletContainerInitializer的类。想要的是com.boventech.config.SpringServletContainerInitializer。所以建个jar包,结构和这个一样META-INF/services/javax.servlet.ServletContainerInitializer,内容变了,实现类的路径。
然后就可以运行了。
package com.boventech.config;import javax.servlet.ServletContext;
import javax.servlet.ServletException;import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.util.WebAppRootListener;public class DefaultServletConfig implements WebApplicationInitializer{@Overridepublic void config(ServletContext servletContext) throws ServletException{servletContext.addListener(new ContextLoaderListener());servletContext.addListener(new WebAppRootListener());servletContext.setInitParameter("contextConfigLocation", "classpath*:**/*Context.xml");//设置webAppRootKey得值以得到根目录servletContext.setInitParameter("webAppRootKey", "learning");}
}
通过建这样一个项目我明白了 servlet的contextLoadListener和WebAppRootListener的原理。
WebApplicationinitializer工作原理。