昨日、Tomcat とサーブレットを初めて使用してみました (IIS/C#/MVC 出身です)。
AngularJS と Guice も使用しています。
単一のメソッドを持つサーブレットを作成しました。
@Singleton
@SuppressWarnings("serial")
public class CommandServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println(req.getParameterMap());
}
}
次のようなサービスを Angular で作成しました。
app.factory('console', [ '$http', function($http) {
var console = {};
console.execute = function(gameId, command) {
$http.post("Command/", {
gameId : gameId,
command : command
}).success(function(data, status, headers, config) {
}).error(function(data, status, headers, config) {
});
};
return console;
} ]);
私のコントローラーでは、サービスを注入し、スコープの「実行」関数を介してビューに公開します。
app.controller('PlayController', function($scope, console) {
$scope.consoleIn = "";
$scope.gameId = 1;
$scope.execute = function(command) {
$scope.consoleOut = console.execute($scope.gameId, command);
};
});
私の見解では、関数を呼び出して入力要素からテキストを渡すボタンがあります。
<input ng-model="consoleIn" type="text">
<button class="btn" type="button" ng-click="execute(consoleIn)">Go!</button>
何らかの理由で、Tomcat サーバーのコンソールは{}
、POST 要求でパラメーターが渡されずに空のマップ () を出力しています。Chrome のコンソールの [ネットワーク] タブを見て、パラメータが送信されていることを確認すると{"gameId":1,"command":"a"}
(getParameterMap()
私は正しいことをしているのですが、ブラウザが行ったリクエストがサーブレットに正しく到達していないために、何が間違っているのでしょうか?
編集:
Javaのデフォルトのサーブレットの代わりにJerseyをコンテナとして使用することになりました(私はそれが呼ばれていると思います)。これを行ったのは、Jersey が Guice を使用して Google で頻繁に表示されるのを見て、この 2 つを連携させるのに十分なドキュメントがあると考えたからです。いくつかの例があり、私はいくつか、特にこれを描きました。
私がそれを機能させるために遭遇した障害はこれでしたが、今ではすべて順調です。
全体として、DI に Guice が好きで、Java Web サイトを作成したい場合は、Jersey が適していると言えます。通常のサーブレットとは異なる、RESTful サービスのより専門的な機能のためのようですが、とにかくそれが必要でした。Tomcat に加えて、Grizzly と Jetty も人気があります。Tomcat に問題がある場合は、それらを調べることをお勧めします。
この編集によって、私が昨日と今日、作業に費やした時間を誰かが節約できることを願っています。