Простой Java контейнер автономного сервера / фреймворк? - PullRequest
5 голосов
/ 15 июля 2009

Последние пару лет я был в Python, где было множество вариантов для простых, минимальных фреймворков, которые позволяют мне легко поддерживать веб-сайт или сервис (например, web.py). Я ищу что-то подобное в Java.

Каков самый простой и наименьший запас средств для поддержки простых сервисов с использованием Java в наши дни? Я ищу что-то простое, как:

  • возможность получать HTTP-запросы
  • возможность отправлять эти запросы обработчикам (предпочтительно средство сопоставления URL-адресов и обработчиков на основе регулярных выражений)
  • возможность устанавливать заголовки HTTP и вообще полностью контролировать запрос / ответ

Бонусные баллы, если среда хорошо работает с Jython.

[Обновление] Спасибо за ответы, некоторые из них выглядят довольно интересно. Однако я не вижу возможности отправки URL в них. Я ищу что-то похожее на систему url.py в Django, которая выглядит так:

urlpatterns = patterns('',
    (r'^articles/2003/$', 'news.views.special_case_2003'),
    (r'^articles/(\d{4})/$', 'news.views.year_archive'),
    (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'),
    (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),
)

Где вы указываете регулярное выражение url вместе с обработчиком, который его обрабатывает.

Ответы [ 6 ]

3 голосов
/ 15 июля 2009

есть несколько альтернатив:

  • сервлеты
  • restlet : легкие рамки REST
  • jax-rs: используя jersey или модуль рестлета, реализующий спецификации jax-rs
  • гризли : сервер на базе NIO (с поддержкой HTTP + обработчики)
  • apache mina : управляемый событиями асинхронный сервер (с поддержкой HTTP)

все эти платформы поставляются со встроенным сервером.

EDIT

jax-rs имеет похожий подход с использованием шаблонов URL:

@Path("/users/{username}")
public class UserResource {

    @GET
    @Produces("text/xml")
    public String getUser(@PathParam("username") String userName) {   
    }
}

затем поместите ваши обработчики в объект Application:

public class MyApplicaton extends Application {
    public Set<Class> getClasses() {
        Set<Class> s = new HashSet<Class>();
        s.add(UserResource.class);
        return s;
    }
}

другой пример с JAX-RS:

@GET
@Produces("application/json")
@Path("/network/{id: [0-9]+}/{nid}")
public User getUserByNID(@PathParam("id") int id, @PathParam("nid") String nid) {
}

РЕДАКТИРОВАТЬ 2

Restlet поддерживает централизованные конфигурации, такие как Django, в вашем объекте Application:

// Attach the handlers to the root router  
router.attach("/users/{user}", account);  
router.attach("/users/{user}/orders", orders);  
router.attach("/users/{user}/orders/{order}", order);  
3 голосов
/ 15 июля 2009

Мне понравился сервер Simple HTTP от Simple Framework. Он предлагает хороший учебник о том, как начать.

1 голос
/ 15 июля 2009

Примечание: это более общее обсуждение, чем ответ.

У меня схожие проблемы, связанные с Python в течение 10 с лишним лет и возвращением к Java. Я думаю, одну вещь, которую я изучаю, это то, что фактор «простоты» Python сильно отличается от фактора Java. Где Python изобилует высокоуровневыми фреймворками - такими как web.py, Java кажется намного более низким уровнем. За последние несколько месяцев я перешел от слов «Как на Java это сделать проще всего в Python» к «Как создать эту штуку в Java». Тонкий, но, кажется, переносит мои мысли от Python-ориентированного представления к более Java-ориентированному.

Сделав это, я понял, что поддерживать веб-сайт или сервис непросто для аутсайдера Java, это потому, что я должен (ре) получить много информации. Это не так просто, как Python. Вам по-прежнему нужен веб-сервер, вам нужно создать «контейнер» для добавления вашего Java-кода, а затем вам нужен Java-код (я в этом ошибаюсь, все? Есть ли более простой способ?).

Для меня работа со Scala и Lift помогла - и даже не тем, а этой веткой Дэвида Поллака . Это было то, что мне было нужно для создания сервера Jetty. Возьмите это, следуйте инструкциям (несколько расплывчато, но может быть достаточно для вас), и тогда у вас будет контейнер сервлета, готовый принимать входящий трафик через порт (или 3 порта, в его случае). Затем вы можете написать некоторый код Java с помощью HTTPServlet или что-то еще, чтобы пройти остаток пути.

Опять же, это именно то, что я сделал, чтобы преодолеть этот барьер, но я все еще не гуру Java. Удачи.

1 голос
/ 15 июля 2009

Сервлеты могут быть подходящим вариантом. Чтобы делать очень простые вещи, вам нужно переопределить только один метод одного класса. Конечно, возможны более сложные вещи, но вы можете проделать долгий путь с небольшой работой.

Расследование Tomcat или Jetty - оба с открытым исходным кодом и хорошо поддерживаются.

public class HelloWorldServlet extends HttpServlet {
    public void doGet( HttpServletRequest request, HttpServletResponse response )
        throws ServletException, IOException 
    {
        response.setContentType( "text/plain" );
        PrintWriter out = response.getWriter();
        out.print( "hello world!" );
    }
}
0 голосов
/ 17 июля 2009

Jetty - это довольно хороший встроенный http-сервер - даже если невозможно выполнить сопоставление, как вы описали, реализовать его будет довольно легко.

0 голосов
/ 16 июля 2009

У меня есть о: Apache Mina

Но, честно говоря, я даже не знаю, нужно ли это вам.

: - /

:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...