angular java_带有Angular JS的Java EE 7 –第1部分

angular java

今天的帖子将向您展示如何使用Java EE 7和Angular JS构建一个非常简单的应用程序。 在去那里之前,让我告诉您一个简短的故事:

我必须承认,我从来都不是Java语言的忠实拥护者,但是我仍然记得我第一次使用它。 我不记得确切的年份,但大概是90年代中期。 我的页面上有3帧(是的帧!还记得吗?那段时间很受欢迎),当我单击第3帧上的链接时,我想重新加载2帧。 当时,Javascript被用来在网页上做一些花哨的事情,并不是每个浏览器都支持Javascript,甚至有些浏览器甚至要求您打开它。 快速发展到今天,景观发生了巨大变化。 Javascript现在是完整的开发堆栈,您可以开发仅用Javascript编写的整个应用程序。 对我来说不幸的是,有时我仍然认为我回到了90年代,并且对Javascript的评价不高,因此这是我尝试更好地了解Javascript的尝试。

为什么选择Java EE 7?

好吧,我喜欢Java,新的Java EE版本非常不错。 使用Wildfly或Glassfish时 不会太详细,速度很快。 它为您提供了满足您需要的大量规范,这是Java世界的标准。

为什么选择Angular JS?

我可能正在关注有关Angular的大肆宣传。 由于我对Javascript的经验不足,所以我不太了解这些提议,因此我只是听从一些朋友的建议,并且我也注意到上一个Devoxx对Angular的广泛接受。 每个进行Angular演讲的房间都坐满了,所以我想尝试一下,自己找个机会。

应用程序

对于应用程序,这是一个带有分页的简单列表,以及一个提供列表数据的REST服务。 每次我启动一个新的企业项目时,通常通常是我们编写代码的第一件事:创建表,存储一些数据并列出一些随机数据,所以我认为这是适当的。

设置

  • Java EE 7
  • 角JS
  • ng-grid
  • UI引导程序
  • 野蝇

代码(最终!)

后端– Java EE 7

从后端开始,让我们定义一个非常简单的Entity类(为简单起见,省略了一些代码):

人.java

@Entity
public class Person {@Idprivate Long id;private String name;private String description;}

如果您不熟悉Java EE JPA规范,则可以通过使用注释@Entity连接到具有相同名称的数据库表和使用注释@Id标识表主数据库来将对象类建模到数据库表中键。

接下来是persistence.xml

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"xmlns="http://xmlns.jcp.org/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"><persistence-unit name="myPU" transaction-type="JTA"><properties><property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/><property name="javax.persistence.schema-generation.create-source" value="script"/><property name="javax.persistence.schema-generation.drop-source" value="script"/><property name="javax.persistence.schema-generation.create-script-source" value="sql/create.sql"/><property name="javax.persistence.schema-generation.drop-script-source" value="sql/drop.sql"/><property name="javax.persistence.sql-load-script-source" value="sql/load.sql"/></properties></persistence-unit>
</persistence>

我在Java EE 7上最喜欢的两个新功能:现在,您可以使用属性javax.persistence.schema-generation.*以标准方式运行sql,并且如果您不提供默认数据源,它还将您绑定到默认数据源。 因此,在这种情况下,将为我们的应用程序使用内部Wildfly H2数据库。

最后,要提供列表数据,我们需要查询数据库并将其公开为REST服务:

PersonResource.java

@Stateless
@ApplicationPath("/resources")
@Path("persons")
public class PersonResource extends Application {@PersistenceContextprivate EntityManager entityManager;private Integer countPersons() {Query query = entityManager.createQuery("SELECT COUNT(p.id) FROM Person p");return ((Long) query.getSingleResult()).intValue();}@SuppressWarnings("unchecked")private List<Person> findPersons(int startPosition, int maxResults, String sortFields, String sortDirections) {Query query = entityManager.createQuery("SELECT p FROM Person p ORDER BY " + sortFields + " " + sortDirections);query.setFirstResult(startPosition);query.setMaxResults(maxResults);return query.getResultList();}public PaginatedListWrapper<Person> findPersons(PaginatedListWrapper<Person> wrapper) {wrapper.setTotalResults(countPersons());int start = (wrapper.getCurrentPage() - 1) * wrapper.getPageSize();wrapper.setList(findPersons(start,wrapper.getPageSize(),wrapper.getSortFields(),wrapper.getSortDirections()));return wrapper;}@GET@Produces(MediaType.APPLICATION_JSON)public PaginatedListWrapper<Person> listPersons(@DefaultValue("1")@QueryParam("page")Integer page,@DefaultValue("id")@QueryParam("sortFields")String sortFields,@DefaultValue("asc")@QueryParam("sortDirections")String sortDirections) {PaginatedListWrapper<Person> paginatedListWrapper = new PaginatedListWrapper<>();paginatedListWrapper.setCurrentPage(page);paginatedListWrapper.setSortFields(sortFields);paginatedListWrapper.setSortDirections(sortDirections);paginatedListWrapper.setPageSize(5);return findPersons(paginatedListWrapper);}
}

