【问题标题】:URL Mapping in Java AppEngine (for Python-like functionality)Java AppEngine 中的 URL 映射(用于类似 Python 的功能)
【发布时间】:2012-04-28 05:25:06
【问题描述】:

第一次发帖。

我是一名移动游戏开发人员,正在研究将 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,但我不确定这是否是正确的方法。

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

谢谢。

【问题讨论】:

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


    【解决方案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";
        }
    
        ...
    }
    

    【讨论】:

    • 非常感谢您的回复。我准备使用 web.xml 作为我正在搜索的功能的替代品,但这似乎正是我正在寻找的。我的问题的答案似乎是在 App-Engine for Java 中发生 URL 映射的典型方法是通过使用 web.xml 功能,但是还有其他强大的方法可以实现与我更相似的功能预计。
    【解决方案2】:

    我的建议是使用 Spring 3。它是一个很酷的框架,符合 GAE。要将它与 GAE 一起用于 url 映射,您必须:

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

    【讨论】:

    • 非常感谢您的回复。这似乎很有希望。我将研究弹簧框架......看起来很棒。非常感谢您的代码示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2020-09-23
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    相关资源
    最近更新 更多