第一篇文章。
我是一名移动游戏开发者,正在研究使用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触发不同功能的标准方法是什么?
感谢。
答案 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</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
3在web.xml中指定Dispatcher 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上下文文件并指定扫描路径以进入控制器上下文
根据Dispatcher servlet名称命名,并根据控制器设置扫描包。认为你可以在没有例子的情况下处理它。