Spring MVCバックエンドで単一ページアプリケーションを作成したい。私はAngular.jsを学んだばかりです。
2つのリンクで構成される左側のメニューがあります。
下のコントローラーにリクエストを送信します。このコントローラーは、URL転送を行い、指定されたモデル属性によって満たされる何かの詳細をリストします。
@RequestMapping(value = "{id}/rev/{rid}/detail", method = RequestMethod.GET)
public String detail(@PathVariable("id") Project project, @PathVariable("rid") Rev rev, Model model, HttpSession session) {
User user = ((User) session.getAttribute(CSession.USER));
model.addAttribute("project", project);
model.addAttribute("rev", rev);
model.addAttribute("cont", revContBS.getRevCont(rev, user));
return "template/detail";
}
もう1つは、JSONを返すコントローラーにajax呼び出しを行います。
@RequestMapping(value = "file/{fid}", method = RequestMethod.GET)
public @ResponseBody String getFile(@PathVariable("fid") FV fv) {
return repBS.getVerCon(fv);
}
現在、装飾があります。ヘッダー、左側のメニュー、メインコンテンツ領域です。最初のリンクをクリックすると、ページ全体が更新されます(ページ転送とjspテンプレート化が行われるため)。2番目のリンクをクリックすると、メインコンテンツ領域のみが変更されます。
コンテンツ領域のみを変更する必要があるため、最初のリンクの動作を変更します。 Angular.JS + Spring MVCで可能ですか?つまり、私は春のMVCからページをリクエストします。これは、指定されたモデル属性で「template/detail.jsp」をテンプレート化します。ただし、このページをng-appのコンテンツ領域に配置します。
現在、次の分野で問題があります。
AngularJSのディレクティブng-viewは、現在のルートに関連付けられたテンプレートをHTMLページにレンダリングするために使用されます。主なポイントは、テンプレートをクライアント側のみで管理する必要があるということです。
ここでやろうとしているのは、Spring MVCを使用してテンプレートサーバー側をレンダリングすることですが、これはAngularJSを使用した単一ページアプリケーションのアイデアではありません。
代わりに、Spring mvcコントローラーはjsonオブジェクトのみを返す必要があります。RESTfulサービスを記述し、AngularJSを使用してテンプレートをレンダリングし、モデルを取得します。
ユースケースの完全な例を次に示します。
index.html:
<html ng-app="myApp">
<head>
</head>
<body>
<!-- Your menu -->
<ul>
<li><a href="#/project/1/rev/1">Project 1 - Rev 1</a></li>
<li><a href="#/project/1/rev/2">Project 1 - Rev 2</a></li>
</ul>
<!-- Your content -->
<div ng-view>
</div>
</body>
</html>
テンプレート( "template/detail.html")
<div>Id of project : {{project.id}}</div>
あなたのangular application:
angular.module('myApp', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
// Bind your route with your template and associated controller
// Your template will be loaded into ng-view area
when('/project/:projectId/rev/:revId', { templateUrl: 'template/detail.html', controller: MyController }).
// Default route
otherwise({redirectTo: '/'});
}]);
function MyController($scope, $routeParams, $http) {
// Use $routeParams to get parameter from your current route
var projectId = $routeParams.projectId,
revId = $routeParams.revId;
// Here I use $http API from AngularJS but ng-resouce may be easier to use
// when you have to deal with rest resources
$http.get('project/' + projectId + 'rev/' + revId).success(function(data) {
$scope.project = data.project;
$scope.rev = data.rev;
});
}
RESTサービスのあるSpring MVCコントローラー:
@RequestMapping(value = "{id}/rev/{rid}/detail", method = RequestMethod.GET)
@ResponseBody
public Map<String, Object> detail(
@PathVariable("id") Project project,
@PathVariable("rid") Rev rev,
HttpSession session) {
User user = ((User) session.getAttribute(CSession.USER));
// I use a map for the example but you should probably use a "real" object
// The idea here is that you return a rest resource
Map<String, Object> map = new HashMap<String, Object>();
map.put("project", project);
map.put("rev", rev);
map.put("cont", revContBS.getRevCont(rev, user));
return map;
}
より複雑なルーターが必要な場合は、AngularUIプロジェクトをご覧ください。