网站首页详细设计东莞网站建设网站建立
网站首页详细设计,东莞网站建设网站建立,衡水网站公司,手机阅读网站开发原因现在JavaConfig配置方式在逐步取代xml配置方式。而WebApplicationInitializer可以看做是Web.xml的替代#xff0c;它是一个接口。通过实现WebApplicationInitializer#xff0c;在其中可以添加servlet#xff0c;listener等#xff0c;在加载Web项目的时候会加载这个接口实…现在JavaConfig配置方式在逐步取代xml配置方式。而WebApplicationInitializer可以看做是Web.xml的替代它是一个接口。通过实现WebApplicationInitializer在其中可以添加servletlistener等在加载Web项目的时候会加载这个接口实现类从而起到web.xml相同的作用。下面就看一下这个接口的详细内容。 首先打开这个接口如下 public interface WebApplicationInitializer {void onStartup(ServletContext var1) throws ServletException;
} 只有一个方法看不出什么头绪。但是在这个包下有另外一个类SpringServletContainerInitializer。它的实现如下 package org.springframework.web;import java.lang.reflect.Modifier;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.HandlesTypes;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;HandlesTypes({WebApplicationInitializer.class})
public class SpringServletContainerInitializer implements ServletContainerInitializer {public SpringServletContainerInitializer() {}public void onStartup(SetClass? webAppInitializerClasses, ServletContext servletContext) throws ServletException {ListWebApplicationInitializer initializers new LinkedList();Iterator var4;if(webAppInitializerClasses ! null) {var4 webAppInitializerClasses.iterator();while(var4.hasNext()) {Class? waiClass (Class)var4.next();if(!waiClass.isInterface() !Modifier.isAbstract(waiClass.getModifiers()) WebApplicationInitializer.class.isAssignableFrom(waiClass)) {try {initializers.add((WebApplicationInitializer)waiClass.newInstance());} catch (Throwable var7) {throw new ServletException(Failed to instantiate WebApplicationInitializer class, var7);}}}}if(initializers.isEmpty()) {servletContext.log(No Spring WebApplicationInitializer types detected on classpath);} else {servletContext.log(initializers.size() Spring WebApplicationInitializers detected on classpath);AnnotationAwareOrderComparator.sort(initializers);var4 initializers.iterator();while(var4.hasNext()) {WebApplicationInitializer initializer (WebApplicationInitializer)var4.next();initializer.onStartup(servletContext);}}}
} 这个类就比较有意思了先不管其他的读一下这段代码可以得到这样的意思。 先判断webAppInitializerClasses这个Set是否为空。如果不为空的话找到这个set中不是接口不是抽象类并且是 WebApplicationInitializer接口实现类的类将它们保存到list中。当这个list为空的时候抛出异常。不为空的话就按照一定的顺序排序并将它们按照一定的顺序实例化。调用其onStartup方法执行。到这里就可以解释WebApplicationInitializer实现类的工作过程了。但是在web项目运行的时候SpringServletContainerInitializer这个类又是怎样被调用的呢。 它只有一个接口ServletContainerInitializer通过它就可以解释SpringServletContainerInitializer是如何被调用的。它的内容如下 package javax.servlet;import java.util.Set;public interface ServletContainerInitializer {void onStartup(SetClass? var1, ServletContext var2) throws ServletException;
} 首先这个接口是javax.servlet下的。官方的解释是这样的为了支持可以不使用web.xml。提供了ServletContainerInitializer它可以通过SPI机制当启动web容器的时候会自动到添加的相应jar包下找到META-INF/services下以ServletContainerInitializer的全路径名称命名的文件它的内容为ServletContainerInitializer实现类的全路径将它们实例化。既然这样的话那么SpringServletContainerInitializer作为ServletContainerInitializer的实现类它的jar包下也应该有相应的文件。打开查看如下 哈现在就可以解释清楚了。首先SpringServletContainerInitializer作为ServletContainerInitializer的实现类通过SPI机制在web容器加载的时候会自动的被调用。这个类上还有一个注解HandlesTypes它的作用是将感兴趣的一些类注入到ServletContainerInitializerde 而这个类的方法又会扫描找到WebApplicationInitializer的实现类调用它的onStartup方法从而起到启动web.xml相同的作用。 然后我们自己通过一个实例来实现相同的功能通过一样的方式来访问一个servlet。 1、定义接口WebParameter它就相当于WebApplicationInitializer。内容如下 public interface WebParameter {void loadOnstarp(ServletContext servletContext);
} 可以在这里面添加servletlistener等。 2、定义Servlet。 public class MyServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write(TestSetvlet);}
} 3、定义MyWebParameter作为WebParameter的实现类将Servlet添加到上下文并设置好映射。 public class MyWebParameter implements WebParameter {public void loadOnstarp(ServletContext servletContext) {ServletRegistration.Dynamic testSetveltservletContext.addServlet(test,com.test.servlet.MyServlet);testSetvelt.setLoadOnStartup(1);testSetvelt.addMapping(/test);}
} 当然也可以把第2步和第3步合在一起 public class MyServlet extends HttpServlet implements WebParameter {Overridepublic void loadOnstarp(ServletContext servletContext) {ServletRegistration.Dynamic testSetveltservletContext.addServlet(test,com.test.servlet.MyServlet);testSetvelt.setLoadOnStartup(1);testSetvelt.addMapping(/test);}Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write(TestSetvlet);}
} 而且以后可以将Spring的applicationContext.xml与web.xml融合在一个类中。即注解为Configuration,并实现WebApplicationInitializer。 4、定义好WebConfig作为ServletContainerInitializer的实现类它的作用是扫描找到WebParameter的实现类并调用其方法。 HandlesTypes({WebParameter.class})
public class WebConfig implements ServletContainerInitializer {public void onStartup(SetClass? set, ServletContext servletContext) throws ServletException {Iterator var4;if (set!null){var4set.iterator();while(var4.hasNext()){Class? clazz (Class?) var4.next();if (!clazz.isInterface() !Modifier.isAbstract(clazz.getModifiers())WebParameter.class.isAssignableFrom(clazz)){try {((WebParameter) clazz.newInstance()).loadOnstarp(servletContext);}catch (Exception e){e.printStackTrace();}}}}}
} 5、根据SPI机制定义一个META-INF/services文件夹并在其下定义相关文件名称并将WebConfig的类全名称填入其中。 6、最终结果 本文转自https://blog.csdn.net/zq17865815296/article/details/79464403转载于:https://www.cnblogs.com/nizuimeiabc1/p/11031150.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91445.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!