単一ページのアプリケーションでのリモートサービスメソッドの単純な呼び出し

この記事では、クライアントとサーバーの対話を整理するための私のアプローチを、単一ページのブラウザーアプリケーションでJavaのサーバー側と共有したいと思います。



要するに、このアプローチを「Json Remote Service Procedure Call」-JRSPCと呼びます。 (おそらくあまり調和的ではありませんが、曲から単語を消去することはありません。)



jrspcの使用-クライアントおよびサーバーでのサービスインターフェイス定義のレイヤーの使用を排除し、コードの量を減らし、リファクタリングを簡素化し、エラーの可能性を減らします。

このアプローチを使用すると、ビジネスロジックを担当するコードのみを記述でき、

新しいビジネスメソッドを定義するときに追加のコードは必要ありません。



たとえば、サーバーでは、ビジネスメソッドの定義は次のようになります。



@Component("testService") public class TestService{ @Remote public String testMethod(Long userId, String role, boolean test, List<User> users, User user){ ... return "ok"; } }
      
      







クライアントでの呼び出しは次のようになります。



 var params = [userId, role, true, [{id:1, login:"111"}, {id:2, login:"222"} ], {id:3, login:"333"}] Server.call("testService", "testMethod", params, sucessCallback, errorCallback, controlWhichWillDisabledUntilResponse);
      
      







それ以上に、メソッドを定義するとき、コードはどこにも書かれていません。





仕組み



トランスポートレベルで、jrspc-json-rpcを使用し、メソッドだけでなくサービスも呼び出しで指定できます。 したがって、このようなjson-rpcはjson-rspc(s-service)と呼ばれる可能性があります。



仕様が存在する場合、 json-rpc 2.0仕様に似ていますが、サービスフィールドがリクエストオブジェクトに追加され、idフィールドがオプションになり、答えが-オプションのerrorCode。



デモのために、登録、ログイン、およびユーザーデータとユーザー権限の変更を実装する簡単なデモアプリケーション作成しました。



クライアント部



このアプリケーションのクライアント部分は、 AngularJSフレームワークで記述されています。

警告
(まだ書いていない人に警告するのは私の義務だと思います:

{{user.name}}、Angularはハードドラッグです!

それに夢中になるには、バズを一度だけキャッチすれば十分です。)



設計には、 ブートストラップが使用されます。



バックエンドでは、 Spring



jsonオブジェクトの実装として、 json-libライブラリのJSONObject



が使用されます。



クライアント部分は3つのファイルで構成されています。



ajax-connector.js



Server



オブジェクトにカプセル化されたサーバー要求メカニズムの実装。

(ajaxプレフィックスは、web-socket ws-connector.jsと区別するために使用されます。これにより、user-controller.jsコードを変更せずに置き換えることができます。)



user-controller.js



以下は、 userController



関数にカプセル化されたアプリケーションのビジネスロジックです。



application.html





要素ロックロジックを備えたアプリケーションGUI。



ご覧のとおり、スクリプトコードのビューでは、リモートサーバーはサーバーオブジェクトのように見えます。これは、URLで初期化する必要があります。



このオブジェクトを介して、サーバー上の任意のコンポーネントにアクセスし、次の方法でそのメソッドを呼び出すことができます。



Server.call(serviceName, mathodName, [param1, param2, ...], successCallBack, errorCallback, control);







回答またはエラー-適切なコールバックに来てください。



サーバーに新しいサービスまたはメソッドを追加しても、クライアントコードには何の影響もありません。これらのサービスとメソッドは、サーバーコードに表示された直後に呼び出すことができます。



当然、「誰にでも」と言って-私は少し真実から離れました。

実際、リモートサービスとしては、 AbstractService



から派生したクラスのみを呼び出すことができ、リモートで呼び出されるメソッドには@Remote



によって注釈を付ける必要があります。



メソッドへのアクセス権を制限するために、アノテーション@Secured(roleName)



ます。

そのため、たとえば、 @Secured("Admin")



アノテーションが付けられたメソッドは、 "User"ロールを持つユーザーが呼び出すことはできません。



サーバー部



サーバー全体の「フレームワーク」は、いわば、9 kb未満です。また、6つのクラスで構成されています。そのうち2つは、すでに注釈でよく知られています: RemoteSecuredAbstractService-

すべてのサービスを継承する抽象クラス、およびCommonServiceController



彼のメソッドprocessAjaxRequest



リクエストはService



スクリプトオブジェクトからprocessAjaxRequest



ます。



次に、サービスの名前によるコンポーネントがあり、その上に、アクセス権を確認した後、反射的に、指定されたメソッドが呼び出されます。



User(エンティティ)は、ユーザーに関するデータを保存し、 UserManagerは、 User



オブジェクトをUser



した操作(永続性のエミュレーションを使用したテスト実装を保存します。



ビジネスロジックは、2つのサービスで実装されます。TestUserService-データの登録、ログイン、および編集のためのメソッドを持つサービスと、 TestAdminService-ユーザーの削除およびロールの変更のためのメソッドを持つサービスです。



コードは可能な限り自明であるため、理解が容易になることを願っています。



Githubデモコード



次は?



次の記事では、このアプローチに基づいて、Webソケットを介したクライアントとサーバーの相互作用を整理する方法、およびサーバー上でWebソケットコンテキストからHTTPセッションを取得する方法を作成する予定です。



Update2:

Update1-記事の本文に移動しました。



All Articles