Embedded



ы

ы

Instalation. Versions and maven.

Версии. На сегодняшний день можно было бы рассматривать только последнюю версию jetty 9, однако она требует минимум 1.8 версии явы. Потому я буду еще дополнительно рассматривать последнюю версию из ветки jetty 8.

В случае с jetty 9 - уже есть хороший, годный пример на github в репо jetty:

Для jetty 8 же:

<properties>
<jetty-version>8.1.17.v20150415</jetty-version>
</properties> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-annotations</artifactId> <version>${jetty-version}</version> </dependency>

<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jsp</artifactId>
<version>${jetty-version}</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.jetty.orbit</groupId>
<artifactId>javax.servlet</artifactId>
</exclusion>
</exclusions>
</dependency>

Понятно, что исключения и комментирование для развязывания конфликтов. 
Как для 9, так и для 8 версии зависимости уже включают поддержку JSP. 
Если её не надо, то стоит обратить внимание на более минимальную сборку, добавляя компоненты по необходимости:
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${jetty-version}</version>
</dependency>

Aplying JSP support.

Добавление библиотек не является необходимым минимумом для старта поддержки JSP. Так как у нас в начале абсолютно пустой сервер, то все компоненты включая сервлет JSP и дефолтный сервлет мы должны настраивать сами. Хорошо тема описана здесь http://zetcode.com/java/jetty/embedded/



Minimal example.



Connectors


Examples

File downloader
http://stackoverflow.com/q/9031311/449553
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.mortbay.jetty.Server;
import org.mortbay.jetty.nio.SelectChannelConnector;
import org.mortbay.jetty.servlet.Context;

public class TestServlet extends HttpServlet {

   
@Override
   
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
           
throws ServletException, IOException {
       
final int bufferSize = 65536;
        resp
.setBufferSize(bufferSize);
       
OutputStream outStream = resp.getOutputStream();

       
FileInputStream stream = null;
       
try {
            stream
= new FileInputStream(new File("test.data"));
           
int bytesRead;
           
byte[] buffer = new byte[bufferSize];
           
while( (bytesRead = stream.read(buffer, 0, bufferSize)) > 0 ) {
                outStream
.write(buffer, 0, bytesRead);
                outStream
.flush();
           
}
       
} finally   {
           
if( stream != null )
                stream
.close();
            outStream
.close();
       
}
   
}

   
public static void main(String[] args) throws Exception {
       
Server server = new Server();
       
SelectChannelConnector ret = new SelectChannelConnector();
        ret
.setLowResourceMaxIdleTime(10000);
        ret
.setAcceptQueueSize(128);
        ret
.setResolveNames(false);
        ret
.setUseDirectBuffers(false);
        ret
.setHost("0.0.0.0");
        ret
.setPort(8080);
        server
.addConnector(ret);
       
Context context = new Context();
        context
.setDisplayName("WebAppsContext");
        context
.setContextPath("/");
        server
.addHandler(context);
        context
.addServlet(TestServlet.class, "/test");
        server
.start();
   
}

}

War runner:


import java.io.File;
import java.util.concurrent.atomic.AtomicInteger;

import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.webapp.WebAppContext;
import org.mortbay.jetty.handler.ContextHandlerCollection;
import org.mortbay.jetty.handler.DefaultHandler;
import org.mortbay.jetty.handler.HandlerCollection;
import org.mortbay.jetty.handler.RequestLogHandler;
import org.mortbay.jetty.nio.SelectChannelConnector;
import org.mortbay.thread.BoundedThreadPool;
import org.terracotta.modules.annotations.Root;

public class JettyLauncher
{
    @Root
    static AtomicInteger port;
            
