Jetty - 在整合Spring的J2SE應用程式中嵌入Jetty的Web功能(應用和Web共用ApplicationContext)
一、說明
如果開發了一個J2SE的應用程式,然後想用Web來完成一些的使用者介面,但是在啟動 Jetty 之前就已經建立和使用了 Spring 的 ApplicationContext了,但這些Web的業務中也要依賴於 Spring 的 ApplicationContext,這樣就會遇到一個問題:應用程式啟動後會建立一個 context,當Jetty啟動後又會建立一個 context,兩個不同的上下文將會產生重複載入和一些互動的問題。那麼能不能讓 Jetty 不建立新的 ApplicationContext,而直接共享使用之前應用程式所建立的呢?
二、建立Jetty啟動類
package com.xilen.util.spring;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.webapp.WebAppContext;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.XmlWebApplicationContext;
/**
* Jetty的啟動類
* 實現 ApplicationContextAware,讓 Spring 傳入它的 ApplicationContext 並使用這個 Context
*/
public class SpringJettyStart implements ApplicationContextAware {
private Server server;
private ApplicationContext applicationContext;
public void start() throws Exception {
// 建立並設定 Server 的引數
server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(8080);
server.addConnector(connector);
// 建立並設定 WebAppContext 的引數
WebAppContext webAppContext = new WebAppContext();
webAppContext.setContextPath("/app");
webAppContext.setDescriptor("webapps/app/WEB-INF/web.xml");
webAppContext.setResourceBase("webapps/app");
webAppContext.setConfigurationDiscovered(true);
webAppContext.setParentLoaderPriority(true);
server.setHandler(webAppContext);
// 讓 WebApp 使用跟 ApplicationContext 同一個 ClassLoader
webAppContext.setClassLoader(applicationContext.getClassLoader());
// 自己建立 XmlWebApplicationContext
XmlWebApplicationContext xmlWebAppContext = new XmlWebApplicationContext();
xmlWebAppContext.setParent(applicationContext);
xmlWebAppContext.setConfigLocation("");
xmlWebAppContext.setServletContext(webAppContext.getServletContext());
xmlWebAppContext.refresh();
// 把建立的 XmlWebApplicationContext 傳入 WebAppContext 的 attribute 集合
webAppContext.setAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, xmlWebAppContext);
server.start();
}
/**
* 實現 ApplicationContextAware 介面,以讓 spring 把 application context 設定進來
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
}
三、配置 Jetty 的啟動類到應用程式的 ApplicationContext 並執行它<bean id="springJettyStart" class="com.xilen.util.spring.SpringJettyStart" init-method="start" />
四、配置web.xml 1、此時,將不再需要配置如下Spring相關的ContextLoaderListener和contextConfigLocation了
<del><context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener></del>
2、只需直接新增需要的Struts或Restlet等等 <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
或 <servlet>
<servlet-name>restlet</servlet-name>
<servlet-class>com.ericsson.smsc.correlation.restlet.eagle.EagleSpringServerServlet</servlet-class>
<init-param>
<param-name>org.restlet.application</param-name>
<param-value>application</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>restlet</servlet-name>
<url-pattern>/restlet/*</url-pattern>
</servlet-mapping>
五、正常的啟動應用程式即可啟動這個和應用程式共用 ApplicationContext 的 Web 了。例如
public static void main(String[] args){
AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
applicationContext.registerShutdownHook();
}
六、參考 http://hippostart.iteye.com/blog/664972
相關文章
- 【譯】用maven使java web應用執行在內嵌的Jetty或TomMavenJavaWebJetty
- 用Spring Web Flow和Terracotta搭建Web應用SpringWeb
- BurpSuite在非Web應用測試中的應用UIWeb
- MVC模式在Java Web應用程式中的實現MVC模式JavaWeb
- 五、Spring Web應用程式構建SpringWeb
- WEB應用是如何運用Spring的?#①Spring的IOC容器如何在WEB中建立?WebSpring
- 自開發Web應用和SAPCustomerDataCloudIdentity服務的整合WebCloudIDE
- SpringBoot中的響應式web應用Spring BootWeb
- jetty啟動web專案原始碼分析JettyWeb原始碼
- 嵌入式狗的JAVA之路 web應用 1JavaWeb
- IoC在ASP.NET Web API中的應用ASP.NETWebAPI
- 使用Java和Spring MVC構建Web應用JavaSpringMVCWeb
- Web應用程式優化Web優化
- Redis在Web專案中的應用與實踐RedisWeb
- Redis 在 Web 專案中的應用與實踐RedisWeb
- web開發實戰教程:Apache Shiro在web專案中的應用WebApache
- 八、【spring】web應用安全設計SpringWeb
- 內容定址在 Web3 的應用Web
- JSON資料格式及其在WEB開發中的應用JSONWeb
- 使用Rust和WebAssembly構建Web應用程式RustWeb
- 剖析 SPI 在 Spring 中的應用Spring
- Maven Web 應用MavenWeb
- Spring Boot Web應用程式下載Excel檔案 - simplesolutionSpring BootWebExcel
- [譯] Rust 開發完整的 Web 應用程式RustWeb
- 漸進式Web應用程式的深入概述Web
- 如何提升 Web 應用的程式碼質量Web
- 盤點web應用程式中常見的漏洞!Web
- 什麼是 Web 應用程式的 synthetic monitorWeb
- tomcat中虛擬主機以及web應用程式的配置TomcatWeb
- Spring學習日記(二)Web應用SpringWeb
- union 的概念及在嵌入式程式設計中的應用程式設計
- 構建無縫整合的gRPC-Web和Istio的雲原生應用教程RPCWeb
- 淺談canvas在web開發中的應用與優化CanvasWeb優化
- Jenkins在Java web專案CI/CD中的簡單應用JenkinsJavaWeb
- 使用 Lambda Web Adapter 在 Lambda 上 構建 web 應用WebAPT
- Spring Boot 應用程式中的 QueryDSLSpring Boot
- Spring系列(六) Spring Web MVC 應用構建分析SpringWebMVC
- 自開發Web應用和SAP Customer Data Cloud Identity服務的整合WebCloudIDE