该代码与普通的Java POJO完全一样,但是使用Java EE批注来增强行为。 @ApplicationPath("/resources")@Path("persons")将在url yourdomain/resources/persons处公开REST服务, @GET标记要由http GET方法和@Produces(MediaType.APPLICATION_JSON)调用)的逻辑@Produces(MediaType.APPLICATION_JSON)将REST响应格式化为JSON格式。 只需几个注释就可以了。

为了更容易地交换分页列表所需的信息,我还创建了以下包装器类:

PaginatedListWrapper.java

public class PaginatedListWrapper<T> {private Integer currentPage;private Integer pageSize;private Integer totalResults;private String sortFields;private String sortDirections;private List<T> list;
}

我们已经完成了后端工作。

UI – Angular JS

为了显示数据,我们将使用Angular JS。 Angular通过附加的自定义标签属性扩展了传统HTML,以遵循MVC方法来绑定以Javascript变量表示的数据。 因此,让我们看一下我们的html页面:

index.html

<!DOCTYPE html>
<!-- Declares the root element that allows behaviour to be modified through Angular custom HTML tags. -->
<html ng-app="persons">
<head><title></title><script src="lib/angular.min.js"></script><script src="lib/jquery-1.9.1.js"></script><script src="lib/ui-bootstrap-0.10.0.min.js"></script><script src="lib/ng-grid.min.js"></script><script src="script/person.js"></script><link rel="stylesheet" type="text/css" href="lib/bootstrap.min.css"/><link rel="stylesheet" type="text/css" href="lib/ng-grid.min.css"/><link rel="stylesheet" type="text/css" href="css/style.css"/>
</head><body><br><div class="grid"><!-- Specify a JavaScript controller script that binds Javascript variables to the HTML.--><div ng-controller="personsList"><!-- Binds the grid component to be displayed. --><div class="gridStyle" ng-grid="gridOptions"></div><!--  Bind the pagination component to be displayed. --><pagination direction-links="true" boundary-links="true"total-items="persons.totalResults" page="persons.currentPage" items-per-page="persons.pageSize"on-select-page="refreshGrid(page)"></pagination></div>
</div></body>
</html>

除了Javascript和CSS声明外,其中几乎没有代码。 非常令人印象深刻。 Angular也有大量现成的组件,因此我使用ng-grid来显示数据和提供分页组件的UI Bootstrap 。 ng-grid也具有分页组件,但是我更喜欢UI Bootstrap分页组件。

仍然缺少一些东西。 发生所有情况的Javascript文件:

person.js

var app = angular.module('persons', ['ngGrid', 'ui.bootstrap']);
// Create a controller with name personsList to bind to the html page.
app.controller('personsList', function ($scope, $http) {// Makes the REST request to get the data to populate the grid.$scope.refreshGrid = function (page) {$http({url: 'resources/persons',method: 'GET',params: {page: page,sortFields: $scope.sortInfo.fields[0],sortDirections: $scope.sortInfo.directions[0]}}).success(function (data) {$scope.persons = data;});};// Do something when the grid is sorted.// The grid throws the ngGridEventSorted that gets picked up here and assigns the sortInfo to the scope.// This will allow to watch the sortInfo in the scope for changed and refresh the grid.$scope.$on('ngGridEventSorted', function (event, sortInfo) {$scope.sortInfo = sortInfo;});// Watch the sortInfo variable. If changes are detected than we need to refresh the grid.// This also works for the first page access, since we assign the initial sorting in the initialize section.$scope.$watch('sortInfo', function () {$scope.refreshGrid($scope.persons.currentPage);}, true);// Initialize required information: sorting, the first page to show and the grid options.$scope.sortInfo = {fields: ['id'], directions: ['asc']};$scope.persons = {currentPage : 1};$scope.gridOptions = {data: 'persons.list',useExternalSorting: true,sortInfo: $scope.sortInfo};
});

Javascript代码非常干净且井井有条。 请注意如何将所有内容添加到应用程序控制器中,从而使您可以将业务逻辑上的关注点多重分离。 为了实现所需的行为,我们只需要添加一些函数即可通过调用REST服务来刷新列表,并监视网格数据以刷新视图。 这是最终结果:

