怎么配置Jetty
更新日期:
Jetty POJO 配置
Jetty的核心组件简单的就像一个POJO一样,Jetty的配置过程大部分是实例化的过程,在POJO之上的装配和设置域操作,你可以通过下面的方式实现:
- 直接写代码实例化和装配Jetty对象,如:Embedding Jetty
- 使用Jetty xml配置,这是一个IOC框架,实例化和装配Jetty对象作为XML对象,etc/jetty.xm 是主要的Jetty配置文件。但是也有其它配置jetty特定配置文件在发布版本里。
- 用第三方的IOC框架,如Spring,实例化和装配Jetty对象作为一个Spring Bean。
因为主要的Jetty配置文件都是IOC来去完成的,可以去参考Jetty API文档。
Jetty Start配置文件
Jetty使用下面的配置文件去实例化、注入和启动服务器通过执行start.jar
ini文件:
Jetty使用命令行的启动方式,start.ini 和start.d/*.ini下的文件可以创建一有效的命令行参数,参数可能是:
- Xml文件使用jetty IOC的文件格式
- 模块激活使用 —module=name配置
- 属性配置方式 name=value,参数化使用jetty IOC xml
- 一个标准的Java属性文件包含额外的 start文件属性
- 其它start.jar选项(参见:java -jar start.jar —help )
- JVM 选项
mod文件:
modules/*.mod文件包含模块定义,激活方式 —module=name 名称是每个模块文件的定义
- 模块依赖按照顺序激活
- 所需的库模块添加到类路径中
- 该模块所需要的XML文件添加到有效的命令行
- 文件所需的激活模块
- 模板ini文件 —add-to-start =name 激活时使用的名字
XML文件:
Jetty或spring IoC格式的XML文件或在命令行上列出,ini文件或添加到模块定义有效的命令行。XML文件实例化和注入实际的Java对象,包括服务器、连接器和上下文。因为码头奥委会XML文件经常使用属性,许多常见配置任务可以没有编辑这些XML文件来完成。如果需要XML配置更改,应该从jetty复制XML文件 jetty.home/etc 到 jetty.base/etc 在修改之前
其它配置文件
Jetty IoC XML 配置格式
public class ExampleServer {
public static void main(String[] args) throws Exception {
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(8080);
server.setConnectors(new Connector[]{connector});
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
context.addServlet(HelloServlet.class, "/hello");
context.addServlet(AsyncEchoServlet.class, "/echo/*");
HandlerCollection handlers = new HandlerCollection();
handlers.setHandlers(new Handler[]{context, new DefaultHandler()});
server.setHandler(handlers);
server.start();
server.join();
}
}
HelloServlet
/**
* <p/>
* User : krisibm@163.com
* Date: 2015/6/17
* Time: 18:00
*/
public class HelloServlet extends HttpServlet {
final String greeting;
public HelloServlet() {
this("Hello");
}
public HelloServlet(String greeting) {
this.greeting = greeting;
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("<h1>" + greeting + " from HelloServlet</h1>");
}
}
AsyncEchoServlet
public class AsyncEchoServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
AsyncContext asyncContext = request.startAsync(request, response);
asyncContext.setTimeout(0);
Echoer echoer = new Echoer(asyncContext);
request.getInputStream().setReadListener(echoer);
response.getOutputStream().setWriteListener(echoer);
}
private class Echoer implements ReadListener, WriteListener {
private final byte[] buffer = new byte[4096];
private final AsyncContext asyncContext;
private final ServletInputStream input;
private final ServletOutputStream output;
private final AtomicBoolean complete = new AtomicBoolean(false);
private Echoer(AsyncContext asyncContext) throws IOException {
this.asyncContext = asyncContext;
this.input = asyncContext.getRequest().getInputStream();
this.output = asyncContext.getResponse().getOutputStream();
}
@Override
public void onDataAvailable() throws IOException {
onWritePossible();
}
@Override
public void onAllDataRead() throws IOException {
onWritePossible();
}
@Override
public void onWritePossible() throws IOException {
// This method is called:
// 1) after first registering a WriteListener (ready for first write)
// 2) after first registering a ReadListener iff write is ready
// 3) when a previous write completes after an output.isReady() returns false
// 4) from an input callback
// We should try to read, only if we are able to write!
while (output.isReady() && input.isReady()) {
int read = input.read(buffer);
if (read < 0) {
if (complete.compareAndSet(false, true))
asyncContext.complete();
break;
} else if (read > 0) {
output.write(buffer, 0, read);
}
}
}
@Override
public void onError(Throwable failure) {
failure.printStackTrace();
asyncContext.complete();
}
}
}
pom
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.0.4.v20130625</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.jetty.orbit</groupId>
<artifactId>javax.servlet</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>9.0.4.v20130625</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>