0

Первое сообщение.Картирование URL-адресов в Java AppEngine (для Python-подобных функций)

Я разработчик мобильных игр, изучая использование Java-версии AppEngine для бэкэнда игры Andriod. Поскольку игра написана на Java, я решил, что буду использовать версию AppEngine для Java. У меня есть некоторый опыт работы с Python-версией AppEngine, и я затрудняюсь в моей миграции на Java-версию AppEngine, особенно в отношении сопоставления URL-адресов.

В Python, это то, что я привык:

def main(): 
application = webapp.WSGIApplication(
[('/', Main), 
    ('/admin', Admin), 
    ('/setScore', SetScore), 
    ('/getScores', SetScores), 
    ('/getUser', GetUser), 
    ('/getCatelog', GetCatelog) 
]) 

webapp.util.run_wsgi_app(application) 

The WSGI приложение будет привязывать различные URL-адрес для различных обработчиков запросов. Мой вопрос заключается в том, есть ли эквивалентная функциональность в Java или если подобный подход даже считается наилучшей практикой в ​​воплощении Java AppEngine.

Есть ли у Java альтернативный способ достижения этой функциональности или есть какая-то альтернативная парадигма для того, как Java Servlets справляются с такими вещами?

Я знаю, что файл web.xml дает вам возможность сопоставлять URL-адреса для сервисов, но я не уверен, что это правильный способ.

Каков стандартный способ сопоставления URL-адресов в Java-версии AppEngine для разной функциональности, инициируемой разными URL-адресами?

Спасибо.

ответ

1

Отображение URL-адресов сервлетов в web.xml является довольно простым, но может быть выполнено для вас. Однако, в зависимости от вашего фактического намерения, это может быть довольно громоздким.

Вы пишете «традиционное» веб-приложение или услугу REST? Тогда есть огромное количество фреймворков, которые вы могли бы выбрать. Для appengine я научился использовать легкие рамки, такие как Stripes, с которыми я хорошо поработал.

Для ОТДЫХА я рекомендую Jersey, но есть и другие варианты.

Итак, в Stripes, например, вы используете ActionBeans, которые затем сопоставляются с URL-адресами. Вот простой пример:

@UrlBinding("/main/score/{$event}") 
public class ScoreActionBean extends AbstractActionBean { 
    public Resolution getScores() { 
     ... 
    } 

    public Resolution setScore() { 
     ... 
    } 
} 

Edit: так как вы пишете игру бэкенд, вы можете быть более заинтересованы в службе REST? Есть some good tutorials там, но, чтобы дать вам впечатление, что это очень похоже на примере выше:

@Path("/hello") 
public class Hello { 

    // This method is called if TEXT_PLAIN is request 
    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String sayPlainTextHello() { 
     return "Hello Jersey"; 
    } 

    ... 
} 
+0

Большое вам спасибо за ваш ответ. Я был готов использовать web.xml в качестве замены той функциональности, которую я искал, но это похоже на то, что я искал. Кажется, что ответ на мой вопрос заключался в том, что типичный метод сопоставления URL-адресов в App-Engine для Java - это использование функциональности web.xml, но есть и другие мощные способы достижения функциональности, более похожие на то, что я ожидается. – rorygames

1

Моя рекомендация заключается в использовании Spring 3. Это круто структура, которая является complient с GAE. Для того, чтобы использовать его с GAE для отображения URL-адресов, вы должны:

1 Скачать Весенние банки и скопируйте его в WEB-INF/Lib

2 Определение в web.xml Диспетчерский сервлета

<servlet> 
    <servlet-name>spring-servlet&lt;/servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class> 
    <load-on-startup>1&lt;/load-on-startup> 
</servlet> 

3 В web.xml указывается сопоставление для сервлета диспетчера.В примере я определяю два URL-адрес отображения: все запросы, начиная с/администратора и/услуги будут обрабатываться весной

<servlet-mapping> 
    &lt;servlet-name>myspring</servlet-name> 
    &lt;url-pattern>/admin/*</url-pattern> 
</servlet-mapping> 

<servlet-mapping> 
    &lt;servlet-name>myspring</servlet-name> 
    &lt;url-pattern>/service/*</url-pattern> 
</servlet-mapping> 

4 Создать контроллеры

// This controller process /admin addreses: 
@Controller 
public class AdminController { 

    @RequestMapping(value="/admin", method = RequestMethod.GET) 
    public String getAdminPage(HttpServletRequest request) { 
     return "/pages/admin/admin.jsp"; 
    } 

} 

// This controller process /service addreses. Method getServicePage implements some 
// RESTfull idea. You put in address id /service/123 and it return a page for this 
// service 
@Controller 
public class ServiceController { 

    @Autowired 
    private ServiceDao serviceDao; 

    @RequestMapping(value="/service", method = RequestMethod.GET) 
    public String getServicesListPage(HttpServletRequest request) { 
     return "/pages/servise/service-list.jsp"; 
    } 

    @RequestMapping(value="/service/{serviceId}", method = RequestMethod.GET) 
    public String getServicePage(HttpServletRequest request, 
     @PathVariable(value = "serviceId") int serviceId) { 
     Service service = serviceDao.get(serviceId); 
     request.setAttribute("service", service); 
     return "/pages/servise/service.jsp"; 
    } 

} 

5 Создать Spring файл контекста и указать путь сканирования, чтобы получить в ваш контроллер

Назовите его в соответствии с именем сервлета диспетчера и установите пакет сканирования в соответствии с вашим контроллером. Думайте, что вы можете справиться с этим без примеров.

+0

Большое вам спасибо за ваш ответ. Это кажется очень многообещающим. Я буду исследовать весенний каркас ... это кажется замечательным. Большое вам спасибо за примеры кода. – rorygames