javaee7-angular-list

下一步:

对于与这些系列相关的以下帖子,我打算:

  • 实施过滤
  • 实施细节视图
  • 实施下一个/上一个浏览
  • 部署在云端
  • 管理Javascript依赖项

资源资源

您可以从我的github存储库中克隆完整的工作副本,然后将其部署到Wildfly。 您可以在此处找到有关部署它的说明。 也应该在Glassfish上工作。

Java EE – Angular JS源

更新资料

同时,我用有关“ 管理Javascript依赖项”的帖子更新了原始代码。 请从1.0版下载此文章的原始来源。 您还可以克隆存储库,并使用以下命令从发行版1.0中检出标记: git checkout 1.0

希望您喜欢这个帖子! 让我知道您是否对此有任何评论。

翻译自: https://www.javacodegeeks.com/2014/07/java-ee-7-with-angular-js-part-1.html

angular java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统的msxml组件版本过低_Zabbix 5.0 LTS 版本安装

zabbix 5.0 版本于 5 月 11 日正式发布&#xff0c;是最新的 LTS(长期支持)版本&#xff0c;5.0 带来很多功能和特性&#xff0c;后面会陆续推出文章介绍&#xff0c;下面主要介绍下 5.0 版本的安装。环境要求5.0 版本对基础环境的要求有大的变化&#xff0c;最大的就是对 php …

登录判断_Spring Security之多次登录失败后账户锁定功能的实现

在上一次写的文章中&#xff0c;为大家说到了如何动态的从数据库加载用户、角色、权限信息&#xff0c;从而实现登录验证及授权。在实际的开发过程中&#xff0c;我们通常会有这样的一个需求&#xff1a;当用户多次登录失败的时候&#xff0c;我们应该将账户锁定&#xff0c;等…

通过TLS发送的Java邮件

抽象 本博客的目的是演示如何使用Java Mail通过具有TLS连接的SMTP服务器发送电子邮件。 免责声明 这篇文章仅供参考。 在使用所提供的任何信息之前&#xff0c;请认真思考。 从中学到东西&#xff0c;但最终自己做出决定&#xff0c;风险自负。 要求 我使用以下主要技术完成了…

html实体转化字符串 php_php将字符串转为HTML的实体引用的一个类

