All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.anysoft.webloader.WebAppMain Maven / Gradle / Ivy

There is a newer version: 1.6.17
Show newest version
package com.anysoft.webloader;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.anysoft.util.Factory;
import com.anysoft.util.IOTools;
import com.anysoft.util.Properties;
import com.anysoft.util.Settings;
import com.anysoft.util.XmlTools;
import com.anysoft.util.resource.ResourceFactory;

/**
 * WebApp主入口
 * 
 * 

用于替代WebAppContextListener,在WebAppContextListener的基础上增加下列功能:
* - 可加载附加的ServletContextListener
* - 可加载附加的Servlet
* * @author duanyy * * @since 1.6.0.1
* @version 1.6.4.17 [20151216 duanyy]
* - 根据sonar建议优化代码
* * @version 1.6.4.24 [20150115 duanyy]
* - 增加对SessionListener的支持
*/ public class WebAppMain extends WebAppContextListener implements HttpSessionListener{ protected List listeners = null; protected List sessionListeners = null; @Override public void contextDestroyed(ServletContextEvent e) { super.contextDestroyed(e); //销毁所创建的ServletContextListener if (listeners != null){ for (ServletContextListener l:listeners){ if (l != null){ l.contextDestroyed(e); } } } } @Override public void contextInitialized(ServletContextEvent e) { super.contextInitialized(e); Settings settings = Settings.get(); String addons = settings.GetValue("webcontext.addons", ""); if (addons != null && addons.length() > 0){ logger.info("Load addons..."); ResourceFactory rm = Settings.getResourceFactory(); InputStream in = null; try { in = rm.load(addons, null); Document doc = XmlTools.loadFromInputStream(in); if (doc != null){ //装入context-param loadContextParams(settings,doc.getDocumentElement(),e.getServletContext()); //装入listener loadContextListeners(settings,doc.getDocumentElement(),e); //装入SessionListener loadSessionListeners(settings,doc.getDocumentElement()); //在装入其他 WebXMLLoader loader = createXMLLoader(settings); if (loader != null){ // NOSONAR loader.load(settings,doc.getDocumentElement(), e.getServletContext()); } } }catch (Exception ex){ logger.error("Error occurs when load xml file,source=" + addons, ex); }finally { IOTools.closeStream(in); } } } protected void loadSessionListeners(Settings settings,Element root) { NodeList nodeList = XmlTools.getNodeListByPath(root, "session"); if (nodeList != null && nodeList.getLength() > 0){ sessionListeners = new ArrayList(); for (int i = 0 ;i < nodeList.getLength() ; i ++){ Node n = nodeList.item(i); if (n.getNodeType() != Node.ELEMENT_NODE){ continue; } Element e = (Element)n; String clazz = e.getAttribute("listener-class"); if (clazz == null || clazz.length() <= 0){ continue; } Factory factory = new Factory(); try { HttpSessionListener _listener = factory.newInstance(clazz); if (_listener != null){ logger.info("Session listener is found,module=" + clazz); sessionListeners.add(_listener); } }catch (Exception ex){ logger.error("Can not create context listener,module=" + clazz,ex); } } } } /** * 装入ContextListener,可支持多个ContextListener * * @param settings * @param root * @param event */ protected void loadContextListeners(Properties settings,Element root,ServletContextEvent event) { NodeList nodeList = XmlTools.getNodeListByPath(root, "listener"); if (nodeList != null && nodeList.getLength() > 0){ listeners = new ArrayList(nodeList.getLength()); for (int i = 0 ;i < nodeList.getLength() ; i ++){ Node n = nodeList.item(i); if (n.getNodeType() != Node.ELEMENT_NODE){ continue; } Element e = (Element)n; String clazz = e.getAttribute("listener-class"); if (clazz == null || clazz.length() <= 0){ continue; } Factory factory = new Factory(); try { ServletContextListener listner = factory.newInstance(clazz); if (listner != null){ logger.info("Init context listener,module=" + clazz); listner.contextInitialized(event); listeners.add(listner); } }catch (Exception ex){ logger.error("Can not create context listener,module=" + clazz,ex); } } } } /** * 创建WebXMLLoader实例 * *

通过环境变量webcontext.xmlloader指定的类名来创建WebXMLLoader实例。缺省为DefaultWebXMLLoader。 * 如果无法创建成功,返回空。 * * @param settings * @return WebXMLLoader实例 */ protected WebXMLLoader createXMLLoader(Properties settings){ String loader = settings.GetValue("webcontext.xmlloader",DefaultWebXMLLoader.class.getName()); WebXMLLoader.TheFactory factory = new WebXMLLoader.TheFactory(); try{ return factory.newInstance(loader, settings); }catch (Exception ex){ logger.error("Can not create a webxml loader.",ex); return null; } } /** * 装入context-param信息 * * @param settings * @param root * @param sc */ protected void loadContextParams(Properties settings,Element root, ServletContext sc) { NodeList params = XmlTools.getNodeListByPath(root, "context-param"); if (params != null && params.getLength() > 0){ for (int i = 0 ; i < params.getLength() ; i ++){ Node n = params.item(i); if (n.getNodeType() != Node.ELEMENT_NODE){ continue; } Element e = (Element)n; String name = e.getAttribute("param-name"); String pattern = e.getAttribute("param-value"); if (name != null && pattern != null && name.length() > 0 && pattern.length() > 0){ String value = settings.transform(pattern); logger.info("Init parameter:" + name + "=" + value); sc.setInitParameter(name, value); } } } } @Override public void sessionCreated(HttpSessionEvent se) { if (sessionListeners != null){ for (HttpSessionListener l:sessionListeners){ if (l != null){ l.sessionCreated(se); } } } } @Override public void sessionDestroyed(HttpSessionEvent se) { if (sessionListeners != null){ for (HttpSessionListener l:sessionListeners){ if (l != null){ l.sessionDestroyed(se); } } } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy