servlets - Tomcat 8 webapp, dynamically add PostResources -
i have webapp uses listener dynamically add servlet instances. each servlet instance defined user-defined configuration files, , encapsulates distinct dataset. each of these datasets may include user-defined static web files (html, jpg, css etc). static resources each servlet instance stored outside webapp folder (to avoid deletion on redeployment), , each servlet instance has separate folder hierarchy.
in listener contextinitialized method, using javax.servlet.servletcontext.addservlet add each of servlet instances, , javax.servlet.servletregistration.dynamic.addmapping add url mapping servlet.
i add other mappings static content in external folders. in tomcat 7, extended org.apache.catalina.servlets.defaultservlet change relativepath new document root, class not work in tomcat 8 0 - classnotfoundexception (org.apache.naming.resources.filedircontext).
tomcat 8 has new 'resources' framework should make more straightforward.
my question - how can add postresources element context dynamically (at web app startup, inside listener), without editing web.xml?
in listener, should able this:
webresourceroot root = new standardroot(context); root.createwebresourceset(webresourceroot.resourcesettype.post, "/my/url", "my/filesystem/path", null, "/");
but cannot figure out how required context (org.apache.catalina.context), different type named javax.servlet.servletcontext provided servletcontextevent in listener contextinitialized method.
any suggestions? thanks.
i think have figured out using mbeanserver. seems bit of roundabout method though - there no way of getting standardroot or standardcontext object servletcontext?
import javax.management.mbeanserver; import javax.management.mbeanserverfactory; import javax.management.objectname; import javax.servlet.servletcontext; import org.apache.catalina.core.standardcontext; import org.apache.catalina.core.standardengine; import org.apache.catalina.container; import org.apache.catalina.server; import org.apache.catalina.service; import org.apache.catalina.webresourceroot; ... private void addpostresources(servletcontext servletcontext) throws exception /* debugging */ { mbeanserver mbs = mbeanserverfactory.findmbeanserver(null).get(0); objectname name = new objectname("catalina","type","server"); server server = (server)mbs.getattribute(name, "managedresource"); service service = server.findservice("catalina"); standardengine engine = service.getcontainer(); container hostcontainer = engine.findchild(engine.getdefaulthost()); standardcontext standardcontext = (standardcontext)hostcontainer.findchild(servletcontext.getcontextpath()); webresourceroot root = standardcontext.getresources(); root.createwebresourceset(webresourceroot.resourcesettype.post, "/my/url", "my/filesystem/path", null, "/"); }
Comments
Post a Comment