第一篇文章。
我是一名移动游戏开发人员,正在考虑将 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 文件让您有机会将 url 映射到 servlet,但我不确定这是否是正确的方法。
在 Java 版本的 AppEngine 中映射 URL 以具有由不同 URL 触发的不同功能的标准方法是什么?
谢谢。
URL映射到web中的servlet.xml是非常基本的,但可能会为您完成工作。但是,根据您的实际意图,它可能非常麻烦。
您是在编写"传统"Web 应用程序还是 REST 服务?然后,您可以选择无数的框架。对于appengine,我学会了使用轻量级框架,例如Stripes,我已经取得了一些很好的经验。
对于REST,我推荐Jersey,但还有其他选择。
因此,例如,在条纹中,您可以使用ActionBeans
然后映射到 URL。下面是一个简单的示例:
@UrlBinding( "/main/score/{$event}" )
public class ScoreActionBean extends AbstractActionBean {
public Resolution getScores() {
...
}
public Resolution setScore() {
...
}
}
编辑:由于您正在编写游戏后端,因此您可能对REST服务更感兴趣?那里有一些很好的教程,但为了给你一个印象,它与上面的例子非常相似:
@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";
}
...
}
我的建议是使用 Spring 3。这是一个很酷的框架,符合 GAE。要将其与 GAE 一起使用以进行 url 映射,您必须:
1 下载 Spring jars 并将其复制到 WEB-INF/lib
2 在 Web 中定义.xml调度程序 servlet
<servlet>
<servlet-name>spring-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
3 在 Web 中.xml指定调度程序 servlet 的映射。在示例中,我定义了两个 url 映射:所有从/admin 和/service 开始的请求都将在 Spring 中处理
<servlet-mapping>
<servlet-name>myspring</servlet-name>
<url-pattern>/admin/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>myspring</servlet-name>
<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 上下文文件并指定扫描路径以进入控制器上下文
根据调度程序 Servlet 名称命名它,并设置与控制器协调的扫描包。认为你可以在没有例子的情况下处理它。