    public static void main(String[] args) throws Exception
    {   
        if (args.length == 0 || new File(args[0]).exists() == false) {
          System.err.println("Incorrect or no WAR specified: " + args[0]);
          System.exit(1);
        }
        // set the port 
        int startPort = 8080;
        if (System.getProperty("port") != null) {
            startPort = (Integer.parseInt(System.getProperty("port")));
        }        
        port = new AtomicInteger(startPort);
        
        // create the server
        Server server = new Server();
        
        // Add the listener on the specified (or default) port
        Connector connector = new SelectChannelConnector();
        connector.setPort(port.getAndIncrement());        
        server.addConnector(connector);
 
        // Add the thread pool
        BoundedThreadPool threadPool = new BoundedThreadPool();
        server.setThreadPool(threadPool);

        // Add a default handler
        HandlerCollection handlers = new HandlerCollection();
        ContextHandlerCollection contexts = new ContextHandlerCollection();
        handlers.addHandler(contexts);
        handlers.addHandler(new DefaultHandler());
        handlers.addHandler(new RequestLogHandler());
        server.addHandler(handlers);
        
        // Add the web deployer
        WebAppContext deployer = new WebAppContext();
        deployer.setWar(args[0]);
        deployer.setContextPath("/webapp");

        server.setHandler(deployer);
  
        server.start();
    }
}









server = new Server();
Connector connector = new SocketConnector();
connector.setPort(0); // let it use whatever port thats free
server.addConnector(connector);
/*
ContextHandler context = new ContextHandler();
context.setContextPath("/path");
context.setHandler(new HelloHandler("Hello Basic"));
server.setHandler(context);
*/

/*
ServletHandler servletHandler = new ServletHandler();
server.setHandler(servletHandler);
servletHandler.addServletWithMapping(HelloServlet.class, "/*");
*/


ServletContextHandler servletHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);

ClassLoader jspClassLoader = new URLClassLoader(new URL[0], this.getClass().getClassLoader());
servletHandler.setClassLoader(jspClassLoader); // про класслоадеры не понятно - говорят что они нужны для JSP, и в чем-то они правы

servletHandler.setContextPath("/");
// String absolutePath = new File(new URI(this.getClass().getResource(".").toString()).getSchemeSpecificPart()).getAbsolutePath();
String absolutePath = new File(new URI("src/test/java/ua/com/msangel/j2ee/jersey/mvc/tiles/integration").getSchemeSpecificPart()).getAbsolutePath();
System.out.println("location:" + absolutePath);

servletHandler.setResourceBase(absolutePath); // установить корень для поиска ресурсов, в моем случае нуно было для правильного нахождения JSP файлов
// servletHandler.addServlet(HelloServlet.class, "/*");
servletHandler.addServlet(DefaultServlet.class, "/");

ServletHolder holderJsp = new ServletHolder("jsp", JspServlet.class); // это и есть дефолтный сервлет - для статик контента , который, к слову, и предоставляет директори листенинг, который можно отключить
holderJsp.setInitOrder(0);
holderJsp.setInitParameter("fork","false");
holderJsp.setInitParameter("keepgenerated", "true");



servletHandler.addServlet(holderJsp, "*.jsp"); // это важно - учим сервер распознавать JSP

FilterHolder fh = servletHandler.addFilter(MyFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
fh.setInitParameter("initParamKey", "InitParamValue"); // можно указывать параметры фильтра, так же - листнеров и сервлетов


ContextHandlerCollection contexts = new ContextHandlerCollection(); // создан для того
contexts.setHandlers(new Handler[] {servletHandler}); // можно указать сколько угодно



server.setHandler(contexts);

server.start();
server.dumpStdErr(); // вывод состояния, отладочная инфа
server.join();
port = connector.getLocalPort();


server.stop();
server.destroy();

ы
недостающие части просты:
public class MyFilter implements Filter {
@Override public void init(FilterConfig filterConfig) throws ServletException {}
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.err.println("OU");
chain.doFilter(request, response);
}
@Override public void destroy() { }
}

public class HelloServlet  extends HttpServlet
{
@Override
protected void doGet( HttpServletRequest request,
HttpServletResponse response ) throws ServletException,
IOException
{
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("<h1>Hello from HelloServlet</h1>");
}
}

в
Links:
http://www.eclipse.org/jetty/documentation/9.3.0.v20150612/embedding-jetty.html
http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty

Comments