0

最初の投稿。Java AppEngineのURLマッピング(Pythonのような機能のため)

私はAndriodゲームのバックエンドにAppEngineのJavaバージョンを使用するモバイルゲーム開発者です。ゲームはJavaで書かれているので、私はAppEngineのJava版を使うと思った。私はAppEngineのPythonバージョンでいくつかの経験をしており、JavaバージョンのAppEngineへのマイグレーション、特にURLマッピングに関していくつかの難しさを発見しています。別の要求ハンドラに異なるURLをマップする

def main(): 
application = webapp.WSGIApplication(
[('/', Main), 
    ('/admin', Admin), 
    ('/setScore', SetScore), 
    ('/getScores', SetScores), 
    ('/getUser', GetUser), 
    ('/getCatelog', GetCatelog) 
]) 

webapp.util.run_wsgi_app(application) 

WSGIアプリケーション:

はPythonでは、これは私がするために使用されたものです。私の質問は、Javaに同等の機能があるのか​​、同様のアプローチがAppEngineのJavaインカネーションのベストプラクティスとみなされるかどうかです。

Javaには、この機能を実現する別の方法がありますか、Javaサーブレットがこのような処理を行うための代替パラダイムがありますか?

私は、web.xmlファイルがあなたにサーブレットにURLをマップする機会を与えることを知っていますが、それが正しい方法かどうかは分かりません。

JavaバージョンのAppEngineのURLをマップして、異なるURLによって異なる機能を実現する標準的な方法は何ですか?

ありがとうございました。

答えて

1

web.xmlのサーブレットへのURLマッピングは基本的なものですが、あなたのために完了する可能性があります。しかし、あなたの実際の意図に応じて、それはかなり面倒かもしれません。

"従来の" WebアプリケーションまたはRESTサービスを作成していますか?そして、あなたが選ぶことのできるフレームワークがたくさんあります。 Appengineでは、私は軽快なフレームワーク、例えばStripesを使用することを学びました。これは私が良い経験をしたものです。

RESTについては、Jerseyをおすすめしますが、他にもオプションがあります。

たとえば、ストライプスでは、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でURLマッピングを行う典型的な方法はweb.xml機能を使用することですが、他の強力な方法があります。期待される。 – rorygames

1

マイrecomendationそれはGAEと準拠のあるクールなフレームワークであり、春3を使用することです。 URLマッピングのためのGAEでそれを使用するにはあなたが持っている:

1ダウンロード春のjarファイルとにコピーWEB-INF/libに

2のweb.xmlディスパッチャサーブレットで定義

<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サーブレットのマッピングを指定します。例では、私は2つの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に処理されるSpringコンテキストファイルを作成し、取得するためにスキャンパスを指定するコントローラ

// 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を作成します。コントローラーのコンテキストに合わせてください。

Dispatcherサーブレット名に従って名前を付け、コントローラーに合わせてスキャン・パッケージを設定します。例がなければそれを扱うことができると思います。

+0

お返事ありがとうございました。それは非常に有望なようです。私は春のフレームワークを調査するつもりです...それは素晴らしいようです。あなたのコード例をありがとうございました。 – rorygames

関連する問題