Jetty 9嵌入式开发

官方网址:http://www.eclipse.org/jetty/

下载地址:http://download.eclipse.org/jetty/stable-9/dist/

文档网址:http://www.eclipse.org/jetty/documentation/

当前Jetty网址上推荐使用的稳定版本:Jetty9.0。

介绍

Jetty9内容位于http://www.eclipse.org/jetty/documentation

直接链接:

http://www.eclipse.org/jetty/documentation/current/embedding-jetty.html

Jetty有一个标语,“不要部署你的应用在Jetty上,部署Jetty在你的应用中”。这意味着可选择使用Jetty捆绑你的应用作为一个标准WAR进行部署。Jetty设计成一个软件组件,可以实例化并且使用在Java程序中,例如:如何POJO。但是另外一种方法,以嵌入式模式运行Jetty,这意味着把HTTP模块放入到你的应用中,而不是把你的应用放入到HTTP服务中。

本教程引导你逐步从最简单的Jetty服务实例到使用标准部署描述运行多个Web应用。大部分示例的源代码是标准Jetty项目的一部分。

在学习该教程之前,完成一个HelloWorld教程是值得的。该教程可以在“嵌入式Jetty网络研讨会记录”中找到。

Jetty版本:本教程的代码来自于Jetty7,但是也应该在Jetty 8中可以使用。对于最新的稳定版本,参考最新发行版的链接代码。可能与本教程中给出的代码例子有稍微的不同。

概述

为了嵌入Jetty服务,通常执行下面的步骤:

1)创建一个服务

2)添加和配置连接器

3)添加和配置处理器

4)添加和配置Servlet、Webapp到处理器

5)启动服务

6)等待(join服务防止主线程退出)

创建一个服务

下面的代码来自于SimplestServer.jar,实例化和运行一个最简单的Jetty服务

http://download.eclipse.org/jetty/stable-9/xref/org/eclipse/jetty/embedded/SimplestServer.html

public class SimplestServer

{

public static void main(String[] args) throws Exception

{

Server server = new Server(8080);

server.start();

server.join();

}

}

在端口8080上运行一个HTTP服务。这不是非常有用的服务,因为它不处理,对于每个请求只是返回一个404错误。

编写处理器

为了生成请求的响应,Jetty要求在服务上设置一个Handler。一个处理器可能:

1)  检查和修改HTTP请求

2)生成完整的HTTP详情

3)调用其他的处理器(参见HandlerWrapper)

4)选择一个或者多个处理器调用(参考HandlerCollection)

http://download.eclipse.org/jetty/stable-9/xref/org/eclipse/jetty/server/handler/HandlerWrapper.html

Hello world处理器:

下面代码基于HelloHandler.java,显示一个简单的Helloworld处理器。

public classHelloHandler extends AbstractHandler

{

public void handle(String target,RequestbaseRequest,HttpServletRequest request,HttpServletResponse response)

throws IOException, ServletException

{

response.setContentType("text/html;charset=utf-8");

response.setStatus(HttpServletResponse.SC_OK);

baseRequest.setHandled(true);

response.getWriter().println("<h1>HelloWorld</h1>");

}

}

传递给handle方法的参数包括:

1)  target - 请求的目标,它可以是一个URI或者命名分发器的名称

2) baseRequest – Jetty可变请求对象,它总是解包的

3)  request - 不可变的请求对象,它可能已经被封装

4) response - 响应,它可能已经被封装

处理器设置请求的状态,内容类型,在使用writer生成请求体之前标注请求已经处理(后续就不再处理)。

下面的代码来自于OneHandler.java,显示Jetty服务如何使用该处理器。

public staticvoid main(String[] args) throws Exception

{

Server server = new Server(8080);

server.setHandler(new HelloHandler());

server.start();

server.join();

}

现在你知道基于Jetty编写一个HTTP服务所需要了解的所有东西。然而,复杂的请求处理通常使用多处理器构建。我们在后面章节中看看它是如何组合处理器的。你能查看Jetty的org.eclipse.jetty.server.handler包中有那些可用处理器。

配置连接

为了配置服务使用的HTTP连接。你能设置服务上的一个或者多个连接器。你能详细配置每个链接,例如:接口、端口、缓冲大小,超时时间等。

下面的代码基于ManyConnectors.java,显示如何为HelloWorld示例设置和配置连接器。

