2012-04-22 3 views
2

Что я ищу - это какой-то класс или аннотация, которые я могу добавить к классам Java, которые предназначены для обработки определенных запросов, и сопоставление URL-адресов с ними на основе их имени. Например, сопоставьте URL-адрес «.../api/GetContactsRequest» с обработчиком с именем GetContactsRequest (или 404, если такой обработчик не существует). Я знаю, что могу писать сервлеты и сопоставлять каждый URL-адрес каждого сервлета, но я считаю, что менее схематичный код/​​конфигурация маршрутизации, тем лучше! В основном это будут обработчики запросов приложений, обменивающиеся данными с помощью JSON. Я не понял, как я буду обрабатывать статические запросы, но я, скорее всего, просто отправлю большое веб-приложение на пользователя, который переводит себя или что-то в этом роде.Как динамически сопоставлять URL-адреса с обработчиками сервлетов Java на основе их имен? (Google App Engine)

Для фона я использую Google App Engine, поэтому у меня есть доступ к конфигурациям yaml и их API-интерфейсам сервлета. Итак, есть ли стандартный способ сделать это с помощью API-интерфейсов сервлетов Java или инфраструктуры приложения Google App Engine? Я только когда-либо использовал определенные структуры сервлетов Java, такие как Apache и прочее, которые были уже созданы к моменту начала работы над ними, поэтому я действительно не знаю, что нужно использовать с этой средой. Я также новичок в этом в целом и испытываю трудности с тем, что Servlets, Services, Filters, Listeners и Handlers - все это, и что лучше всего подходит для этого простого поведения маршрутизации, которое я хочу/нуждаюсь. Я волнуюсь, что я заберу неправильный или даже не знаю того, что подходит моим потребностям.

ответ

5

Это то, что делает JAX-RS - не совсем сопоставление имен классов, а отображение через аннотации. См. some of the features.

Существует несколько вариантов реализации, лично я использую RESTEasy - он работает безупречно на GAE. Кроме того, я использую Jackson (поставляется с RESTEasy) для производства JSON.

Если вам нужно произвести html, то посмотрите на htmleasy - это тонкий слой поверх RESTEasy, позволяющий использовать различные библиотеки шаблонов html. Это поможет вам отделить логику от презентации.

EDIT:

Если вы действительно хотите, чтобы избежать использования стандартных библиотек и в письменной форме что-то по своему усмотрению, а затем написать сервлет фильтр, который проверяет запрос и направляет его в сервлет (или вызывать пользовательский код):

public class ForwardFilter implements Filter { 

    @Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) { 

     if(request.getRequestURI().equals("/some/path")){ 
      request.getRequestDispatcher("/path/where/servlet/registered").forward(request, response); 
      return; // prevents normal request processing 

     } 

     // you need this for normal request path 
     filterChain.doFilter(request, response); 
    } 
} 
+0

Действительно ли нет возможности встроить в Java или GAE, как есть? Чем меньше стороннего кода я должен добавить и понять, тем лучше! Тем более, что добавление библиотек обычно означает больше шаблонов. – Jomasi

+0

Одна из аксиом успешных кодеров - «стоять на плечах гигантов», что означает код повторного использования, который сделали другие умные люди. На самом деле, писать код, в котором другие уже достаточно решили проблему, считается большой ошибкой в ​​программировании (ака заново изобрести колесо). Вы не должны беспокоиться об использовании сторонних библиотек, особенно если они основаны на стандартах (JAX-RS - это стандарт Java), открытый и поддерживаемый уважаемыми людьми/компаниями. –

+0

Я понимаю это, но в то же время я просто хочу убедиться, что я не добавляю ничего лишнего, т. Е. Если то, что я хотел, уже существовал в стандартной Java или GAE. Я просмотрел его немного больше и чувствую себя более комфортно, если он считается стандартной библиотекой. Благодаря! :) – Jomasi