我正在从这个示例https://github.com/xvitcoder/spring-mvc-angularjs开始进行类似的实现。与样品的主要区别
a) 将所有 AngularJS HTML 文件放在 webapp/WEB-INF/views 下
b) 在 /views 上映射一个 Spring ViewResolver。我们正在使用 Velocity,但您可以使用 freechart 或任何视图技术。
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath" value="/WEB-INF/views/">
</bean><!-- see xvitcoder sample for the complete web.xml-->
c) 有一个控制器来响应您的 HTML 部分请求。神奇的是客户端 URL 不需要匹配物理文件夹结构。当您有一个静态 html 项目时,这是缺少的东西。
@RequestMapping("dummypath/{folder}/{remainder}")
public String getSomePartial(@PathVariable("folder") String folder,
@PathVariable("remainder") String path) {
return folder + "/" + path;
}
dummpypath 允许将 AngularJS 部分请求(ngInclude、ngView)与其他请求(如 servlet 或 REST 服务)隔离开来。HTML 文件实际上仍在 /views/folder/path 下。你可以做更复杂的事情,比如计算不同的视图名称。
<div ng-include="dummypath/summary/table.html"></div>
将加载 views/summary/table.html 文件。您的 ViewResolver 将预先处理此文件,允许一些服务器端修复。
d) 从 Spring MVC 向 angularjs 传递参数的示例。在 Spring Controller 中定义查询并返回一个 html 文件
@RequestMapping
public String getPage(@RequestParam(value="someparam", defaultValue="0") string myparam,
ModelMap model){
model.addAttribute("someparam", myparam)
return "index"; //index.html
}
在 AngularJs 控制器中注入 $location 以检索参数。
$scope.someparam = ($location.search()).someparam
加载索引后,我们就进入了 Angular 生态系统!我正在使用这种方法在保留上下文的同时刷新网页。根据查询参数,您可以加载一些 JSON 内容或将 ngSwitch 放在正确的部分。
e) 优点和缺点
优点:你不能总是用静态文件 + REST 构建一个完整的解决方案
缺点:测试和构建项目需要额外的步骤。您需要在 WAR 中捆绑东西,在外部和内部测试它们。