public class ManyConnectors

{

public static void main(String[] args) throws Exception

{

Server server = new Server();

SelectChannelConnector connector0 = new SelectChannelConnector();

connector0.setPort(8080);

connector0.setMaxIdleTime(30000);

connector0.setRequestHeaderSize(8192);

SelectChannelConnector connector1 = new SelectChannelConnector();

connector1.setHost("127.0.0.1");

connector1.setPort(8888);

connector1.setThreadPool(new QueuedThreadPool(20));

connector1.setName("admin");

SslSelectChannelConnector ssl_connector = newSslSelectChannelConnector();

String jetty_home =

System.getProperty("jetty.home","../jetty-distribution/target/distribution");

System.setProperty("jetty.home",jetty_home);

ssl_connector.setPort(8443);

SslContextFactory cf = ssl_connector.getSslContextFactory();

cf.setKeyStore(jetty_home + "/etc/keystore");

cf.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");

cf.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");

server.setConnectors(new Connector[]{ connector0, connector1,ssl_connector });

server.setHandler(new HelloHandler());

server.start();

server.join();

}

}

理解处理器集合、封装和范围

复杂请求处理通常构建多个处理器,能够以各种方式组合:

1) 处理器集合:保留其他处理器集合,依次调用每个处理器。对于合并统计和日志处理器(生成请求的处理器)是有用的。

2) 处理器列表:一个处理器集合,依次调用处理器直到抛出异常、委派响应或request.isHandled返回true。它能作为合并处理器使用,有条件的处理一个请求。

3) 处理器封装:一个处理器基类可以用于菊花链处理程序,以面向方面编程风格组合在一起。例如,一个标准的Web应用通过上下文、会话、安全和Servlet处理器的链式实现。

4) 内容处理器集合:使用最长的请求URI前缀(contextPath)来选择指定的ContextHandler来处理请求。

参见如何编写Jetty处理器。

http://wiki.eclipse.org/Jetty/Howto/Write_Jetty_Handler

配置文件服务

下面代码来自于FileServer.java,使用HandleList组合ResourceHandler和DefaultHandler。

public class FileServer

{

public static void main(String[] args) throws Exception

{

Server server = new Server();

SelectChannelConnector connector = new SelectChannelConnector();

connector.setPort(8080);

server.addConnector(connector);

ResourceHandler resource_handler = new ResourceHandler();

resource_handler.setDirectoriesListed(true);

resource_handler.setWelcomeFiles(new String[]{ "index.html"});

resource_handler.setResourceBase(".");

HandlerList handlers = new HandlerList();

handlers.setHandlers(new Handler[] { resource_handler, newDefaultHandler() });

server.setHandler(handlers);

server.start();

server.join();

}

}

资源处理器首先传递给请求,查看在本地目录下是否有满足的文件。如果没有找到一个文件,请求传递给缺省的处理器生成一个404错误(或favicon.ico)。

使用XML配置的文件服务器

现在是时候让你记住JettyXML配置格式能够渲染简单的Java代码到XML配置。所以上面的文件服务器例子可以使用Jetty XML来编写,如下。

<?xml version="1.0"?>

<!DOCTYPE Configure PUBLIC"-//Jetty//Configure//EN""http://www.eclipse.org/jetty/configure.dtd">

<Configure id="FileServer"class="org.eclipse.jetty.server.Server">

<Call name="addConnector">

<Arg>

<Newclass="org.eclipse.jetty.server.nio.SelectChannelConnector">

<Set name="port">8080</Set>

</New>

</Arg>

</Call>

<Set name="handler">

<New class="org.eclipse.jetty.server.handler.HandlerList">

<Set name="handlers">

<Arraytype="org.eclipse.jetty.server.Handler">

<Item>

<Newclass="org.eclipse.jetty.server.handler.ResourceHandler">

<Setname="directoriesListed">true</Set>

<Setname="welcomeFiles">

<Arraytype="String"><Item>index.html</Item></Array>

</Set>

<Setname="resourceBase">.</Set>

</New>

</Item>

<Item>

<Newclass="org.eclipse.jetty.server.handler.DefaultHandler">

</New>

</Item>

</Array>

</Set>

</New>

</Set>

</Configure>

你可以从FileServerXml.java中运行这个XML文件。

public class FileServerXml

