Đối với đơn vị xét nghiệm của tôi, tôi sử dụng một thử nghiệm-server đơn giản dựa trên Jetty:Servlet 3.0 hỗ trợ trong Jetty nhúng 8,0
package eu.kostia.textanalysis.webservices.jetty;
import java.awt.Desktop;
import java.net.URI;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
public class TestServer {
static private final String CONTEXT_PATH = "/webservice";
static private final String PROJECT_HOME = System.getenv("MY_WORKSPACE_HOME") + "/WebServices";
static public final int PORT = 8080;
private Server server;
private Exception startException;
private static class SingletonHolder {
private static final TestServer INSTANCE = new TestServer();
}
/**
* Returns the singleton instance of the test server.
*
* @return the singleton instance of the test server.
*/
public static TestServer getInstance() {
return SingletonHolder.INSTANCE;
}
private TestServer() {
server = new Server(PORT);
WebAppContext context = new WebAppContext();
context.setDescriptor(PROJECT_HOME + "/web/WEB-INF/web.xml");
context.setResourceBase(PROJECT_HOME + "/web");
context.setContextPath(CONTEXT_PATH);
context.setParentLoaderPriority(true);
server.setHandler(context);
}
/**
* Start the test server. This method returns only when the server is
* complete started. There is no effect when you invoke this method and the
* server is already running.
*/
public void start() {
if (!server.isRunning()) {
startException = null;
new Thread("TestServer") {
public void run() {
try {
server.start();
server.join();
} catch (Exception exc) {
startException = exc;
}
}
}.start();
while (true) {
if (startException != null) {
throw new Error(startException);
}
// Block this method call until the server is started
if (server.isStarted()) {
return;
}
}
}
}
/**
* Stop the test server.
*/
public void stop() {
try {
if (server.isRunning()) {
server.stop();
}
} catch (Exception e) {
throw new Error(e);
}
}
/**
* Returns {@code true} is the server is running.
*
* @return {@code true} is the server is running.
*/
public boolean isRunning() {
return server.isRunning();
}
public static void main(String[] args) throws Exception {
TestServer.getInstance().start();
Desktop.getDesktop().browse(new URI("http://localhost:8080/webservice/"));
}
}
Nó hoạt động rất tốt cho servlet cấu hình trong web.xml nhưng tôi muốn bây giờ như thế để sử dụng cú pháp chú thích mới được giới thiệu bởi Đặc tả Servlet 3.0, ví dụ:
@WebServlet(urlPatterns = {"/hello"})
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();
writer.print("<h1>HttpServlet using Servlet 3.0</h1>");
}
}
Tôi có thể cấu hình Jetty trong lớp TestServer để xử lý các servlet dựa trên chú thích không?
Tôi nhận thấy bài đăng là cổ, nhưng tôi thấy rằng tôi đã gặp sự cố tương tự với máy chủ được nhúng ngay cả một năm sau bài đăng này. –
Tôi thấy AsyncContext không hoạt động tốt trong Jetty. Tôi đã từ bỏ nó trong thời gian có lợi cho Embedded Tomcat 7. Có vẻ như nó đang hoạt động tốt trong thời gian này. –