`
tooby
  • 浏览: 118187 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java EE 7和Angular JS来构建一个非常简单的应用

 
阅读更多

今天这篇文章将会向你介绍如何使用Java EE 7Angular JS来构建一个非常简单的应用。在此之前,先给大家讲一个故事。

我必须承认,我从来都不是一个Javascript的超级粉丝,但我始终记得我第一使用它的情景。我不太记得确切的年份,不过大概是90年代的中期。我的一个页面里有3个frame(是的,frame!记得这个东西吗?那个时候非常流行的),而我想做的是在点击了第3个frame上的一个链接时,能够重新加载前两个frame。那个时候,Javascript是用来在页面上做一些花哨的东西的。不是所有的浏览器都支持,有些浏览器甚至需要你手动打开。时至今日,这个情景已经有了显著变化,Javascript成为一门全栈的开发语言。你甚至可以仅仅用Javascript就能开发出一个完整的应用。但对于我来说,有时我还是会回想到90年代的情形,很难给予Javascript足够的信任,所以这是我为了更好的了解Javascript所做出的尝试。

为什么用Java EE 7?

好吧,我喜欢Java,并且新的Java EE版本非常好用,配合Wildfly或Glassfish使得它简洁而且运行快速。Java EE7的规范可以满足你所有需求,是Java编程中的标准。

为什么用Angular JS?

这里我大概是追随了Angular JS的热潮。因为我在Javascript方面没有太多的经验,不太了解各类的JS库,所以这里只是采纳了一些朋友的建议。而且我也注意到了在最近一次Devoxx大会上对于Angular得到了广泛的接纳,关于Angular的演讲的每一个房间都爆满。所以我想用它尝试一下,也给我自己一个认识的机会。

关于应用

这个应用是一个简单的包含分页的列表,以及一个REST服务用于提供列表中的数据。每当我开始一个新的企业级应用的时候,这通常是我们开始编码时所做的第一件事:创建一张表,存入一些数据,然后列出一些随机数据,所以我认为这个应用是非常合适的。

配置

代码(终于到代码部分了!)

后端-Java EE 7

从后端开始,让我们定义一个简单的Entity类(为了简洁省略了部分代码):

Persion.java

@Entity
public class Person {
    @Id
    private 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 {
    @PersistenceContext
    private 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 POJP,但是使用了Java EE的注解来增强行为。@ApplicationPath("/resources")@Path("persons")会通过yourdomain/resources/personsurl来暴露REST服务,@GET标志了这个逻辑通过http的GET方法调用,@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遵循了MVC模式,通过添加一些自定义的标签属性来绑定数据和Javascript中出现的变量,从而扩展了传统的HTML。那么, 让我们来看看我们的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提供的组件。
这里还缺少了一个文件——一个js文件来是实现功能:

persion.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服务来刷新列表,以及监控表格中的数据来刷新视图。这是最终的结果:

下一步

这个系列的下一篇文章中,我打算:

  • 实现拦截
  • 实现详细视图
  • 实现下一个/上一个浏览导航
  • 在云上部署
  • 管理Javascript依赖

资源

你可以从我的github库中clone一个完整的拷贝,然后部署到Wildfly上,关于如何部署,也可以在上面找到指导,同样,它也应该能在Glassfish上运行。Java EE – Angular JS Source

更新

同时,我还根据管理Javascript依赖一文来更新了我的源码,请通过 release 1.0来下载源码,同样可以clone这个repo,并使用git checkout 1.0命令来下载release 1.0版本的源码。

原文链接: javacodegeeks 翻译: ImportNew.com xiafei
译文链接: http://www.importnew.com/13195.html

分享到:
评论

相关推荐

    Java EE 7 与 Angular.zip

    Java EE 7 与 AngularJava EE 7 - Angular - 示例应用程序博客文章Java EE 7 与 Angular JS – 第 1 部分Java EE 7 与 Angular JS – CRUD、REST、验证 – 第 2 部分Codenvy 设置使用 Docker 演示应用程序带有 ...

    javaee7-angular-barcamprd2014:Barcamp 2014 上的 Java EE 7 和 AngularJS 示例

    Java EE 7与AngularJS是两个在Web开发领域中非常重要的技术栈,它们结合使用可以构建出高效、现代化的企业级应用程序。...这个项目对于想要提升Java EE 7和AngularJS技能的开发者来说,是一个宝贵的资源。

    Java Web应用开发技术实用教程

    10. **前端技术**:HTML、CSS和JavaScript是构建Web界面的基础,而现代框架如React、Vue.js和Angular.js则让前端开发更加高效。 通过本教程,你将学习如何配置开发环境,创建第一个"Hello, World!"应用,进而掌握...

    javaee-angular-gradle:使用 Gradle 构建的基于 Java EE 的简单 API,为 AngularJS 前端提供服务。 如果您愿意,可以将其称为微服务

    Java EE 应用程序的一个示例,相当简单的设置,它为前端应用程序提供必要的文件。 使用 gradle 构建。 本地建设 运行./gradlew war然后将 .war 部署到您的容器(例如 Glassfish 服务器)。 有趣的点 所有静态资产都...

    Java EE 开发的旅游网站travel-website.zip

    Angular:一个用于构建Web应用的前端框架。 Vue.js:一个渐进式JavaScript框架,用于构建交互式界面。 Sass 和 Less:CSS预处理器,用于简化和加强CSS的功能。 Bootstrap:一个用于快速开发响应式网站的前端框架。 ...

    crm-demo:关于如何使用 Angular.js 和 Java EE 6(JAX-RS 和 JPA 2.0)编写 Web 应用程序的简单演示

    客户关系管理演示这是一个简单的展示,展示了如何使用 Angular.js 和 Java EE 6(JAX-RS 和 JPA 2.0)构建 Web 应用程序。 要部署,只需将 war 复制到 Jboss AS 7.1 的“standalone/deployments”目录。 您还可以...

    基于Java EE多层框架的实时监测系统设计与实现.zip

    在本项目中,“基于Java EE多层框架的实时监测系统设计与实现”是一个典型的Web应用程序开发案例,它展示了如何利用Java EE技术栈构建一个能够实时监控数据并进行处理的系统。下面将详细介绍这个系统设计的核心知识...

    基于Java EE的人机交互友好人力资源管理系统设计.zip

    Java EE(Enterprise Edition)是Java平台的一个版本,专为构建企业级应用而设计,具有高度可扩展性、稳定性和安全性。系统设计的焦点在于提升用户体验,这意味着它可能采用了现代前端技术和用户界面设计原则,以...

    基于JavaEE的网上购物商城

    【Java EE技术体系详解】 Java EE(Java Platform, Enterprise Edition)...通过以上知识点,我们可以构建一个完整的基于Java EE的网上购物商城系统,它不仅能处理用户购物的各种需求,还能确保系统的稳定性和安全性。

    Java + SSM基于Java EE的校园临时用工网站(毕业设计、课程设计使用).rar

    标题 "Java + SSM基于Java EE的校园临时用工网站(毕业设计、课程设计使用)" 暗示了这是一个使用Java编程语言,并结合了Spring、SpringMVC和MyBatis(SSM)框架来构建的Web应用程序。这个项目可能是为了满足高等...

    前端和java文档

    Java标准版(Java SE)提供基础平台,而Java企业版(Java EE,现更名为Jakarta EE)则为开发服务器端应用提供了高级框架和API。JavaEE包含诸如Servlet、JSP(JavaServer Pages)、EJB(Enterprise JavaBeans)、JMS...

    java开发文档大全

    Struts是基于MVC设计模式的一个Java Web框架,帮助开发者组织和控制应用逻辑。Struts的文档会涉及Action类、配置文件、拦截器和结果类型等概念。 9. **Hibernate ORM (Object-Relational Mapping)** Hibernate是...

    一种Java EE多层架构下的大学物理实验系统.zip

    在Java EE平台上构建一个大学物理实验系统,通常涉及到多种技术和设计模式,这是一套复杂的、分层的系统架构,旨在提供高效、可扩展且易于维护的解决方案。下面将详细阐述这个系统可能涉及的关键知识点。 首先,...

    7-Java-web开发17-Java-web开发17-Java-web开发17-Java-web开发17-Java-web开发

    Java Web开发是一个涵盖广泛的主题,包括使用Java语言进行服务器端编程、构建动态网站以及实现企业级应用程序。在Java Web开发中,我们主要涉及到以下几个关键知识点: 1. **Servlet**: Servlet是Java Web应用的...

    实训项目:用JAVA EE+websocket实现谁是卧底游戏.zip

    在本实训项目中,我们利用Java EE技术和WebSocket协议来实现一款名为"谁是卧底"的在线游戏。这个项目适用于毕业设计、课程设计以及实际的工作项目,其源码已经过助教老师的测试,确保能够正常运行。以下是关于这个...

    JAVA WEB 开发教学资料

    JAVA WEB 开发是计算机科学领域中的一个重要组成部分,它涉及到使用Java语言进行Web应用程序的构建。在本教学资料中,我们将深入探讨这一主题,为初学者和有经验的开发者提供宝贵的资源。 1. **基础概念** - **...

    Web开发,JAVA体系、工具、框架和整合应用

    3. Hibernate:这是一个对象关系映射(ORM)框架,简化了Java与数据库之间的交互,支持JPA标准。 五、开发工具 Eclipse和IntelliJ IDEA是两款流行的Java开发集成环境,提供了代码提示、调试、版本控制集成等功能,...

    JAVA EE架构师 需要具备的知识.doc

    JAVA EE架构师是软件开发领域的高级角色,负责设计和构建大型企业级应用程序。要成为JAVA EE架构师,需要经历从程序员到高级程序员,再到设计师的逐步成长。以下是一些核心知识点和技能要求: 1. **语言基础**:...

    《Java Web应用开发技术》教学策略.zip

    8. **前端技术**:如HTML、CSS、JavaScript以及现代框架Angular、React、Vue.js等,它们与后端Java Web应用配合,构建用户体验丰富的交互式界面。 9. **版本控制与协作**:Git是常见的版本控制系统,它允许团队成员...

    java j2ee学习中必要的chm格式的帮助文档,中文版的

    4. **JNDI(Java Naming and Directory Interface)**:JNDI提供了一个接口来查找和管理在Java应用中的对象和服务。 5. **JTA(Java Transaction API)**:用于处理分布式事务,确保数据的一致性。 6. **JMS(Java...

Global site tag (gtag.js) - Google Analytics