原文出处:http://blog.chenlb.com/2012/05/embed-jetty-http-servlet-jsp.html
N年前写了一篇关于 jetty 的使用,主要是在项目套一个简单的 jetty,但从本质上讲不是嵌入使用 jetty。平常工作中用得到现在再记录一下。纠正我标题上没写得准确。
现在我以 maven 项目来示例。
1、加入依赖
- <dependencies>
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-webapp</artifactId>
- <version>7.6.3.v20120416</version>
- </dependency>
- <!-- support jsp -->
- <dependency>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-jsp-2.1</artifactId>
- <version>7.5.4.v20111024</version>
- </dependency>
- <dependency>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>jsp-2.1-glassfish</artifactId>
- <version>2.1.v20100127</version>
- </dependency>
- <!-- end jsp -->
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>1.6.1</version>
- </dependency>
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.16</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring</artifactId>
- <version>2.5.6</version>
- </dependency>
- </dependencies>
support jsp 的依赖不加也可以使用 servlet 和 filter。
2、Jetty Embed Server 核心类。
Server (服务器)、SelectChannelConnector(连接器)、ServletContextHandler(web app)、FilterHolder(句柄)、ServletHolder(句柄)
Server 加入 连接器、ServletContextHandler。
ServletContextHandler 加入 Filter 和 Servlet 句柄。
支持 jsp 的可以使用 WebAppContext 代替 ServletContextHandler
核心代码
连接池
- //连接池
- SelectChannelConnector connector = new SelectChannelConnector();
- connector.setPort(port);
- connector.setMaxIdleTime(30000);
- connector.setRequestHeaderSize(8192);
- QueuedThreadPool threadPool = new QueuedThreadPool(threadNum);
- threadPool.setName("embed-jetty-http");
- connector.setThreadPool(threadPool);
- server.setConnectors(new Connector[] { connector });
ServletContextHandler 或 WebAppContext
- ServletContextHandler context = null;
- if(webPath != null) {//webapp 可以支持 jsp
- logger.info("load webPath={}", webPath);
- final URL warUrl = new File(webPath).toURI().toURL();
- final String warUrlString = warUrl.toExternalForm();
- context = new WebAppContext(warUrlString, contextPath);
- server.setHandler(context);
- } else {
- context = new ServletContextHandler(server, contextPath);
- }
加入 servlet 或 filter
- //add filter
- if(filters != null) {
- for(Map.Entry<String, Filter> eFilter : filters.entrySet()) {
- logger.info("add filter={}, path={}", eFilter.getValue().getClass(), eFilter.getKey());
- context.addFilter(new FilterHolder(eFilter.getValue()), eFilter.getKey(), FilterMapping.DEFAULT);
- }
- }
- //add servlet
- if(servlets != null) {
- for(Map.Entry<String, Servlet> eServlet : servlets.entrySet()) {
- logger.info("add servlet={}, path={}", eServlet.getValue().getClass(), eServlet.getKey());
- context.addServlet(new ServletHolder(eServlet.getValue()), eServlet.getKey());
- }
- }
- if(webPath == null) {
- context.addServlet(DefaultServlet.class, "/*");
- }
注意:在我试用过程中发现不支持 jsp 的要加入一个 DefaultServlet。
最后调用 server.start();
3、示例 filter,写请求日志
- @Override
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
- HttpServletRequest req = (HttpServletRequest) request;
- logger.info("ip={}, prot={}, contextPath={}, servletPath={}, pathInfo={}, params={}", new Object[] {
- req.getLocalAddr(), req.getLocalPort(), req.getContextPath(),
- req.getServletPath(), req.getPathInfo(), req.getParameterMap()
- });
- chain.doFilter(request, response);
- }
4、示例 hello Servlet
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- resp.setContentType("Content-Type: text/plain;charset=utf-8");
- ServletOutputStream out = resp.getOutputStream();
- out.println("hello embed servlet!");
- Enumeration<String> name = req.getParameterNames();
- while(name.hasMoreElements()) {
- String myName = name.nextElement();
- out.println(myName+"="+req.getParameter(myName));
- }
- }
5、url 调用
- 运行 com.chenlb.demo.jetty.JettyEmbedServer
- #验证 hello servlet
- http://localhost:8983/embed/hello?what=this-is-jetty-embed-http
- #验证 jsp
- http://localhost:8983/embed/index.jsp
- #管制台可以看到日志如
- 20:33:49.328 INFO servlet.LogFilter(36) ip=127.0.0.1, prot=8983, contextPath=/embed, servletPath=/index.jsp, pathInfo=null, params={}
- 20:34:02.291 INFO servlet.LogFilter(36) ip=127.0.0.1, prot=8983, contextPath=/embed, servletPath=/hello, pathInfo=/chenlb, params={what=[this-is-jetty-embed-http]}
jetty-embed-demo 示例代码下载 https://github.com/chenlb/demo/tree/master/jetty-embed-demo
希望可以达到使用 嵌入 jetty 的期望。