前面说过jetty最广泛的应用是可以方便的嵌入到应用程序中,而不是作为应用服务器,下面就用最简单的demo来演示一个最简单的应用
1、下载并导入依赖
首先应该建立一个普通的java项目,然后把依赖包导进去
关于依赖包的获取,第一种方式是将前面下载的jetty服务器中lib目录中的jar包导入即可
另外是在jetty下载页面上,上面是jetty服务器的下载链接,下面可以看到程序包的下载入口:
选择第一个Jetty-9进去,会看到9.x的很多版本,点进去下载最新的:
下载下来之后,将plugins中的java包加入到项目classpath即可
2、写一个demo
首先编写一个处理器来处理web发过来的请求,TestController.java,代码如下:
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; public class TestController extends AbstractHandler { @Override public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { System.out.println(target); response.setContentType("text/html; charset=utf-8"); request.setCharacterEncoding("utf-8"); response.setStatus(HttpServletResponse.SC_OK); baseRequest.setHandled(true); PrintWriter out = response.getWriter(); if(target.equals("/favicon.ico")) { System.out.println("1"); out.println("404"); } else { System.out.println("2"); out.print("<h3>hello jetty!</h3>"); if(request.getParameter("name") != null) { out.print(request.getParameter("name")); } } } }
准确来说这里得Controller应该是Handler,必须继承于AbstractHandler,并且重写handle方法来处理请求,可以看到这里可以直接使用Servlet的api,默认情况下jetty请求完毕以后会后台有一个/favicon.ico的请求,虽然不影响前端显示,但是为了防止后端重复处理,所以在这里进行了一次过滤
Handler写完之后,然后写一个入口的服务来加载Handler并且启动服务,这里是JettyService.java
import org.eclipse.jetty.server.Server; public class JettyService { public static void main(String[] args) throws Exception { Server server = new Server(8989); server.setHandler(new TestController()); server.start(); server.join(); } }
这样一个简单的demo就写完了,直接运行main方法启动服务
然后打开浏览器访问:http://127.0.0.1:8989/?name=jetty可以看到下面结果
事实上这里输入/xxx?name=xxx都可以被拦截,因为target是后台得到的,所以可以针对不同的请求执行不同的处理
后台可以看到如下输出:
可以看到嵌入jetty编程是非常简单和灵活的,这里只是一个最简单的案例,实际生产中还要使用很多高级的编程方式和配置
说明:
package youling.studio.jetty;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
public class TestHandler extends AbstractHandler {
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
//用户请求的uri
//http://localhost:8080/index.html?name=rolin -> target=/index.html
System.out.println("target is :" + target);
//设置http头信息
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
//获取向浏览器输出的流
PrintWriter out = response.getWriter();
if("/favicon.ico".equals(target)){//jetty默认会在每次请求结束,再请求一次这个uri
System.out.println("request /favicon.ico");
out.write("404");
}else{
System.out.println("request other!");
out.print("<h3>hello jetty!</h3>");
//其他请求参数
if(request.getParameter("name") != null) {
out.print("<h3>your name is "+request.getParameter("name")+"!</h3>");
}
}
}
}
package youling.studio.jetty;
import org.eclipse.jetty.server.Server;
public class JettyService {
public static void main(String[] args) throws Exception {
//创建jettyserver
Server server = new Server(8080);
//设置handler
server.setHandler(new TestHandler());
//启动
server.start();
server.join();
}
}
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>youling.studio</groupId>
<artifactId>test-jetty</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>test-jetty</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-server -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.2.22.v20170606</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-webapp -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId>
<version>9.2.22.v20170606</version>
</dependency>
</dependencies>
</project>