2012-04-28 38 views
0

第一篇文章。Java AppEngine中的URL映射(用于类Python的功能)

我是一名手机游戏开发者,正在研究如何将Java版AppEngine用于Andriod游戏的后端。由于游戏是用Java编写的,我想我会使用Java版本的AppEngine。我对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) 

的WSGI应用程序将不同的URL映射到不同的请求处理程序。我的问题是Java中是否有等价的功能,或者是否有类似的方法甚至被认为是AppEngine的Java化身中的最佳实践。

Java是否有替代方法来实现这个功能,或者是否有一些替代的范例来说明Java Servlet如何处理这类事情?

我知道web.xml文件为您提供了将urls映射到servelets的机会,但我不确定这是否正确。

在AppEngine的Java版本中,可能会映射不同URL的标准方式是什么?

谢谢。

回答

1

将网址映射到web.xml中的servlet是非常基本的,但可能会为您完成这项工作。但是,根据您的实际意图,这可能非常麻烦。

您正在编写“传统”Web应用程序还是REST服务?然后,有无数的框架可供您选择。对于appengine,我学会了使用轻量级框架,比如Stripes,我已经取得了一些很好的经验。

对于REST,我推荐Jersey,但也有其他选择。

因此,在Stripes中,例如,您使用ActionBeans然后将其映射到URL。这里有一个简单的例子:

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

    public Resolution setScore() { 
     ... 
    } 
} 

编辑:由于您正在编写游戏后端,您可能对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替代我正在寻找的功能,但这看起来确实是我所寻找的。看起来,我的问题的答案是,在App-Engine for Java中通过使用web.xml功能发生URL映射的典型方法,但是还有其他强大的方法可以实现与我的功能更类似的功能预期。 – rorygames 2012-04-29 05:04:08

1

我recomendation是使用Spring 3这是很酷的框架,complient与GAE。与GAE使用它的URL映射,你必须:

1下载春瓶,并将其复制到WEB-INF/lib目录

2在web.xml中定义分发程序Servlet

<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中指定Dispatcher servlet的映射。在例子中,我定义了两个URL映射:所有的请求从/ admin和/服务开始将在春季

<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上下文文件并指定扫描路径来获得在您的控制器的上下文中

根据Dispatcher servlet名称命名并根据您的控制器设置扫描包。认为你可以处理它没有例子。

+0

非常感谢您的回复。这看起来很有希望。我将调查春季框架......这似乎很棒。非常感谢你的代码示例。 – rorygames 2012-04-29 05:20:09