做网站营销公司,加工平台都有哪些,linode搭建wordpress,博物馆布展设计公司回到我以前的项目之一#xff0c;我被要求制作一些应急申请。 时间表紧张#xff0c;范围简单。 内部编码标准是PHP#xff0c;因此尝试建立经典的Java EE堆栈将是一个真正的挑战。 而且#xff0c;说实话#xff0c;完全过大了。 那怎么办 我趁机尝试了Spring。 我以前使… 回到我以前的项目之一我被要求制作一些应急申请。 时间表紧张范围简单。 内部编码标准是PHP因此尝试建立经典的Java EE堆栈将是一个真正的挑战。 而且说实话完全过大了。 那怎么办 我趁机尝试了Spring。 我以前使用过它但是在旧版本中它被隐藏在此时困扰我的门户软件的技术堆栈中。 我的目标是使WebOps可以简单地放在装有Java的服务器上并运行它。 无需摆弄数十种XML配置和内存微调。 就像java -jar application.jar一样容易。 这是“ Spring Boot”的完美呼唤。 这个Spring项目旨在简化开发人员的工作流程并消除对配置和样板代码的负担。 我的项目渴望的另一件事是面向文档的数据存储。 我的意思是该应用程序的主要目的是提供现实世界纸质表格的数字版本。 那么如果我们可以将文档表示为文档那么为什么要创建关系混乱呢 我之前在几个小型项目中使用过MongoDB因此我决定继续使用它。 这和这篇文章有什么关系 好吧我将向您展示如何快速整合Web应用程序所需的所有点点滴滴。 Spring Boot将使很多事情变得相当容易并使代码最少。 最后您将拥有一个JAR文件该文件是可执行文件只需将其拖放到服务器上即可进行部署。 您的WebOps将为此而爱您。 假设我们将要创建下一个大型产品管理Web应用程序。 因为这是下一件大事所以它需要一个大名字 Productr 这就是我是软件工程师而不是销售或市场营销的原因……。 Productr将做令人惊奇的事情本文将向您展示其早期阶段这些阶段是 提供简单的REST界面来查询所有可用产品 从MongoDB加载这些产品 提供生产就绪的监控设施 使用JavaScript UI显示所有产品 您需要开始的全部是 Java 8 马文 您最喜欢的IDEIntelliJEclipseviedlinbutterfly… 浏览器可以或者是Internet Explorer / MS Edge但是谁真的想要这个 对于不耐烦的人该代码也可以在GitHub上获得 。 让我们开始吧 创建具有以下内容的pom.xml ?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion1.3.0.RELEASE/version/parentmodelVersion4.0.0/modelVersiongroupIdnet.h0lg.tutorials.rapid/groupIdartifactIdrapid-resting/artifactIdversion1.0/versiondependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build
/project 在这几行中已经发生了很多事情。 最重要的是已定义的父项目。 这将为我们带来许多有用且必要的依赖项例如日志记录Tomcat运行时等等。 由于Spring的模块化所有内容都可以通过pom.xml或依赖项注入进行重新配置。 为了快速启动所有功能默认设置绝对可以。 配置公约有人吗 现在创建强制性的Maven文件夹结构 mkdir -p src/main/java src/main/resources src/test/java src/test/resources 我们已经解决了。 启动引擎 让我们开始工作。 我们希望提供一个REST接口来访问我们大量的产品。 因此让我们开始创建在/ api / products下可用的REST集合。 为此我们必须做一些事情 我们需要创建包含有关我们令人难以置信的产品的所有信息的“数据模型” 我们需要一个提供一种方法的控制器该方法可以完成GET请求的所有必要操作 为我们的应用程序创建主入口点 数据模型非常简单并且可以快速完成。 只需创建一个名为demo.model的包和一个名为Product的类。 Product类非常简单 package demo.model;import java.io.Serializable;/*** Our very important and sophisticated data model*/
public class Product implements Serializable {String productId;String name;String vendor;public String getProductId() {return productId;}public void setProductId(String productId) {this.productId productId;}public String getName() {return name;}public void setName(String name) {this.name name;}public String getVendor() {return vendor;}public void setVendor(String vendor) {this.vendor vendor;}Overridepublic boolean equals(Object o) {if (this o) return true;if (o null || getClass() ! o.getClass()) return false;Product product (Product) o;if (getProductId() ! null ? !getProductId().equals(product.getProductId()) : product.getProductId() ! null)return false;if (getName() ! null ? !getName().equals(product.getName()) : product.getName() ! null) return false;return !(getVendor() ! null ? !getVendor().equals(product.getVendor()) : product.getVendor() ! null);}Overridepublic int hashCode() {int result getProductId() ! null ? getProductId().hashCode() : 0;result 31 * result (getName() ! null ? getName().hashCode() : 0);result 31 * result (getVendor() ! null ? getVendor().hashCode() : 0);return result;}
} 我们的产品具有令人难以置信的3个属性字母数字产品ID名称和供应商为简单起见仅是名称。 它是可序列化的并且使用我的IDE的代码生成来实现gettersetter和equals hashCode方法。 好的因此使用一种提供GET侦听器的方法来创建一个控制器。 返回您最喜欢的IDE并创建包demo.controller和一个名为ProductsController的类其内容如下 package demo.controller;import demo.model.Product;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;/*** This controller provides the REST methods*/
RestController
RequestMapping(value /, method RequestMethod.GET)
public class ProductsController {RequestMapping(value /, method RequestMethod.GET)public List getProducts() {List products new ArrayList();return products;}} 这实际上是提供REST接口所需的一切。 好的此刻返回了一个空列表但是定义起来很简单。 最后缺少的是我们应用程序的入口点。 只需在程序包演示中创建一个名为Productr的类然后为其提供以下内容 package demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** This is the entry point of our application*/
SpringBootApplication
public class ProductrApplication {public static void main (String... opts) {SpringApplication.run(ProductrApplication.class, opts);}} Spring Boot为我们节省了许多按键操作。 无论如何SpringBootApplication会完成我们每个Web应用程序所需的一些操作。 该注释是以下注释的简写 组态 EnableAutoConfiguration ComponentScan 现在是时候第一次启动我们的应用程序了。 借助我们在pom.xml中配置的Spring Boot的maven插件启动该应用程序非常简单 mvn spring-boot:run 。 只需在项目根目录中运行此命令即可。 您更喜欢IDE提供的惰性N键单击方式 好的只需指示您喜欢的IDE运行ProductrApplication即可 。 一旦启动请使用浏览器REST客户端您应该签出Postman 我喜欢这个工具或诸如curl的命令行工具。 您要查找的地址是 http// localhost8080 / api / products / 。 因此使用curl 命令如下所示 curl http://localhost:8080/api/products/请提供资料 好的返回一个空列表不是很闪亮是吗 因此让我们引入数据。 在许多项目中经典的关系数据库通常会显得过大如果必须使用它并进行横向扩展则会很痛苦。 这可能是NoSQL数据库被大肆宣传的原因之一。 一个在我看来很好的例子是MongoDB。 启动和运行MongoDB非常简单。 在Linux上您可以使用软件包管理器进行安装。 例如对于Debian / Ubuntu只需执行 sudo apt-get install mongodb 。 对于Mac最简单的方法是自制软件 brew install mongodb并按照“注意事项”部分中的说明进行操作。 Windows用户应使用MongoDB安装程序和toi toi toi。 好吧我们只是对数据存储进行了排序。 现在是时候使用它了。 有一个特定的Spring项目处理数据–称为Spring Data 。 碰巧的是一个名为Spring Data MongoDB的子项目正等着我们。 甚至更多Spring Boot提供了一个依赖包可以立即加快速度。 难怪pom.xml的dependencies部分中的以下几行足以引入我们需要的所有内容 dependency
groupIdorg.springframework.boot/groupId
artifactIdspring-boot-starter-data-mongodb/artifactId
/dependency 现在创建一个名为demo.domain的新包并放入一个名为ProductRepository的新接口。 Spring提供了一种非常简洁的方法来摆脱编写与数据源交互通常所需的代码。 大多数基本查询都是由Spring Data生成的-您只需要定义一个接口即可。 甚至没有指定方法标题就可以使用几个查询方法。 一个示例是findAll()方法该方法将返回集合中的所有条目。 但是让我们看看它在起作用而不是在谈论它。 定制的ProductRepository接口应如下所示 package demo.domain;import demo.model.Product;
import org.springframework.data.mongodb.repository.MongoRepository;/*** This interface lets Spring generate a whole Repository implementation for* Products.*/
public interface ProductRepository extends MongoRepository {} 接下来在同一包中创建一个名为ProductService的类。 此类的目的是实际提供一些用于查询产品的有用方法。 现在代码就像这样简单 package demo.domain;import demo.model.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;/*** This is a little service class we will let Spring inject later.*/
Service
public class ProductService {Autowiredprivate ProductRepository repository;public List getProducts() {return repository.findAll();}} 看看我们如何在没有在接口中定义的情况下使用repository.findAll() 很漂亮不是吗 尤其是在您急于需要快速起床的情况下。 好了到目前为止我们已经为数据访问奠定了基础。 我认为是时候将它们连接在一起了。 为此只需回到我们的类demo.controller.ProductsController并稍加修改即可。 我们要做的就是注入我们闪亮的新ProductService服务并调用其getProducts()方法。 之后该类将如下所示 package demo.controller;import demo.domain.ProductService;
import demo.model.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;/*** This controller provides the REST methods*/
RestController
RequestMapping(/api/products/)
public class ProductsController {// Let Spring DI inject the service for usAutowiredprivate ProductService productService;RequestMapping(value /, method RequestMethod.GET)public List getProducts() {// Ask the data store for a list of productsreturn productService.getProducts();}} 而已。 启动MongoDB如果尚未运行再次启动我们的应用程序还记得mvn spring-boot:run whaty ?!并向http// localhost8080 / api / products /发起另一个GET请求 $ curl http://localhost:8080/api/products/
[] 等等还是一个空名单 是的或者您还记得我们将任何内容放入数据库吗 让我们使用以下命令来更改它 mongo localhost/test --eval db.product.insert({productId: a1234, name: Our First Product, vendor: ACME}) 这会将一个名为“我们的第一个产品”的产品添加到我们的数据库中。 好的我们的服务现在返回什么 这个 $ curl http://localhost:8080/api/products/
[{productId:5657654426ed9d921affc3c0,name:Our First Product,vendor:ACME}] 很简单不是吗 寻找更多数据却没有时间自己创建 好了快到圣诞节了所以请选择我的一些小测试 curl https://gist.githubusercontent.com/daincredibleholg/f8667a26ce2f17776903/raw/ed9b4c8ec6c9c455dc063e833af2418648928ba6/quick-web-app-product-example.json | mongoimport -d test -c product --jsonArray基本要求唾手可得 在当今繁忙的日子里随着“微服务”文化的传播关注服务器或云环境上实际运行的内容变得越来越困难。 因此在过去几年中我在几乎所有环境中进行监控都是一件大事。 一种常见的模式是提供运行状况检查端点。 从简单的ping端点到运行状况指标您可以找到所有内容并返回与业务相关的指标的详细概述。 所有这些在大多数情况下都是“复制粘贴”冒险涉及处理许多样板代码。 这是我们要做的–只需将以下依赖项添加到pom.xml中 dependency
groupIdorg.springframework.boot/groupId
artifactIdspring-boot-starter-actuator/artifactId
/dependency 并重新启动服务。 让我们看看如果查询http// localhost8080 / health会发生什么 $ curl http://localhost:8080/health
{status:UP,diskSpace:{status:UP,total:499088621568,free:83261571072,threshold:10485760},mongo:{status:UP,version:3.0.7}} 这应该为基本的健康检查提供足够的数据。 如果遵循启动日志消息则可能会发现许多其他端点。 尝试一下然后查看执行器文档以获取更多信息。 给我看看 好的我们获得了REST服务和一些数据。 但是我们想将这些数据显示给我们的用户。 因此让我们继续并提供一个页面其中概述了我们的出色产品。 感谢圣诞老人这里有一个非常活跃的Web UI社区致力于处理漂亮易用的前端框架和库。 一个很受欢迎的例子是Bootstrap 。 它易于使用并且所有所需的点点滴滴都通过开放的CDN提供。 我们希望对我们的产品有一个简短的概述所以表格视图会很不错。 Bootstrap Table将帮助我们实现这一目标。 它建立在Bootstrap之上也可以通过CDN使用。 我们生活在一个怎样的世界里…… 但是等等将我们HTML文件放在哪里 Spring Boot再次使它变得容易。 只需创建一个名为src / main / resources / static的文件夹并创建一个具有以下内容的名为index.html的新HTML文件 !DOCTYPE html
html
headmeta charsetutf-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1titleProductr/title!-- Import Bootstrap CSS from CDNs --link relstylesheet href//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.csslink relstylesheet href//cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.9.1/bootstrap-table.min.css
/head
body
nav classnavbar navbar-inversediv classcontainerdiv classnavbar-headerbutton typebutton classnavbar-toggle collapsed data-togglecollapse data-target#navbar aria-expandedfalse aria-controlsnavbarspan classsr-onlyToggle navigation/spanspan classicon-bar/spanspan classicon-bar/spanspan classicon-bar/span/buttona classnavbar-brand href#Productr/a/divdiv idnavbar classcollapse navbar-collapseul classnav navbar-navli classactivea href#Home/a/lilia href#aboutAbout/a/lilia href#contactContact/a/li/ul/div!--/.nav-collapse --/div
/navdiv classcontainertable data-toggletable data-url/api/products/theadtrth data-fieldproductIdProduct Reference/thth data-fieldnameName/thth data-fieldvendorVendor/th/tr/thead/table/div!-- Import Bootstrap, Bootstrap Table and JQuery JS from CDNs --script src//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js/scriptscript src//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js/scriptscript src//cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.9.1/bootstrap-table.min.js/script
/body
/html 这个文件不是很复杂。 它只是一个HTML文件其中包括CDN中最小化CSS文件。 如果您第一次看到类似//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css之类的引用那么协议http或https丢失就是一个不错的错误。 以这种方式引用的资源将通过与加载主页相同的协议进行加载。 说如果您使用http// localhost8080 / 它将使用http加载CSS文件。 body块包含一个导航栏使用HTML5 nav标记和一个表。 该表定义的有趣部分是提供的data-url属性。 Bootstrap表将其解释为加载数据。 我们的定义指向我们先前创建的REST端点。 通过th定义上的data-field属性定义在哪一列中使用JSON对象的哪一部分。 您可以找到匹配的属性名称吗 最后但并非最不重要的一点是我们加载了所需JavaScript库。 所有与Bootstrap相关JavaScript功能都需要JQuery因此这是第一个要加载的库。 紧随其后的是主要的Bootstrap和Bootstrap Table JavaScript文件。 这些库文件中的每个文件均以最小化版本加载以使下载时间保持最少。 现在去哪里 可以说我们现在有一个非常简单的Web应用程序。 好吧本文的主要目的是向您展示如何以尽可能少的代码来加快速度。 您已经看到有时POM文件中的依赖项为您带来了一项全新的功能而无需任何其他代码。 退后一步看看到目前为止我们已经建立了什么然后考虑下一步需要做的事情。 并开始在Spring宇宙中四处看看。 我认为除了添加缺少的测试之外接下来需要的最关键的步骤之一就是引入安全性。 查看Spring Security及其子项目Spring Security OAuth 。 对“经典”网页更感兴趣 查看Spring MVC以及集成非常复杂的模板引擎有多么容易例如通过遵循本指南 。 希望您喜欢这篇文章也喜欢我喜欢它的创作。 祝大家圣诞快乐如果一个或另一个想要与您取得联系您可以在Twitter G 和LinkedIn上找到我。 翻译自: https://www.javacodegeeks.com/2015/12/quick-web-app-prototyping-spring-boot-mongodb.html