2012-04-28 18 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