作为一个webapplication,如果没有WEB-INF目录和下面的web.xml,你的反应会是什么?如果是一个Struts2+ Spring的一个webapplication呢?
有的时候我们真的有这种需求,比如我要用一个jar包来发布一个功能简单的application,既有webservice又是RESTfull的,在希望它是一种很light的方式的同时又希望利用Struts+Spring来做,怎么办呢?
我们来看看一种甚至是web.xml都不需要的方式吧。
final ClassPathXmlApplicationContext originalContext = new ClassPathXmlApplicationContext("accountServiceContext.xml"); Object o = originalContext.getBean("accountService"); //publish accountservice as a webservice with XFire XFire xfire = XFireFactory.newInstance().getXFire(); ServiceFactory factory = new ObjectServiceFactory(xfire.getTransportManager(), null); Service service = factory.create(AccountService.class); service.setInvoker(new BeanInvoker(o)); xfire.getServiceRegistry().register(service); try { int port = Integer.parseInt(System.getProperty("port", "9999")); server = new Server(port); //build a webappContext without WEN-INF/web.xml WebAppContext webApp = new WebAppContext(); webApp.setContextPath("/"); webApp.setBaseResource(Resource.newClassPathResource("")); webApp.setConfigurations(new Configuration[0]); webApp.addFilter(RedirectFilter.class, "/*", 1); //org.apache.struts2.dispatcher.FilterDispatcher, let struts recongonize our actions webApp.addFilter(FilterDispatcher.class, "/*", 1).setInitParameter("actionPackages", "com.***.action"); webApp.addServlet(XFireServlet.class, "/*"); webApp.addEventListener(new ServletContextListener() { public void contextInitialized(ServletContextEvent sce) { //use spring context to build a webApplicationContext context = new WebApplicationContextWrapper(originalContext, sce.getServletContext()); //make spring work with servlet Container sce.getServletContext().setAttribute( WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context); } public void contextDestroyed(ServletContextEvent sce) { } }); server.addHandler(webApp); server.start(); } catch (Exception e) { ... }