class HtmlEncode {static $_convertToHtmlEntitiesSrcEncodingUTF-8;/*** 将非ASCII字符串转换成HTML实体** example HtmlEncode::encode("我信了"); //输出:我信了* param string $s 要进行编码的字符串* return string 返回HTML实体引用*/public static function …

arcgis导入excel字段不显示_ArcGIS从excel中导入坐标出现空白无法选择字段

怎样将PDF转成EXCEL怎样将PDF转成EXCEL EXCEL和PDF这两种文档大家应该都比较熟悉&#xff0c;EXCEL表格是使用于数据图表得整理&#xff0c;而PDF文件是用于扫描或者存档&#xff0c;但是这两者之间经常需要进行转换得&#xff0c;比如说经常需要将归档的PDF文件转换成EXCEL表格…

atomic java_在Java中添加@atomic操作

atomic java总览 原子操作如何在Java中工作&#xff0c;OpenJDK / Hotspot中是否存在可以转换为原子的当前替代方法。 反馈 在我以前的文章中&#xff0c; 对可变字段进行原子操作。 有几次指出&#xff0c;不管善意如何&#xff0c;“修复”先前的行为都不太可能继续进行。 …

a4988 脉宽要求_Allegro MicroSystems - A4988: 带转换器和过流保护的 DMOS 微步驱动器

A4988 是一款完全的微步电动机驱动器&#xff0c;带有内置转换器&#xff0c;易于操作。该产品可在全、半、1/4、1/8 及 1/16 步进模式时操作双极步进电动机&#xff0c;输出驱动性能可达 35 V 及 2 A。A4988 包括一个固定关断时间电流稳压器&#xff0c;该稳压器可在慢或混合…

磁盘支持的阵列列表

有时&#xff0c;您的列表可能会变得太大而无法容纳在内存中&#xff0c;因此您必须采取一些措施以避免内存不足。 做到这一点的正确方法是流传输–而不是将所有内容都放入内存中&#xff0c;您应该从源流传输数据并丢弃已经处理的条目。 但是&#xff0c;在某些情况下&#…

apache图片cache容量_apache利用mod_cache缓存图片等

一&#xff0c;引言以前我写过二篇有关图片&#xff0c;静态文件的缓存文章&#xff0c;一个是用varnish来缓存&#xff0c;一个用squid来缓存&#xff0c;apache当然也可以用来做图片&#xff0c;静态文件的缓存&#xff0c;下面我将详细说明一下&#xff0c;怎么完装和配置二…

艾特某人代码实现_Vue@某人,At某人,仿新浪微博@某人,@user,艾特,艾特某人...

atuser.vue展开更多群成员import getCaretCoordinates from textarea-caretexport default {props: {value: { //输入框初始值type: String,default: null},suffix: { //插入字符链接type: String,default: },loop: { //上下箭头循环type: Boolean,default: true},avoidEmail:…

spring batch_Spring Batch作为Wildfly模块

spring batch长期以来&#xff0c;Java EE规范缺少批处理API。 今天&#xff0c;这对于企业应用程序来说是必不可少的。 这是最后固定与JSR-352批处理应用程序的Java平台现在的Java EE提供7 JSR-352得到了它的的灵感Spring Batch的对手。 两者涵盖相同的概念&#xff0c;尽管生…

h3c 链路聚合测试_良无磐石固,虚名复何益?- 链路聚合协议互通测试

一、描述链路聚合是将多条链路聚合在一起形成一个汇聚组&#xff0c;以实现负荷在各成员链路中的分担&#xff0c;同时也提供了更高的连接可靠性。Cisco的链路聚合有几种方式&#xff1a;手工、LACP(包括active和passive两种)、PAgP(Port-aggregation Protocol)&#xff0c;其中…

Spring@懒惰注释

介绍&#xff1a; 默认情况下&#xff0c; Spring框架在应用程序启动时加载并热切初始化所有bean。 在我们的应用程序中&#xff0c;我们可能有一些非常消耗资源的bean。 我们宁愿根据需要加载此类bean。 我们可以使用Spring Lazy批注实现此目的 。 在本教程中&#xff0c;我们…

变压器符号_行输出变压器的结构、符号及电路分析

行输出变压器又称逆程变压器、回扫变压器&#xff0c;俗称行输出&#xff0c;它是电视机、显示器中的一个重要变压器。1.行输出变压器结构行输出变压器的全部绕组和高压整流管均密封在其中&#xff0c;底部引出各个绕组的引脚&#xff0c;高压输出采用高压引线直接送至显像管的…

西南医院微服务咋查得到_#全国最好医院排行榜#发布:成都这4家牛了!四川31个专科排全国前十(总榜)...

病急不能乱投医&#xff01;近日&#xff0c;一年一度、令人期待的——复旦版《2018年度中国医院排行榜&#xff08;总榜&#xff09;》全新揭晓了~这份榜单不仅是是中国医院学科建设的一个标杆也是大众疑难杂症寻找好医院的重要参考四川4家医院入百强&#xff01;华西全国第二…

jit 和 jvm_关于JVM和JIT的一点点

jit 和 jvm如您所知&#xff0c;JVM&#xff08;Java Virtusal Machine&#xff09;使Java能够遵循“一次写入&#xff0c;随处运行”的范例。 JVM的核心包括以下组件&#xff1a; 堆 叠放 PermGen和方法区域 JIT编译器 代码缓存 堆是在应用程序代码开发阶段为您使用的每…

voxelnet_ue4商城资源Voxel Sandbox Toolkit体素沙盒工具箱

Unreal Engine虚幻游戏引擎素材资源 Unreal Engine Marketplace –Voxel Sandbox Toolkit体素沙盒工具箱体素沙盒工具箱是一个新的改进版本的体素生成从2016年适应4.22的需要。它用不同类型的立方体、树和拾取网格生成无限世界。因为额外的代码实现比以前的版本快得多。理想的创…

Pub / Sub本地模拟器

发布/订阅是GCP提供的不错的工具。 它非常方便&#xff0c;可以帮助您解决应用程序可能面临的消息传递难题。 实际上&#xff0c;如果您使用GCP&#xff0c;则可以使用托管消息解决方案。 如预期的那样&#xff0c;使用实际的发布/订阅解决方案需要一定的配额&#xff0c;因此…

mysql 写入随机字中文符_MySQL产生随机字符

MySQL产生随机字符UUID简介UUID含义是通用唯一识别码 (Universally Unique Identifier)&#xff0c;这是一个软件建构的标准&#xff0c;也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份…

mysql建表时外检怎么创建_MySQL创建表时加入的约束以及外键约束的的意义

1&#xff0c;创建表时加入的约束a) 非空约束&#xff0c;not nullb) 唯一约束&#xff0c;uniquec) 主键约束&#xff0c;primary keyd) 外键约束&#xff0c;foreign key1&#xff0c;非空约束&#xff0c;针对某个字段设置其值不为空&#xff0c;如&#xff1a;学生的姓名不…