# 如何使用 Java EE 和 Angular 构建单页应用程序
> 原文: [https://javatutorial.net/how-to-build-single-page-application-with-java-ee-and-angular](https://javatutorial.net/how-to-build-single-page-application-with-java-ee-and-angular)
本文介绍如何使用 Angular 和 Java EE 构建自己的单页应用程序
网络世界一直令人眼花乱。 如今,可见网络上有超过 18 亿个页面,其中大多数页面提供了某种想法,业务,原因或互联网上您拥有的任何内容。 每天都有越来越多的人对 Web 感兴趣,而第二者正在创建内容。 然后,您可以了解为什么 Web 开发是目前最繁荣的工作之一。 该技术本身正在迅速发展,以满足用户的需求,并通过更好的沉浸式用户体验超越了它。 这种追求促使 SPA 等技术成为行业领先的技术。 他们的增长惊人,用户似乎对新的升级感到非常满意。 今天,我们将使用 Angular 和 Java EE 构建自己的单页应用程序,为您自己的实现奠定基础。
![](https://img.kancloud.cn/3c/a0/3ca0b4f1aeb3b2df15d6c4f93323fdae_700x443.jpg)
[图像源](https://koukia.ca/going-single-page-app-or-traditional-web-app-cedb10041b50)
## 什么是 SPA?
单页应用程序是一种设计模式,特别是一种确定程序流程的架构设计模式。 这样做的想法是一次加载所有数据和元素,以防止在用户使用页面时刷新页面。 例如,您可能已经注意到,首次加载 Gmail 后,它甚至可以脱机运行,而且运行速度也很快。 Gmail,Facebook,GitHub 和许多其他应用程序使用 SPA 来提供自然的 UX,以保持不受干扰的用法。 如今,这种想法已逐渐发展为一种设计方向,PWA 则采用了相同的概念,即提供几乎自然的离线体验。
![Traditional page lifecycle vs. SPA lifecycle](https://img.kancloud.cn/25/0b/250b241b4ffb325f3e75964006664bf8_550x609.jpg)
传统页面生命周期与 SPA 生命周期
[图像源](https://msdn.microsoft.com/en-us/magazine/dn463786.aspx)
实际上,SPA 的许多优点使其成为开发人员的青睐选择。
例如,使用 SPA,随着编写服务器渲染代码的需求随着 SPA 的消失,开发过程变得越来越容易。 SPA 应用程序直接呈现到浏览器。 将移动应用程序与您的应用程序集成起来比较容易,因为您可以使用相同的网络后端。 当然,大多数资源(如 HTML,CSS 和脚本)在应用程序的生命周期内仅加载一次,这一事实使应用程序变得更快,因为仅在需要时来回传输数据。 这全都归功于 JavaScript 框架为我们完成了大部分繁重的工作。
使用 SPA 确实有一些弊端,例如 SEO 变得有些难以管理,但是在完成应用程序后,我们将讨论如何解决该问题。 今天要使用的框架是著名的 Angular。
## 为什么要 Angular?
好吧,您可能想知道为什么每个人都对 Angular 狂热。 毕竟,目前的排名表明 Angular 是 JS 框架王国的统治者。 它是迄今为止使用最广泛的框架,并且拥有最大的社区之一和大量文档。 Angular 允许我们使用双向数据绑定来构建动态 Web 应用程序。 在电子商务网站上浏览时,您不想每次签出新产品或同一产品的其他版本时都重新加载页面,而 Angular 允许您这样做。 它也很容易构建和调试,因此使用 Angular 可以使测试变得更加容易,这是 Web 开发的核心步骤。 为此,互联网上有许多 [Angular 教程](https://hackr.io/tutorials/learn-angular)和课程,可以从中找到基本信息。
## 为什么选择 Java EE?
Java 企业版是健壮的技术和 API 的分组集合,用于企业级别,以构建可满足关键业务需求和约束的可伸缩,事务性和分布式应用程序。 它旨在使 Java 开发保持最新状态,以满足当今应用程序的标准。 [Java EE](https://javatutorial.net/category/java-ee) 带有大量的规范,可以满足您的需求。 这就是为什么 Java EE 是理想的开始我们创建第一个 SPA 的旅程的原因。 我们将使用 Java 为 Angular 前端创建 REST 服务以供使用。
因此,让我们开始吧。 我们将设计一个简单的应用程序,在表格中显示演员姓名及其著名的昵称。 请注意,为了避免将本文变成 Java/Angular 课程,并且将重点放在 SPA 开发上,将省略一些代码。
## 后端
Java 持久化 API 将使我们能够管理和操纵应用程序和服务器之间的数据。 通过使用`@Entity`注解,我们可以将对象类建模为数据库内部的数据库实体。 您可能已经猜到`@ID`为此关系设置了主键,这是事实。 我们可以使用`@table`表示法来指定某些表属性,例如唯一性约束(数据成员必须是唯一的,即候选键)和表名。 `@namedqueries`允许我们准备某些查询以用于该关系。 然后,我们继续使用构造函数,setter 和 getter 构建基本类。
![Actor Entity class](https://img.kancloud.cn/ba/17/ba17f7db4e5140aa03f5cf7f5cb5f773_908x838.jpg)
演员实体类
我们首先创建 JPA 所需的`persistence.xml`文件,它看起来像这样。 `javax.persistence.schema-generation`不仅使我们能够以自然的方式运行 SQL,而且还可以连接到数据源(如果我们尚未连接到 SQL 源)。 因此,这样做可以省去您的麻烦。
![persistence.xml file](https://img.kancloud.cn/6b/53/6b53702e6838ec769a0166ac650d07a4_1016x346.jpg)
`persistence.xml`文件
这里要做的一件事是创建`Resources`类,以将该数据库公开为资源类。`@Get`表示法定义 HTTP Get 谓词行为,并以一种非常不错的方式格式化 JSON 响应。
![Web-service class](https://img.kancloud.cn/c0/56/c056ec15b5c4c3db8112229a10a02460_894x848.jpg)
网络服务类
## 前端
现在该跳到我们的前端了。 我们将分两个步骤进行操作,首先是 HTML 文件,因为 Angular 扩展了典型的 HTML,并允许我们按照 MVC 设计,使用 Javascript 变量向组件添加自定义数据绑定。
HTML 文件中没有太多代码,这使 Angular 相当有效。 Angular 拥有我们将在此处使用的网格组件,Bootstrap 还提供了外观漂亮的组件集,可供我们使用。
![Angular HTML file](https://img.kancloud.cn/aa/3b/aa3ba63418cf1b6c48a61b6b4547e97b_906x299.jpg)
Angular HTML 文件
现在剩下的唯一事情就是制作一个 Javascript 文件,将所有内容整合在一起。
Javascript 文件将定义客户端行为,并使用我们之前创建的 REST 服务发出 HTTP 请求。 这是程序中真正魔术的体现。
![Angular code](https://img.kancloud.cn/c9/46/c9462f1ea8a128fe63c1af78312074e7_807x656.jpg)
Angular 代码
## Angular SEO 优化
SPA 的核心问题之一是 SEO 优化,这对于某些 SPA 的成功至关重要。 Google 在抓取 Javascript 内容时遇到了问题,尽管他们正在努力,但它还不完全兼容 JS。 有多种方法可以解决此问题,可以手动或使用自定义服务。 这个想法是从您的应用程序创建一个 HTML 快照以直接提供给搜寻器,而不是希望它可以正确理解和索引您的 Angular 代码。 如果您无法手动完成任务,也可以减轻压力,则可以使用预渲染平台来完成任务。 您还可以执行一些辅助操作,例如获取有意义的 URL 名称而不是随机生成的 URL 名称。 维护用户友好的 URL 会反过来给您的用户和应用程序增加很多。 您应该使用一些工具来监视 SPA 的性能,并监视所有需要的更改。
## 总结
回顾一下,我们首先通过 Java 持久化 API 构建数据库,然后创建了 Java 资源类以作为 REST 服务访问数据库,尽管这里我们仅演示了 GET 方法。 在完成了后端之后,我们继续进行前端,我们创建了 HTML 组件文件,这要归功于 AngularJS,它非常简单明了。 最后,Javascript 文件将所有内容组合在一起,为应用程序注入了生命。
Angular 是一个非常强大的框架,它允许您仅用几行代码即可创建完全不同的 UX,这非常令人惊讶。 能够通过 Java RESTful 后端扩展 JS 前端可以增加更多的表格,并提高您作为开发人员的技能。 Angular 越来越流行,谁知道它何时会成为开发标准,与此同时,它是 SPA 领域的第一大统治框架。 请记住,传统网页也有其优点,因此您需要事先确定要遵循的模式。 例如,MPA 更安全,因为它们涉及的客户端脚本更少,并且正如我们之前提到的,它们更易于针对 SEO 进行优化。 在开发中总会有这种折衷,您必须选择一个选择。 但是,SPA 将继续是一个非常强大的选择。
- JavaTutorialNetwork 中文系列教程
- Java 基础
- Java 概述
- 在 Ubuntu 上安装 Java 8 JDK
- Java Eclipse 教程
- Eclipse 快捷方式
- 简单的 Java 示例
- Java 基本类型
- Java 循环
- Java 数组
- Java 读取文件示例
- Java 对象和类教程
- 什么是面向对象编程(OOP)
- Java 封装示例
- Java 接口示例
- Java 继承示例
- Java 抽象示例
- Java 多态示例
- Java 中的方法重载与方法覆盖
- Java 控制流语句
- Java 核心
- 如何在 Windows,Linux 和 Mac 上安装 Maven
- 如何使用 Maven 配置文件
- 如何将自定义库包含到 Maven 本地存储库中
- 如何使用 JUnit 进行单元测试
- 如何使用 Maven 运行 JUnit 测试
- 如何在 Java 中使用 Maven 创建子模块
- 如何使用 Maven 创建 Java JAR 文件
- 如何使用 Maven 创建 Java WAR 文件
- JVM 解释
- Java 内存模型解释示例
- 捕获 Java 堆转储的前 3 种方法
- Java 垃圾收集
- Java 互斥量示例
- Java 信号量示例
- Java 并行流示例
- Java 线程同步
- Java 线程池示例
- Java ThreadLocal示例
- Java 中的活锁和死锁
- Java Future示例
- Java equals()方法示例
- Java Lambda 表达式教程
- Java Optional示例
- Java 11 HTTP 客户端示例
- Java 类加载器介绍
- Java 枚举示例
- Java hashCode()方法示例
- 如何测试独立的 Java 应用程序
- SWING JFrame基础知识,如何创建JFrame
- Java SWING JFrame布局示例
- 在JFrame上显示文本和图形
- 与JFrame交互 – 按钮,监听器和文本区域
- 如何使用 Maven 创建 Java JAR 文件
- Java Collection新手指南
- 选择合适的 Java 集合
- Java ArrayList示例
- Java LinkedList示例
- Java HashSet示例
- Java TreeSet示例
- Java LinkedHashSet示例
- Java EnumSet示例
- Java ConcurrentHashSet示例
- Java HashMap示例
- Java LinkedHashMap示例
- Java TreeMap示例
- Java EnumMap示例
- Java WeakHashMap示例
- Java IdentityHashMap示例
- Java SortedMap示例
- Java ConcurrentMap示例
- Java Hashtable示例
- Java 中ArrayList和LinkedList之间的区别
- Java HashMap迭代示例
- Java HashMap内联初始化
- Java 中HashMap和TreeMap之间的区别
- Java 图示例
- Java 深度优先搜索示例
- Java 广度优先搜索示例
- 不同的算法时间复杂度
- Java 序列化示例
- Java 反射示例
- Java 中的弱引用
- Java 8 日期时间 API
- Java 基本正则表达式
- 使用 Java 检索可用磁盘空间
- Java 生成 MD5 哈希和
- Java 增加内存
- Java 属性文件示例
- 如何在 Eclipse 上安装 Java 9 Beta
- Java 9 JShell 示例
- Java 9 不可变列表示例
- Java 9 不可变集示例
- Java 9 不可变映射示例
- Java 单例设计模式示例
- Java 代理设计模式示例
- Java 观察者设计模式示例
- Java 工厂设计模式
- Java 构建器设计模式
- Java 比较器示例
- Java 发送电子邮件示例
- Java volatile示例
- Java Docker 和 Docker 容器简介
- 安装和配置 MySQL 数据库和服务器以供 Spring 使用
- 如何在 Java 中使用 MySQL 连接器
- 如何使用 Eclipse 调试 Java
- Java EE
- 如何在 Windows 10 中设置JAVA_HOME
- JavaBeans 及其组件简介
- 如何安装和配置 Tomcat 8
- 如何在 Tomcat 中部署和取消部署应用程序
- 从 Eclipse 运行 Tomcat
- Java Servlet 示例
- Java Servlet POST 示例
- Servlet 请求信息示例
- Servlet 注解示例
- 使用初始化参数配置 Java Web 应用程序
- Java Servlet 文件上传
- Java JSP 示例
- Glassfish 启用安全管理
- 如何使用 MySQL 配置 Glassfish 4
- Java 文件上传 REST 服务
- Glassfish 和 Jetty 的 Java WebSockets 教程
- 基于 Glassfish 表单的身份验证示例
- 如何使用 Java EE 和 Angular 构建单页应用程序
- Spring
- 在 Eclipse 中安装 Spring STS
- 使用 STS 创建简单的 Spring Web App
- Spring Web Framework 简介
- Java Docker 和 Docker 容器简介
- 在 Spring 中实现控制器
- Spring 中的PathVariable注解
- Spring 中的RequestBody注解
- Spring 中的RequestParam注解
- Spring 拦截器
- Spring IOC
- Java Spring IoC 容器示例
- Spring 中的DispatcherServlet
- Spring 示例中的依赖注入
- 实现 Spring MVC 控制器
- Spring ORM 简介
- 什么是 DAO 以及如何使用它
- 如何对 DAO 组件进行单元测试
- 如何对控制器和服务执行单元测试
- 安装和配置 MySQL 数据库和服务器以供 Spring 使用
- 如何在 Spring 中处理登录身份验证
- Spring Security 简介及其设置
- 如何使用 Spring 创建 RESTful Web 服务
- Spring CSRF 保护
- Spring 中基于 OAuth2 的身份验证和授权
- Spring Boot 简介
- Spring MVC 框架介绍
- Spring JDBC 简介
- 如何 docker 化 Spring 应用程序
- Spring 的@Autowired注解
- Spring AOP 中的核心概念和建议类型
- Sping Bean 简介
- 如何在 Java 中使用 MySQL 连接器
- 安卓
- 安装和配置 Android Studio
- 将 Android 设备连接到 Android Studio
- Android 简介,活动,意图,服务,布局
- 创建一个简单的 Android 应用
- 运行和调试 Android 应用程序
- 在虚拟设备上运行 Android 应用程序
- Android 活动示例
- Android 意图示例
- Android 服务示例
- Android 线性布局示例
- Android 相对布局示例
- Android Web 视图示例
- Android 列表视图示例
- Android 网格视图示例
- 带有ListAdapter的 Android ListView示例
- Android SQLite 数据库介绍
- Android SQLite 数据库示例
- Android 动画教程
- Android 中的通知
- Android 中的事件处理
- 如何在 Android 中发送带有附件的电子邮件
- 杂项
- 选择您的 JAVA IDE:Eclipse,NetBeans 和 IntelliJ IDEA
- Java S3 示例
- 如何在 Ubuntu 上为多个站点配置 Apache
- 如何在 Liferay DXP 中替代现成的(OOTB)模块
- 简单的 Git 教程
- 使用 Java 捕获网络数据包
- Selenium Java 教程
- 使用特定工作区运行 Eclipse
- 在 Eclipse 中安装 SVN
- 如何运行 NodeJS 服务器
- SQL 内连接示例
- SQL 左连接示例
- SQL 右连接示例
- SQL 外连接示例
- 树莓派
- Raspberry Pi 3 规格
- 将 Raspbian 安装到 SD 卡
- Raspberry Pi 首次启动
- 远程连接到 Raspberry Pi
- 建立 Raspberry Pi 远程桌面连接
- Raspberry Pi Java 教程
- 使用 PWM 的 Raspberry Pi LED 亮度调节
- Raspberry Pi 控制电机速度
- Raspberry Pi 用 Java 控制直流电机的速度和方向