{

public static void main(String[] args) throws Exception

{

Resource fileserver_xml =Resource.newSystemResource("fileserver.xml");

XmlConfiguration configuration = newXmlConfiguration(fileserver_xml.getInputStream());

Server server = (Server)configuration.configure();

server.start();

server.join();

}

}

使用Spring配置文件服务器

你也能使用Spring框架聚合Jetty服务,上面的文件服务器示例可以使用Spring配置重写,如下:

<beans>

<bean id="Server"class="org.eclipse.jetty.server.Server" init-method="start"destroy-method="stop">

<property name="connectors">

<list>

<bean id="Connector"class="org.eclipse.jetty.server.nio.SelectChannelConnector">

<property name="port" value="8080"/>

</bean>

</list>

</property>

<property name="handler">

<bean id="handlers"class="org.eclipse.jetty.server.handler.HandlerList">

<property name="handlers">

<list>

<beanclass="org.eclipse.jetty.server.handler.ResourceHandler">

<propertyname="directoriesListed" value="true"/>

<propertyname="welcomeFiles">

<list>

<value>index.html</value>

</list>

</property>

<propertyname="resourceBase" value="."/>

</bean>

<beanclass="org.eclipse.jetty.server.handler.DefaultHandler"/>

</list>

</property>

</bean>

</property>

</bean>

</beans>

参考:如何使用Spring配置Jetty。http://wiki.eclipse.org/Jetty/Howto/Spring

设置上下文

ContextHandler是是HandlerWrapper,只负责请求符合配置上下路径的URL前缀。

符合上下文路径(有它们路径方法)的请求将进行相应的更新,以下可选上下文特征被正确的应用。

* 一个线程内容类加载器

* 属性的集合

* 初始化参数集合

* 基础资源(又名文档根目录)

* 虚拟主机名集合

没有匹配的请求不进行处理。

下面的代码基于OneContext.java,设置上下文路径和hello处理器的类加载器。

public class OneContext

{

public static void main(String[] args) throws Exception

{

Server server = new Server(8080);

ContextHandler context = new ContextHandler();

context.setContextPath("/hello");

context.setResourceBase(".");

context.setClassLoader(Thread.currentThread().getContextClassLoader());

server.setHandler(context);

context.setHandler(new HelloHandler());

server.start();

server.join();

}

}

创建Servlet

Servlet是提供应用逻辑和处理HTTP请求的标准方法。Servlet就像约束标准方法的处理器映射指定URI给指定的Servlet。下面的代码基于HelloServlet.java。

public class HelloServlet extendsHttpServlet

