Nhúng Jetty vào chương trình web Java dựa trên Jersey
Java
68
White

Ngoc Dao viết ngày 20/03/2016

Chương trình web Java servlet thường chạy với Tomcat. Tomcat là application web server, ta nhúng nhiều application vào nó để nó chạy. Đôi khi ta muốn viết chương trình có tính năng làm web server, và ta muốn nhúng web server vào chương trình thay vì nhúng chương trình vào web server. Lúc này ta có thể dùng Jetty vì nó nổi tiếng là được thiết kế rất dễ nhúng. Nhúng Tomcat cũng được, nhưng loằng ngoằng hơn. Google App Engine hiện dùng Jetty.

Bài hướng dẫn này dùng Jetty 7 và dùng Maven để build, bạn nên dùng bản mới hơn. Để hiểu bạn cần biết tối thiểu servlet và Maven. Biết thêm JAX-RS càng tốt.

pom.xml cho Maven:

<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>example</groupId>
<artifactId>hello</artifactId>
<packaging>jar</packaging>
<name>hello</name>
<version>1.0</version>
<description>My Hello App</description>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<repositories>
<repository>
<id>maven2-repository.dev.java.net</id>
<name>Java.net Repository for Maven</name>
<url>http://download.java.net/maven/2/</url>
<layout>default</layout>
</repository>
</repositories>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>hello.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>

<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>7.3.1.v20110307</version>
</dependency>

<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>7.3.1.v20110307</version>
</dependency>

<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.6</version>
</dependency>
</dependencies>
</project>

src/main/java/hello/Api.java:

package hello;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("")
public class Api {
@GET
@Path("/hello")
@Produces("text/plain")
public String getGreeting() {
return "Hi there";
}
}

Nhúng web server src/main/java/hello/Main.java:

package hello;

import com.sun.jersey.spi.container.servlet.ServletContainer;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

public class Main {
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
ServletContextHandler context =
new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);

ServletHolder servletHolder =
new ServletHolder(new ServletContainer());
servletHolder.setInitParameter(
"com.sun.jersey.config.property.resourceConfigClass",
"com.sun.jersey.api.core.PackagesResourceConfig");
servletHolder.setInitParameter(
"com.sun.jersey.config.property.packages",
"hello");

servletHolder.setInitOrder(1);
context.addServlet(servletHolder, "/*");

server.start();
server.join();
}
}

Dịch và chạy trong chế độ development: mvn compile exec:java

Bật trình duyệt, vào http://localhost:8080/hello sẽ thấy hiện ra Hi there.

Khi viết HTTP API, để thử nghiệm ta thường dùng curl: curl -v http://localhost:8080/hello

* About to connect() to localhost port 8080 (#0)
*   Trying ::1... connected
* Connected to localhost (::1) port 8080 (#0)
> GET /hello HTTP/1.1
> User-Agent: curl/7.21.2 (x86_64-apple-darwin10.6.0) libcurl/7.21.2 OpenSSL/1.0.0d zlib/1.2.5 libidn/1.20
> Host: localhost:8080
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: text/plain
< Transfer-Encoding: chunked
< Server: Jetty(7.3.1.v20110307)
< 
* Connection #0 to host localhost left intact
* Closing connection #0
Hi there

Trong chế độ production, dĩ nhiên bạn không chạy bằng Maven, mà dùng lệnh java trực tiếp để chạy class hello.Main.

Nếu muốn tạo project Eclipse: mvn eclipse:eclipse. Rồi vào Eclipse, right click vào project, chọn Build Path > Configure Build Path... > Libraries > Add Variable... rồi thêm biến M2_REPO dẫn đến <thư mục home của mình>/.m2/repositories.

Tham khảo

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ngoc Dao

102 bài viết.
252 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
56 6
Làm thế nào để nâng cấp trang web mà không làm gián đoạn dịch vụ? Đây là câu hỏi phỏng vấn các công ty lớn thường hỏi khi bạn xin vào vị trí làm lậ...
Ngoc Dao viết 2 năm trước
56 6
White
32 0
Bài viết này giải thích sự khác khác nhau giữa hai ngành khoa học máy tính (computer science) và kĩ thuật phần mềm (software engineering), hi vọng ...
Ngoc Dao viết gần 2 năm trước
32 0
White
28 1
Nếu là team leader, giám đốc công ty hay tướng chỉ huy quân đội, vấn đề cơ bản bạn gặp phải là “hướng mọi người đi theo con đường bạn chỉ ra”. Thử...
Ngoc Dao viết gần 2 năm trước
28 1
Bài viết liên quan
White
0 0
Trong bài viết này, một số hình ảnh hoặc nọi dung có thể bị thiếu do quá trình chế bản. Vui lòng xem nội dung ở blog gốc sau: (Link) (Link), chúng...
programmerit viết hơn 2 năm trước
0 0
Male avatar
8 5
Facade Design Patern Facade Patern thuộc vào họ mô hình cấu trúc (structural patern). Facade patern phát biểu rằng : "just provide a unified an...
DuongVanTien viết hơn 1 năm trước
8 5
White
0 2
(Link), mình đã nêu ra các phần mềm chính (portal, sdk và ide). Trong phần này, mình sẽ hướng dẫn cụ thể cài đặt môi trường máy chủ và môi trường l...
programmerit viết hơn 2 năm trước
0 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
102 bài viết.
252 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!