Java AppEngine中的URL映射(用于类似Python的功能)

时间:2012-04-28 05:25:06

标签: java google-app-engine servlets url-mapping requesthandler

第一篇文章。

我是一名移动游戏开发者,正在研究使用Java版AppEngine作为Andriod游戏的后端。由于游戏是用Java编写的,我想我会使用Java版本的AppEngine。我对AppEngine的Python版本有一些经验,并且在迁移到AppEngine的Java版本时遇到了一些困难,特别是在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文件让你有机会将url映射到servelet,但我不确定这是否正确。

在AppEngine的Java版本中映射URL以使不同的URL触发不同功能的标准方法是什么?

感谢。

2 个答案:

答案 0 :(得分:1)

将URL映射到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";
    }

    ...
}

答案 1 :(得分:1)

我的推荐是使用Spring 3.它很酷的框架符合GAE。要将其与GAE一起用于网址映射,您必须:

1下载Spring jar并将其复制到WEB-INF / lib

2在web.xml中定义Dispatcher 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和/ service开始的所有请求都将在Spring中处理

<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名称命名,并根据控制器设置扫描包。认为你可以在没有例子的情况下处理它。