{

private String greeting="Hello World";

public HelloServlet(){}

public HelloServlet(String greeting)

{

this.greeting=greeting;

}

protected void doGet(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException

{

response.setContentType("text/html");

response.setStatus(HttpServletResponse.SC_OK);

response.getWriter().println("<h1>"+greeting+"</h1>");

response.getWriter().println("session=" +request.getSession(true).getId());

}

}

设置ServletContext

ServletContextHandler是一个支持标准Servlet的专用ContextHandler。下面的代码来自于OneServletContext,显示三个HelloworldServlet实例注册到一个ServletContextHandler上。

public class OneServletContext

{

public static void main(String[] args) throws Exception

{

Server server = new Server(8080);

ServletContextHandler context = newServletContextHandler(ServletContextHandler.SESSIONS);

context.setContextPath("/");

server.setHandler(context);

context.addServlet(new ServletHolder(newHelloServlet()),"/*");

context.addServlet(new ServletHolder(new HelloServlet("BuongiornoMondo")),"/it/*");

context.addServlet(new ServletHolder(new HelloServlet("Bonjour leMonde")),"/fr/*");

server.start();

server.join();

}

}

设置Web应用上下文

一个Web应用上下文是ServletContextHandler的变种,使用标准的布局和web.xml配置Servlet、过滤器和其它特征。

public class OneWebApp

{

public static void main(String[] args) throws Exception

{

String jetty_home =System.getProperty("jetty.home","..");

Server server = new Server(8080);

WebAppContext webapp = new WebAppContext();

webapp.setContextPath("/");

webapp.setWar(jetty_home+"/webapps/test.war");

server.setHandler(webapp);

server.start();

server.join();

}

}

如果不熟期间,你没有组装应用程序为WAR文件,你可以从源组件上运行它,如下:

public class OneWebAppUnassembled

{

public static void main(String[] args) throws Exception

{

Server server = new Server(8080);

WebAppContext context = new WebAppContext();

context.setDescriptor(webapp+"/WEB-INF/web.xml");

context.setResourceBase("../test-jetty-webapp/src/main/webapp");

context.setContextPath("/");

context.setParentLoaderPriority(true);

server.setHandler(context);

server.start();

server.join();

}

}

配置上下文处理器集合

上下文处理器集合使用最长请求URI前缀选择指定的上下文。下面的示例在单个Jetty服务上组合前面两个示例。

public class ManyContexts

{

public static void main(String[] args) throws Exception

{

Server server = new Server(8080);

ServletContextHandler context0 = newServletContextHandler(ServletContextHandler.SESSIONS);

context0.setContextPath("/ctx0");

context0.addServlet(new ServletHolder(newHelloServlet()),"/*");

context0.addServlet(new ServletHolder(new HelloServlet("BuongiornoMondo")),"/it/*");

context0.addServlet(new ServletHolder(new HelloServlet("Bonjour leMonde")),"/fr/*");

WebAppContext webapp = new WebAppContext();

webapp.setContextPath("/ctx1");

webapp.setWar(jetty_home+"/webapps/test.war");

ContextHandlerCollection contexts = new ContextHandlerCollection();

contexts.setHandlers(new Handler[] { context0, webapp });

server.setHandler(contexts);

server.start();

server.join();

}

}

嵌入式JSP

嵌入式JSP支持可能有点令人困惑,如果你查看Jetty发行版lib/jsp目录下的JAR包。这是因为我们为Eclipse封装了JSP软件集,标记为OSGI软件集,不能直接从Maven Central中直接下载。在Maven中心中有可用的依赖,因为它们有OSGI软件集自己实际源码。OSGI软件集简化Maven中心artifact,解压成多个扩展的bundle。

你能使用的示例如下:

INFO]org.eclipse.jetty:jetty-jsp-2.1:jar:7.2.2-SNAPSHOT

[INFO] +-org.eclipse.jetty:jetty-util:jar:7.2.2-SNAPSHOT:provided

[INFO] +-org.mortbay.jetty:jsp-2.1-glassfish:jar:2.1.v20100127:provided

[INFO] | +- org.eclipse.jdt.core.compiler:ecj:jar:3.5.1:provided

[INFO] | +- org.mortbay.jetty:jsp-api-2.1-glassfish:jar:2.1.v20100127:provided

[INFO] | \- ant:ant:jar:1.6.5:provided

[INFO] \-javax.servlet:servlet-api:jar:2.5:provided

你应该能够依赖于一个嵌入式聚合,我们提供获取这些依赖,没有任何问题。

http://repo2.maven.org/maven2/org/eclipse/jetty/aggregate

时间: 2024-08-06 16:05:05

Jetty 9嵌入式开发的相关文章

jetty 9 嵌入式开发示例

jetty 9 嵌入应用程序后,小型的web应用直接打成一个单独的jar包,就可以直接运行,非常适合做Demo演示或云端集群部署. 主要代码: JettyServer的封装类 1 package yjmyzz.jetty.demo.server; 2 3 import org.eclipse.jetty.server.*; 4 import org.eclipse.jetty.server.handler.HandlerCollection; 5 import org.eclipse.jetty

Java使用Jetty实现嵌入式Web服务器及Servlet容器

首先来介绍下 Jetty,根据 wiki 的介绍: Jetty 是一个纯粹的基于 Java 的网页服务器和 Java Servlet 容器.尽管网页服务器通常用来为人们呈现文档,但是 Jetty 通常在较大的软件框架中用于计算机与计算机之间的通信. Jetty 作为 Eclipse 基金会的一部分,是一个自由和开源项目.该网页服务器被用在 Apache ActiveMQ.Alfresco.Apache Geronimo.Apache Maven.Google App Engine.Eclipse

嵌入式开发板丨ARM开发板 学习必备资料- 迅为电子

