您的位置:首页 > 编程语言 > Java开发

Java项目嵌入Jetty-Web服务器

2013-07-10 16:07 302 查看
项目中用到嵌入式服务器的功能,于是去jetty的官方网站看了jetty嵌入方面的文档,简要翻译了其中可能用到的部分,方便以后参考。

Jetty有一个口号:不要把你的应用部署到Jetty中,把Jetty部署到你的应用中。Jetty可以在Java应用程序中向其他POJO一样被实例化,换句话说,以嵌入式的模式运行Jetty是指将Http模块放入你的应用程序中,而非部署你的程序到一个HTTP服务器。

嵌入式Jetty服务器的实现的步骤通常为:

1. 创建一个Server实例

2. 添加/配置Connectors

3. 添加/配置Handlers或者Contexts或者Servlets

4. 启动Server

相关阅读:

Ubuntu 11.04 安装配置 Jetty7 http://www.linuxidc.com/Linux/2011-12/48918.htm
Jetty的配置、部署与API使用 http://www.linuxidc.com/Linux/2011-12/49514.htm

Jetty 9.0.4 发布,支持 Servlet 3.1 非堵塞 I/O http://www.linuxidc.com/Linux/2013-06/86576.htm
1. 准备工作:

下载整合后的jetty-all和servlet api的jar文件。

2. 创建Server

下述代码创建一个Server实例,并启动服务器。

packageorg.eclipse.jetty.embedded;

importorg.eclipse.jetty.server.Server;

/** The simplest possible Jetty server.

*/

publicclassSimplestServer {

publicstaticvoidmain(String[] args) throwsException {

Server server = newServer(8080);

server.start();

server.join();

}

}

由于代码中并没有指定server的处理器(handler),因此在浏览器中输入http://localhost:8080会返回404错误页面。

3. 使用Handlers

为了对每个请求作出相应,Jetty要求为Server设定Handler,Handler可以处理

Ø检查或修改Http请求

Ø生成完整的Http响应

Ø调用另一个Handler

Ø选择一个或多个Handlers调用

3.1 HelloWorld Handler

下述代码显示了一个简单helloworld handler的实现

packageorg.eclipse.jetty.embedded;

importjava.io.IOException;

importjavax.servlet.ServletException;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importorg.eclipse.jetty.server.Request;

importorg.eclipse.jetty.server.handler.AbstractHandler;

publicclassHelloHandlerextendsAbstractHandler {

finalString _greeting;

finalString _body;

publicHelloHandler() {

_greeting= "Hello World";

_body= null;

}

publicHelloHandler(String greeting) {

_greeting= greeting;

_body= null;

}

publicHelloHandler(String greeting, String body) {

_greeting= greeting;

_body= body;

}

publicvoidhandle(Stringtarget, Request baseRequest, HttpServletRequest request, HttpServletResponseresponse) throwsIOException, ServletException {

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

response.setStatus(HttpServletResponse.SC_OK);

baseRequest.setHandled(true);

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

if(_body != null) response.getWriter().println(_body);

}

}

handle为AbstractHandler抽象类中定义的抽象方法,我们对请求的处理操作主要通过此方法来完成,handle中参数包括:

target——请求的目标,可以是一个URI或者一个命名dispatcher中的名字。

baseRequest——Jetty的可变请求对象,总是unwrapped。

request——不变的请求对象,可能会被过滤器或servlet包装

response——响应,可能会被过滤器或servlet包装

hadler设定响应的状态,内容类型,并在使用writer生成响应体之前标记请求为已处理。

3.2 运行HelloWorld Handler

publicstaticvoidmain(String[] args) throwsException {

Serverserver = newServer(8080);

server.setHandler(newHelloHandler());

server.start();

server.join();

}

3.3 Resource Handler

Resource Handler可以用于处理当前目录下的静态内容,例如:

packageorg.eclipse.jetty.embedded;

importorg.eclipse.jetty.server.Handler;

importorg.eclipse.jetty.server.Server;

importorg.eclipse.jetty.server.handler.DefaultHandler;

importorg.eclipse.jetty.server.handler.HandlerList;

importorg.eclipse.jetty.server.handler.ResourceHandler;

importorg.eclipse.jetty.util.log.Log;

importorg.eclipse.jetty.util.log.Logger;

/** Simple JettyFileServer.

* This is asimple example of Jetty configured as a FileServer.

*/

publicclassFileServer {

publicstaticvoidmain(String[] args) throwsException {

Serverserver = newServer(8080);

ResourceHandlerresource_handler = newResourceHandler();

resource_handler.setDirectoriesListed(true);

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

resource_handler.setResourceBase(".");

HandlerListhandlers = newHandlerList();

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

server.setHandler(handlers);

server.start();

server.join();

}

}

注意HandlerList包括ResourceHandler和DefaultHandler,后者主要用于当请求不匹配静态资源时返回404错误页面。

4. 嵌入Connectors

在前面的例子,创建Server实例时传入了一个端口号参数,程序内部会创建一个Connector的默认实例,在指定的端口上监听请求。然而,通常嵌入式的Jetty需要为一个Server实例显式地实例化并配置一个或多个Connector。

下述代码显示了如何实例化、配置并添加一个HTTP connector到Server中:

packageorg.eclipse.jetty.embedded;

importorg.eclipse.jetty.server.Server;

importorg.eclipse.jetty.server.ServerConnector;

/**

* A Jettyserver with one connectors.

*/

publicclassOneConnector {

publicstaticvoidmain(String[] args) throwsException {

Serverserver = newServer();

ServerConnectorhttp = newServerConnector(server);

http.setHost("localhost");

http.setPort(8080);

http.setIdleTimeout(30000);

server.addConnector(http);

server.setHandler(newHelloHandler());

server.start();

server.join();

}

}

本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2013-07/86983.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