摘要: ARM开发板 迅为三星Exynos嵌入式开发平台超强GPS模块 iTOP-Exynos4412开发板采用 Exynos4412的主芯片,具有更高的主频和更丰富外设,配置 2GB 双通道 DDR3的内存及 16GB 存储,具有稳定性强.可靠性高,能适用于对性能和处理能力有更高要求的嵌入式系统应用场合. iTOP-Exynos4412开发板内置有无线 WIFI 模块.Bluetooth.GPS.Camera.3G等模组,支持 HDMI1.4(1080P/60Hz)显示,客户可以直接从开发平台

基于软件开发对嵌入式开发的思考

由于本人专业方向是计算机体系结构方向的,平时做嵌入式方面的实验以及项目较多,这个学期又学习了软件工程的课程,因此想借此机会,总结下在软件工程上面学习到的知识,并看看是否有什么能够借鉴到嵌入式方向的开发上面去. 首先我想总结下,软件开发与嵌入式开发的不同之处.作为软件开发,首先应当从用户或者用户的需求入手,明白用户想让你去实现什么功能,而到了具体的实现,有时却限制的不是那么的死.而至于嵌入式的开发,从需求入手是相同的,但是对于实现的方式,却明显不同于传统的软件开发.对于编程语言,不同的嵌入式开发平

第二章 Android系统与嵌入式开发

第二章 Android系统与嵌入式开发 第二章首先要先了解Android和嵌入式Lnux系统有什么区别和联系,嵌入式Linux系统是在嵌入式设备中运行Linux系统:Android系统是在嵌入式设备中运行Android系统. 其区别就是Android系统和Linux系统的区别.Android系统的底层是Linux的内核,上面跑的是Android的java虚拟机.Android系统的UI做的比Lnux好很多. 首先我们应该先了解一下什么是嵌入式,对于嵌入式来说,它是一种“完全嵌入受控器件内部,为特

与一线Linux嵌入式开发project师的对话

转:与一线Linux嵌入式开发project师的对话 陈project师一直做Linux的嵌入式开发.作为在开发一线的project师.他对非常多问题的看法可能更切合实际需求,于是,通过邮件.就嵌入式开发方面的问题,请他谈了一下自己的看法: 问:关于嵌入式开发.我们准备给同学们解说一些入门知识.从你一线开发经验来说,给我们一些建议: 陈工回答: 对于嵌入式Linux入门,假设有一定基础,可以从驱动開始:假设没有基础.我个人建议还是从应用程序開始.由于从应用程序開始是最easy的,也是 最直观的.

转:Qt 嵌入式开发环境搭建

地址: http://www.cnblogs.com/lishixian/articles/3013897.html         作者:lsx_007 这里主要是记录了自己在搭建嵌入式开发环境时阅读的一些有价值的参考文档,文档主要来自于网络,由于是从文库中下载,所以也不知道 文档的出在哪?因为个人觉得总结的比较好,我暂且拿过来记录下,当然在此基础上也会加上我自己的理解!这篇文章主要是以问答的形式来组织. QT嵌入式开发环境是本文所要介绍的内容,我们先看看Qt的各个版本简介: 1.什么是QT

嵌入式开发技术三级

1.酒店客房的门锁系统是由总台服务器和若干客房指纹锁组成,其基本功能具体描述如下: a.客房的指纹锁与总台服务器之间通过通信网络连接. b.旅客在总台登记住宿时,录入其指纹信息,并提取其特征值存储在总台服务器中.同时录入一个密码(若干位数字组成),以备指纹无法开锁时,用密码开锁. c.旅客在开客房指纹锁时,把相应手指放在门锁的指纹采集部件上,采集相应的指纹图像信息,并传输给总台服务器. d.总台服务器接收到某个客房指纹锁传输来的指纹图像信息后,进行特征值求取并进行匹配,若匹配正确,则回送开锁指令

(转)嵌入式开发如何学习

一般来说,在嵌入式行业中从事嵌入式产品研发的人往往来自这样一些专业:计算机.电气,自动化,微电子,电子信息,通信,机械等相关专业,由于大学里面不同专业基础课的设置,所以在准备学习的过程中需要根据实际情况有不同的侧重. 一是程序设计的基础,例如:基本的编程语言基础,至少对数据类型.程序的结构及流程控制等最基本的内容要相当清楚,所以建议恶补一下C语言,呵呵!另外有不少同学都问到数据结构的基础,我一直认为数据结构和算法的学习是帮助形成程序设计逻辑思维的很好训练方式,对于程序员的长期专业素养的提高一定有