应用节点和容器的关系_使用Dockunit对节点应用程序进行容器化测试_culiu9261的博客-程序员宅基地

技术标签: python  java  vue  单元测试  js  

应用节点和容器的关系

This tutorial covers setting up containerized unit testing for Node applications. Containerized unit testing allows you to ensure your software works across a wide variety of platforms.

本教程涵盖为Node应用程序设置容器化单元测试。 容器化的单元测试使您可以确保您的软件可以在多种平台上运行。

总览 (Overview)

Writing and distributing Node.js applications necessitates supporting as many versions of Node.js as possible. npm, the most popular Node.js package manager, requires Node.js 0.8 or higher. Therefore to support your users, potential downloaders, or even your customers, it behooves you to test your program on Node.js versions 0.8 and up. Node.js 0.8 was released in 2012; many versions have been released since then. io.js and Node.js were combined in version 4.0.0. You have a lot of testing ground to cover!

编写和分发Node.js应用程序需要支持尽可能多的Node.js版本。 npm是最受欢迎的Node.js软件包管理器,它要求Node.js 0.8或更高版本。 因此,为了支持您的用户,潜在的下载者甚至您的客户,您应该在Node.js 0.8及更高版本上测试程序。 Node.js 0.8于2012年发布; 从那时起,已经发布了许多版本。 io.js和Node.js在4.0.0版中合并。 您有很多需要测试的地方!

There are a few ways to run your code in multiple versions of Node.js: n and nvm are npm packages that allow you to switch between different versions of Node.js. It’s difficult quickly switch between versions to test your code. It’s also difficult to batch run your code against a list of versions. Travis CI is a continuous integration service that allows you to run your code across multiple versions of Node.js. However, you are stuck with the versions of Node.js that they want to support, or you can use their new Docker based system which is somewhat experimental and cumbersome to operate.

有几种方法可以在多个版本的Node.js中运行代码: nnvm是npm软件包,允许您在不同版本的Node.js之间进行切换。 很难在版本之间快速切换以测试代码。 也很难对版本列表进行批处理运行。 Travis CI是一项持续集成服务,可让您跨多个版本的Node.js运行代码。 但是,您会被他们想要支持的Node.js版本所困扰,或者您可以使用他们的基于Docker的新系统,该系统有些实验性且操作麻烦。

Neither of these ways did the trick for me. Enter Dockunit.

这两种方式都不对我有用。 输入Dockunit。

Dockunit is a utility for running containerized software tests. Dockunit.io is a continuous integration service built for Dockunit. Let’s setup Dockunit to be used with our Node.js application.

Dockunit是用于运行容器化软件测试的实用程序。 Dockunit.io是为Dockunit构建的持续集成服务。 让我们设置Dockunit与我们的Node.js应用程序一起使用。

Prerequisites:

先决条件:

  • A Unix based operating system such as OSX or Ubuntu.

    基于Unix的操作系统,例如OSX或Ubuntu。
  • Docker (boot2docker in case of OSX) A version of Node.js and npm

    Docker (在OSX中为boot2docker) Node.js和npm的版本
  • Basic terminal knowledge Basic knowledge of JavaScript and Node

    基本的终端知识JavaScript和Node的基本知识

第1部分:开发简单节点应用程序(如果有现有应用程序,请跳过) (Part 1: Develop a Simple Node Application (skip if you have an existing application))

We need a simple Node application to test for the purposes of this tutorial. We will write a simple app that prints out the current system time that includes one basic unit test. The code for this tutorial is available on Github.

为了本教程的目的,我们需要一个简单的Node应用程序进行测试。 我们将编写一个简单的应用程序,打印出包括一个基本单元测试的当前系统时间。 Github上提供了本教程的代码。

Let’s start by creating a folder on your machine:

让我们从在计算机上创建一个文件夹开始:

/test-app

Next, let’s initialize a package.json file from within the /test-app directory. In the terminal enter:

接下来,让我们从/test-app目录中初始化package.json文件。 在终端中输入:

npm init

Just press enter on all the prompts. No need to specify all this information for our simple application. Next let’s create a file time.js such that our application looks like this:

只需在所有提示上按Enter。 无需为我们的简单应用程序指定所有这些信息。 接下来,我们创建一个文件time.js ,使我们的应用程序如下所示:

/test-app
    time.js

In time.js paste the following code:

time.js粘贴以下代码:

'use strict';

class Time {
    constructor() {
        this.date = new Date();

        this.hour = this.date.getHours();
        this.hour = (this.hour < 10 ? '0' : '') + this.hour;

        this.min  = this.date.getMinutes();
        this.min = (this.min < 10 ? '0' : '') + this.min;

        this.ampm = 'AM';
        if (this.hour > 12) {
            this.ampm = 'PM';
            this.hour -= 12;
        }
    }

    getPretty() {
        return 'The time is ' + this.hour + ':' + this.min + ' ' + this.ampm;  
    }
}

module.exports = Time;

This code creates a basic ES6 class to wrap the transformed JavaScript Date object into usable time information. The wrapper also let’s you print out the current time in an easy to read way.

此代码创建一个基本的ES6类,以将转换后JavaScript Date对象包装到可用的时间信息中。 包装器还让您以一种易于阅读的方式打印出当前时间。

Now let’s create the main file to utilize our time class. Create a file index.js like so:

现在,让我们创建主文件以利用我们的时间类。 像这样创建文件index.js

/test-app
    index.js

In index.js paste the following code:

index.js粘贴以下代码:

'use strict';

var colors = require('colors');
var Time = require('./time');

var time = new Time();

console.log(time.getPretty().green);

This code just instantiates a Time object and prints the current time to the screen. colors is a npm package that let’s you give your terminal output some color. We need to install the npm package for this to work. In the terminal run the following command from within the /test-app directory:

这段代码只是实例化一个Time对象,并将当前时间打印到屏幕上。 colors是一个npm软件包,可让您为终端输出一些颜色。 我们需要安装npm软件包才能正常工作。 在终端中,从/test-app目录中运行以下命令:

npm install colors --save

Now let’s write a simple unit test with Mocha. First, install Mocha globally:

现在,让我们用Mocha编写一个简单的单元测试。 首先,在全球范围内安装Mocha:

npm install -g mocha

Now create a folder test and a file time.js inside of it like so:

现在创建一个文件夹test并在其中创建文件time.js ,如下所示:

/test-app
    index.js
    time.js
    /test
        time.js

In time.js paste the following code:

time.js粘贴以下代码:

'use strict';

var assert = require('assert');
var Time = require('../time');

describe('time', function() {

    describe('#constructor', function() {

        it('Object initializes hour, minute, and AM/PM', function() {
            var time = new Time();

            assert(time.hour);
            assert(time.min);
            assert(time.ampm);
        });
    });
});

This code tests up a simple unit test that instantiates a Time object and makes sure the proper instance variables are setup.

这段代码测试了一个简单的单元测试,该单元测试实例化了一个Time对象,并确保设置了正确的实例变量。

Run the following command in your terminal from the root of your project:

从项目的根目录在终端中运行以下命令:

mocha

If you have setup your tests correctly, it should show you one test is passing.

如果您正确设置了测试,则应该表明您正在通过一项测试。

That’s it! You now should have a simple node app with a basic unit test setup. Again, you can find all the code for this tutorial on Github.

而已! 您现在应该拥有一个带有基本单元测试设置的简单节点应用程序。 同样,您可以在Github上找到本教程的所有代码。

第2部分:设置坞站 (Part 2: Setup Dockunit)

We want our application to work across many different versions of Node since we will be distributing it publically. We need to be able to quickly run our tests locally across a number of Node versions. We also want our teammates and collaborators to be able to run the same tests without having to setup complex local environments. We will use Dockunit to accomplish this.

我们希望我们的应用程序可以跨许多不同版本的Node工作,因为我们将公开发布它。 我们需要能够跨多个Node版本在本地快速运行测试。 我们还希望我们的队友和协作者能够运行相同的测试,而不必设置复杂的本地环境。 我们将使用Dockunit完成此操作。

First, install Dockunit locally. In the terminal run the following command:

首先,在本地安装Dockunit。 在终端中运行以下命令:

npm install -g dockunit

In the root of the test-app folder, create the file Dockunit.json like so:

test-app文件夹的根目录中,创建文件Dockunit.json如下所示:

/test-app
    index.js
    Dockunit.json
    time.js
    /test
        time.js

In Dockunit.json paste the following code:

Dockunit.json粘贴以下代码:

{
    "containers": [
        {
            "prettyName": "Node 0.10.40",
            "image": "node:0.10.40",
            "beforeScripts": [
                "npm install",
                "npm install -g mocha"
            ],
            "testCommand": "mocha"
        },
        {
            "prettyName": "Node 0.12",
            "image": "node:0.12",
            "beforeScripts": [
                "npm install",
                "npm install -g mocha"
            ],
            "testCommand": "mocha"
        },
        {
            "prettyName": "Node Latest",
            "image": "node:latest",
            "beforeScripts": [
                "npm install",
                "npm install -g mocha"
            ],
            "testCommand": "mocha"
        }
    ]
}

Dockunit.json files are written in JSON which is JavaScript object notation. All Dockunit.json files contain a root level object with a property containers which holds an array of objects that each describe a test to be run in a Docker container. The idea is for containers to be different real life simulations of your software so you can see how it performs in different scenarios. Here is an example container object:

Dockunit.json文件使用JSON编写,这是JavaScript对象表示法。 所有Dockunit.json文件都包含带有属性containers的根级对象,该属性containers包含一个对象数组,每个对象都描述了要在Docker容器中运行的测试。 想法是使容器成为您软件的不同真实生活模拟,以便您可以查看容器在不同情况下的性能。 这是一个示例容器对象:

{
    "prettyName": My container pretty name",
    "image": "docker-image-ref",
    "beforeScripts": [
      "before-command-1",
      "before-command-2"
    ],
    "testCommand": "my-command"
}

prettyName is just an easy way for you to describe your container which will be useful in build output. image refers to a Docker Hub image. Dockunit comes with a bunch of predefined images that you can use, however you can always create your own. beforeScripts allows you to run commands in the Docker container before the test command is run. testCommand is the command whose exit code will be evaluated to determine whether your software “passes” or not.

prettyName是描述容器的简便方法,这对构建输出很有用。 image是指Docker Hub映像。 Dockunit附带了一堆可以使用预定义图像 ,但是您始终可以创建自己的图像。 beforeScripts允许您在运行test命令之前在Docker容器中运行命令。 testCommand是将评估其退出代码以确定您的软件是否“通过”的命令。

This particular Dockunit.json file describes three containers, one for Node 0.10.40, Node 0.12, and the latest version of Node. Let’s run Dockunit. In the terminal run the following command from the root of your test-app folder:

这个特定的Dockunit.json文件描述了三个容器,一个容器用于Node 0.10.40,Node 0.12和最新版本的Node。 让我们运行Dockunit。 在终端中,从test-app文件夹的根目录运行以下命令:

dockunit

The first time you run the command it will take a few minutes to download all the relevant Docker images. Subsequent runs will be much faster. You should see your test output for all three containers. If you are using the example application, 1 out of the 3 containers will show as passed.

首次运行该命令时,将花费几分钟时间下载所有相关的Docker映像。 随后的运行将更快。 您应该看到所有三个容器的测试输出。 如果使用示例应用程序,则3个容器中的1个将显示为已通过。

What happened?

发生了什么?

Well, in test-app/time.js we are using ES6 class style syntax which is only available in newer versions of Node. Let’s refactor our code to make it more compatible with older versions of Node. Paste the following code into test-app/time.js:

好吧,在test-app/time.js我们使用的是ES6类样式语法,该语法仅在较新版本的Node中可用。 让我们重构代码,使其与旧版本的Node更加兼容。 将以下代码粘贴到test-app/time.js

'use strict';

function Time() {
    this.date = new Date();

    this.hour = this.date.getHours();
    this.hour = (this.hour < 10 ? '0' : '') + this.hour;

    this.min  = this.date.getMinutes();
    this.min = (this.min < 10 ? '0' : '') + this.min;

    this.ampm = 'AM';
    if (this.hour > 12) {
        this.ampm = 'PM';
        this.hour -= 12;
    }
}

Time.prototype.getPretty = function() {
    return 'The time is ' + this.hour + ':' + this.min + ' ' + this.ampm;  
}

module.exports = Time;

Rerun Dockunit by running the following command in your terminal from the project root:

通过在终端中从项目根目录运行以下命令来重新运行Dockunit:

dockunit

Now all your containers should be passing. See how easy it is test your code against multiple versions of Node? Since the images are distributable and live on Docker Hub, anyone can run Dockunit on your project without setting up a local environment.

现在您所有的容器都应该通过了。 看到针对多个版本的Node测试代码有多么容易? 由于映像是可分发的,并且可以在Docker Hub上运行,因此任何人都可以在您的项目上运行Dockunit,而无需设置本地环境。

第3部分:使用Dockunit.io设置持续集成 (Part 3: Setup Continuous Integration with Dockunit.io)

Now that we’ve setup Dockunit for our project and pushed to Github, we can set up continuous integration on Dockunit.io so Dockunit tests are run on each pull request and push to the repository. If a pull request or push fails, a failed status will be shown on Github so we can fix our software.

现在我们已经为项目设置了Dockunit并将其推送到Github,我们可以在Dockunit.io上设置持续集成,以便在每个pull请求上运行Dockunit测试并将其推送到存储库。 如果拉取请求或推入失败,则Github上将显示失败状态,以便我们修复软件。

First, create an account on Dockunit.io.

首先,在Dockunit.io上创建一个帐户

Next, go to projects and integrate your account with Github:

接下来,转到项目并将您的帐户与Github集成:

dockunit-authorized-github

Within Dockunit.io, create a project for your Github repository:

在Dockunit.io中,为您的Github存储库创建一个项目

dockunit-new-project

That's it! You can now see the build status of your project. It will update automatically when you push to Github:

而已! 现在,您可以查看项目的构建状态。 当您按下Github时,它将自动更新:

dockunit-dash

Within Github, you can see the Dockunit build status within each Pull Request:

在Github中,您可以在每个Pull Request中看到Dockunit的构建状态:

dockunit-test

结论 (Conclusion)

In this tutorial we have created a simple Node application, setup Dockunit for local containerized unit testing, and integrated our project’s Github repository with Dockunit.io for continuous containerized integration testing. Containerized software testing is the future of assuring code integrity. Give it a try!

在本教程中,我们创建了一个简单的Node应用程序,设置了Dockunit以进行本地容器化单元测试,并将我们项目的Github存储库与Dockunit.io集成在一起以进行连续的容器化集成测试。 容器化软件测试是确保代码完整性的未来。 试试看!

翻译自: https://scotch.io/tutorials/containerized-testing-for-node-applications-with-dockunit

应用节点和容器的关系

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/culiu9261/article/details/107546567

智能推荐

IOC容器Autofac的另类使用

很少有写博客习惯,看来以后要改下了。 最近在公司项目中使用了Autofac,本人需要解决的问题比较特别,就是需要在单元测试时候替换实际处理的类,通过模拟数据库操作完成单元测试。 本人是个懒惰的程序员,因为不想修改autofac的配置文件,又要结合fakes进行模拟,在网上又未发现类似处理方法,所以特把自己的做法共享出来,供大家参考和改进。 因为实际代码为公司项目,未能尽列代码请见谅,同时认为...

Docker中操作镜像和容器的常用命令

场景 CentOS7中Docker的安装与配置: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119028701 在上面将Docker安装成功的基础上,记录下常用命令。 注: 博客:https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。 实现 帮助命令 docker version #显示docker的版本信息。 do..

集合容器概览

  Java世界中,泛型和集合容器的存在大大的提高了程序员的编程能力,是开发者技能百宝箱中的重要武器之一,、因此掌握集合框架的实现原理及内部结构变得非常的重要。本文主要对集合框架体系中日常开发经常遇到的接口、抽象类及其实现类进行梳理,从宏观上去理解整个集合框架体系,具体实现类的源码实现原理分析在单独的博客中进行详述。 集合框架简图                    Col...

上传到docker hub_在容器上构建持续部署,这份超详细实践指南不要错过!

作者 |倚天码农责编|刘静出品 |CSDN 博客要想理解持续集成和持续部署,先要了解它的部分组成,以及各个组成部分之间的关系。下面这张图是我见过的最简洁、清晰的持续部署和集成的关系图。图片来源(https://www.sonatype.com/products-overview)持续部署如图所示,开发的流程是这样的:程序员从源码库(Source Control)中下载源代码,编写...

程序员面试刷题的书哪个好-contribute2react:使用React.js并欢迎贡献的项目列表

程序员面试刷题的书哪个好学习 React 的一个好方法是用它构建一些东西。 但最好的方法是为已经存在的项目做出贡献,因为这是双赢的举措。 以下是按照以某种方式使用 React 和欢迎贡献的项目降序排列的列表。 找到一个有趣的项目,然后单击它的名称以访问贡献者指南。 :love_letter: 构建在现代网络上的可扩展桌面邮件应用程序。 21 世纪的终端模拟器。 21 世纪的终端模拟器。 React Starter Kit — 同构 Web 应用样板(Node.js、Express、GraphQL、React.js、Babel 6、PostCSS、Webpack、Browsersync) node.js cms 和 web 应用程序框架 适用于 macOS 的 React Native 开始使用 React、Redux 和 React-Router! Mac 和 Windows 上的可视化 Docker 容器管理 Mac 和 Windows 上的可视化 Docker 容器管理 使用 React.js 将纯文本转换为动态博客和网站 :telescope: 使用 Meteor 和 React 构建的开源社交新闻应用程序 适用于 Goo

黑马程序员---Java 容器集合

-----------android培训、java培训、java学习型技术博客、期待与您交流!------------ 集合: 1.map 映射表的基本思想是它维护的是键-值(对)关联,因此程序员可以用键来查找值。标准的java类库中包含了map的集中基本实现,包括:hashmap,treemap,linkedhashmap,weakhashmap,concurrenthashmap,i

很认真的聊一聊程序员的自我修养

我的公众号「码农之屋」(id: Spider1818),分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。 ​今天逛博客,看到了一篇推荐的文章《浅谈程序员的英语学习》,就点进去看了一下,对于文章中的观点我非常认同,英语是非常重要的,...

在腾讯云上部署Hexo博客

推荐理由搭建个人的空间博客目前深受个人开发者的追捧,然而博客的种类和平台有很多,Hexo是一个开源的静态博客生成器。相比于其他博客而言它只要是web容器就能用。除了闷头专研技术之外,程序员还需要不断地写作进行技术积累,写博客是其中最重要的方式之一。商业博客平台不少,但是更符合程序员背景的方案,是自己开发一个博客平台或者使用开源的博客平台。开源的博客平台多如牛毛,而且不乏优秀之作,如 Hexo、Oct

C++标准库顺序容器知识点总结

C++具有内置数据结构,但为了更好的满足开发者的需求,C++标准库提供了多种容器来供程序员调用,本篇博客主要是顺序容器的相关知识点总结 在C++中,容器主要是一些特定类型的集合,顺序容器为程序员提供存储和顺序访问的能力,主要的容器类型有vector、deque、list、forward_list、array、string,与内置数据类型相比,容器往往具有更好的灵活性和安全性,因此有必要掌握,下面

Java里线程安全的有界容器的实现

1. 引言 这篇博客通过实现一个有界容器来表述Java里wait,notify,notifyAll的用法。这些关键词用的概率不高,但是阅读一些源码的时候还是经常会遇到,写一下增强记忆。 具体生产实践的时候,对于我来说我是不推荐程序员们直接使用这些的,JAVA1.5之后提供很多直接可用的线程安全的容器,能少写代码就少些代码,降低了测试的需求, 也减少出错的可能性。 ...

求第k小数----直接使用priority_queue

之前写过一个博客求第k小数,很zz的使用冒泡排序和快排来解此题,哎,权当复习排序好了,看了大佬的代码,原来stl下直接就有封装好的容器priority_queue,直接使用就好了,这个的效率绝对要比我们写的排序算法要高,大家要以我为戒,不要重复发明轮子,也因此坚定了我学习stl的信念,真的是程序猿必学的啊,这里贴出简介的代码。 #include&lt;iostream&gt; #include...

三面美团Java岗,docker容器和虚拟机的区别

说到博客,大家会不由自主的地想到博客园,CSDN,GitHub,简书等。在这些平台里,有着无数的程序员发表自己的博客,这些博客有的是纯技术干货的分享,有的是对编程思想的感悟。可以说,一个好的博客平台是程序员心中的圣地。 1.对待博客的态度 然而对于程序员来说,并没有太多人的人坚持写博客,一方面程序员本身不善于写文章,另一方面很多程序员认为自己不是大牛,写了博客也没人看。 其实不然,不是大牛就不能写博客了吗?答案是否定的。正因为自己不是大牛,才更要写博客。我们写不出好的文章,但总能写的清楚吧。更何况,小编

node.js和npm的关系

一、npm是什么 当一个网站依赖的js代码越来越多,程序员发现这是一件很麻烦的事情: 去 jQuery 官网下载 jQuery 去 BootStrap 官网下载 BootStrap 去 Underscore 官网下载 Underscore …… 有些程序员就受不鸟了,于是npm就出来了,全称是 Node Package Manager 包管理工具。 这一点和maven、gradle十分相似,只不过maven、gradle是用来管理java jar包的,而npm是用来管理js的。 NPM 的实现思路...

在容器上构建持续部署,这份超详细实践指南不要错过!

作者 |倚天码农责编|刘静出品 |CSDN 博客要想理解持续集成和持续部署,先要了解它的部分组成,以及各个组成部分之间的关系。下面这张图是我见过的最简洁、清晰的持续部署和集成的关...

清晰架构的 Go 微服务: 程序容器

作者 |倚天码农来源 | 程序员宅基地,责编 | 夕颜出品 | CSDN(ID:CSDNnews)清晰架构(Clean Architecture)的一个理念是隔离程序的框架,使框架不会...

作为一名刚踏入it的女程序猿,我要开始写博客啦!!!就当是给自己的知识积累,fighting

最近学习了openlayer## 标题加粗样式 openlayer制作一张地图是很简单的,步骤如下: 1.首先下载官网(openlayer),将其js,css包下载下来,作为我自己的html中的引用(放到head里面,如下图): 在ol.js下面我还引入了jquery的和gps的包js包(目前没有用到!!!) 2,写一个div容器,其中容器id是map: 3,其次,body中new一个map ...

嘿牛程序员_成都传智博客_讨论字符串中字符出现的次数(续二:通过对象列表实现按次序输出)

---------------------- android培训、java培训、期待与您交流! ---------------------- 本节继续介绍将一组字符串中不同的字符出现的次数按多少次序输出         前面我们几经说到,按多少次序输出的关键问题是需要借助一个数组或者容器来接收字符以及出现的次数。前面请我们已经通过定义一个数组来实现,下面我们主要通过定义一个对象以及list接口

嘿牛程序员_成都传智博客_讨论字符串中字符出现的次数(续一:通过数组实现按次序输出)

本节介绍将一组字符串中不同的字符出现的次数按多少次序输出        前面我们已经谈到关于字符串中字符出现的次数,但是那种输出是无序的,就是说你无法直观的看到哪个字符的出现次数最多或最少。        我觉得,关键问题是需要借助一个数组或者容器来接收字符以及出现的次数。下面我们主要通过定义一个数组来实现。  //实现如下 package javaArray; import j

火炬博客系统5

软件及安装说明 <br><br> 本系统是一个Struts+Spring+Hibernate组合开发的博客系统,本系统使用分层体系架构,综合运用struts+spring+hibernate 三大主流开源框架构建,稳定高效、功能强大、易于维护。系统分为四个层次,即表示层(Presentation Layer)、域模型层(Domain Model Layer)、 业务层(bussiness Layer)和持久层(Persistence Layer),使用Spring框架整合Struts和 Hibernate,用Spring的“控制反转IOC”, 或者“setter依赖注入”来操作这些对象,这些对象在一个外部的XML文件中被引用。 <br> 表示层主要负责前台Jsp页面的表示,管理用户的请求;<br> 域模型层由实际需求中的业务对象组成,既常说的BO(Business Object);<br> 业务层是Web应用的中间部分,使业务逻辑和数据库持久操作解耦,使代码更容易维护,主要处理应用程序的业务逻辑和业务验证,管理事务,预留和其它层交互的接口,管理业务层对象之间的依赖,增加在表现层和持久层之间的灵活性,使它们互不直接通讯,管理从业务逻辑到持久层的实现。<br> 持久层用于分离业务逻辑和数据存取,把数据封装在DAO中,负责与数据库进行联络的一些任务都封装在此。 <br> 各个层可以单独开发,互相的耦合度很低,这在开发大项目的过程中尤其有优势,层与层之间通过调用接口完成所需要的逻辑单元应用,一切显得非常清晰简单。 <br> Struts是目前最流行的Web框架,提供对开发MVC系统的底层的很好的支持,采用的主要技术是Servlet、Jsp、和Custom Tag Library技术。使用该框架开发MVC程序变的非常简单,Struts对 MVC层的Model、View、和Controller都提供了对应的实现组件。Struts框架中Controller角色是由一个中心Servlet类和众多Action类合作扮演的,中心Servlet类为控制器提供中心控制点来初步处理所有的用户请求,并选择一个Action类处理具体业务逻辑。<br> Struts负责管理用户的请求,做出响应,提供控制器,委派调用业务逻辑,处理异常,UI 验证等,Struts用来作表示层部分,起控制和显示作用; 本系统使用 Spring 的DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor,将 Struts 动作整合到 Spring 框架中。 <br> Spring框架是轻量级组件部署和运行的容器,可以很好的支持AOP(面向切面编程)的开发模式,Spring能有效地组织中间层对象,通过Bean容器为业务对象、DAO对象和资源对象提供了IOC类型的装配能力,将Struts和Hibernate集成起来,使用Spring构建的应用程序易于单元测试。Spring为数据存取提供了一个一致的框架,包括JDBC和O/R Mapping产品。<br> Spring用来作业务层部分,负责处理应用程序的业务逻辑和业务校验;管理事务;提供与其它层相互作用的接口;管理业务层级别的对象的依赖等,用来作业务层部分和数据库操作的事务处理,需要在配置文件里配置好; <br> Hibernate是一个优秀的开放源代码的对象关系映射(O/R Mapping)框架,它对JDBC进行了非常轻量级的对象封装,提供了强大高性能的对象到关系数据库的持久化服务,使程序员可使用面向对象思维来操纵数据库。<br> Hibernate用来作持久层部分和域模型层部分,负责存储、更新、删除、查询数据库记录等,用来作DAO处理,本系统使用Spring整合Hibernate,spring为Hibernate的session提供了有效的容易和安全的控制,Spring控制Hibernate的SessionFactories,JDBC datasources及其它相关的资源,进行完整的事务管理和异常的包装,在此用了Spring的事物模板(TransactionTemplate)实现,可分离数据访问和事物处理,提高业务对象的可复用性,采用getHibernateTemplate()方法来操作hsql进行数据增删改等操作。 <br> <br> 本系统是一个先进的博客系统,能基本完整的实现博客的功能,主要有以下功能:<br> 1。用户注册登录功能。用户可以在网站上注册一个帐户,建立自己的博客,用户可以登录到自己的管理界面,管理文章、评论、相片、个人信息等。<br> 2。博客首页功能。可显示火炬博客系统的全面信息,如最新文章、热门文章等。<br> 3。我的首页功能。可显示个人博客的全面信息,如最新文章、最新评论、作者相片、日历等。<br> 4。博客管理功能。用户可以管理自己的博客,包括文章管理、评论管理、相片管理、档案管理、类别管理、个人资料管理、注册信息管理等。<br> 5。写文章功能。本系统采用流行的FCKEditor编辑器,提供强大的编辑和排版功能,文章可实现优美的显示效果。<br> 6。评论功能。访问者可对文章发表评论。<br> 7。留言功能。访问者可给每个博客留言。<br> 8、搜索功能。可按不同项目进行搜索。<br> 9。Tag功能。文章可产生多个相关Tag,可按不同Tag进行搜索。<br> 10。RSS功能。本系统采用先进的RSS2.0技术,实现RSS功能,便于浏览。<br> 11。相册功能。可浏览博客相片。<br> 12。个人档案功能。可浏览博客个人资料。 <br> 13。找回密码功能。可通过问题回答找回密码。。<br> 14。聊天功能。访问者和用户可在线聊天,可以群聊,也可以私聊,反应快速,功能强大。 <br> 15。博客统计功能。可统计博客系统的基本信息。<br> 16。访问人数统计功能。可统计网站在线访问人数。<br> 17。分页功能。本系统具备完善的分页功能。<br> 18。连接池功能。本系统采用连接池技术,解决了数据库瓶颈,大大提高了运行速度。<br> 19。注销功能。可安全退出系统。<br> 20。防重复提交功能。本系统还采用Struts的Token机制和JavaScript技术实现绝对安全的防重复提交功能。 <br> 21。文章管理。可修改、删除文章。<br> 22。评论管理。可回复、删除评论。<br> 23。相片管理。可上传相片,设置主肖像,删除相片。<br> 24。档案管理。可按月建立档案,浏览档案。<br> 25 。类别管理。可建立、修改、删除类别。<br> 26。个人资料管理。可输入修改个人资料。<br> 27。 注册信息管理。可输入修改注册信息,包括修改密码。<br> 28。 错误和异常管理。可处理错误情况,提示错误信息。<br><br> MYSQL安装<br> 将安装包解压缩,运行tdbmysql.bat,然后用torchblogdb-setup.sql建表,<br>将数据导入 MYSQL数据库。<br>将torchblog目录COPY至Tomcat/webapps/下,即Tomcat/webapps/torchblog<br>修改Tomcat/webapps/torchblog/WEB-INF/classes/init.properties文件<br>主要修改<br>datasource.url=jdbc:mysql://127.0.0.1/torchblog?useUnicode=true&characterEncoding=gb2312<br>datasource.username=root<br>datasource.password=<br>这三项,根据你的实际情况修改,但注意useUnicode=true&characterEncoding=gb2312不能修改。<br><br> 红梅居士

火炬博客系统6

软件及安装说明 <br><br> 本系统是一个Struts+Spring+Hibernate组合开发的博客系统,本系统使用分层体系架构,综合运用struts+spring+hibernate 三大主流开源框架构建,稳定高效、功能强大、易于维护。系统分为四个层次,即表示层(Presentation Layer)、域模型层(Domain Model Layer)、 业务层(bussiness Layer)和持久层(Persistence Layer),使用Spring框架整合Struts和 Hibernate,用Spring的“控制反转IOC”, 或者“setter依赖注入”来操作这些对象,这些对象在一个外部的XML文件中被引用。 <br> 表示层主要负责前台Jsp页面的表示,管理用户的请求;<br> 域模型层由实际需求中的业务对象组成,既常说的BO(Business Object);<br> 业务层是Web应用的中间部分,使业务逻辑和数据库持久操作解耦,使代码更容易维护,主要处理应用程序的业务逻辑和业务验证,管理事务,预留和其它层交互的接口,管理业务层对象之间的依赖,增加在表现层和持久层之间的灵活性,使它们互不直接通讯,管理从业务逻辑到持久层的实现。<br> 持久层用于分离业务逻辑和数据存取,把数据封装在DAO中,负责与数据库进行联络的一些任务都封装在此。 <br> 各个层可以单独开发,互相的耦合度很低,这在开发大项目的过程中尤其有优势,层与层之间通过调用接口完成所需要的逻辑单元应用,一切显得非常清晰简单。 <br> Struts是目前最流行的Web框架,提供对开发MVC系统的底层的很好的支持,采用的主要技术是Servlet、Jsp、和Custom Tag Library技术。使用该框架开发MVC程序变的非常简单,Struts对 MVC层的Model、View、和Controller都提供了对应的实现组件。Struts框架中Controller角色是由一个中心Servlet类和众多Action类合作扮演的,中心Servlet类为控制器提供中心控制点来初步处理所有的用户请求,并选择一个Action类处理具体业务逻辑。<br> Struts负责管理用户的请求,做出响应,提供控制器,委派调用业务逻辑,处理异常,UI 验证等,Struts用来作表示层部分,起控制和显示作用; 本系统使用 Spring 的DelegatingRequestProcessor 覆盖 Struts 的 RequestProcessor,将 Struts 动作整合到 Spring 框架中。 <br> Spring框架是轻量级组件部署和运行的容器,可以很好的支持AOP(面向切面编程)的开发模式,Spring能有效地组织中间层对象,通过Bean容器为业务对象、DAO对象和资源对象提供了IOC类型的装配能力,将Struts和Hibernate集成起来,使用Spring构建的应用程序易于单元测试。Spring为数据存取提供了一个一致的框架,包括JDBC和O/R Mapping产品。<br> Spring用来作业务层部分,负责处理应用程序的业务逻辑和业务校验;管理事务;提供与其它层相互作用的接口;管理业务层级别的对象的依赖等,用来作业务层部分和数据库操作的事务处理,需要在配置文件里配置好; <br> Hibernate是一个优秀的开放源代码的对象关系映射(O/R Mapping)框架,它对JDBC进行了非常轻量级的对象封装,提供了强大高性能的对象到关系数据库的持久化服务,使程序员可使用面向对象思维来操纵数据库。<br> Hibernate用来作持久层部分和域模型层部分,负责存储、更新、删除、查询数据库记录等,用来作DAO处理,本系统使用Spring整合Hibernate,spring为Hibernate的session提供了有效的容易和安全的控制,Spring控制Hibernate的SessionFactories,JDBC datasources及其它相关的资源,进行完整的事务管理和异常的包装,在此用了Spring的事物模板(TransactionTemplate)实现,可分离数据访问和事物处理,提高业务对象的可复用性,采用getHibernateTemplate()方法来操作hsql进行数据增删改等操作。 <br> <br> 本系统是一个先进的博客系统,能基本完整的实现博客的功能,主要有以下功能:<br> 1。用户注册登录功能。用户可以在网站上注册一个帐户,建立自己的博客,用户可以登录到自己的管理界面,管理文章、评论、相片、个人信息等。<br> 2。博客首页功能。可显示火炬博客系统的全面信息,如最新文章、热门文章等。<br> 3。我的首页功能。可显示个人博客的全面信息,如最新文章、最新评论、作者相片、日历等。<br> 4。博客管理功能。用户可以管理自己的博客,包括文章管理、评论管理、相片管理、档案管理、类别管理、个人资料管理、注册信息管理等。<br> 5。写文章功能。本系统采用流行的FCKEditor编辑器,提供强大的编辑和排版功能,文章可实现优美的显示效果。<br> 6。评论功能。访问者可对文章发表评论。<br> 7。留言功能。访问者可给每个博客留言。<br> 8、搜索功能。可按不同项目进行搜索。<br> 9。Tag功能。文章可产生多个相关Tag,可按不同Tag进行搜索。<br> 10。RSS功能。本系统采用先进的RSS2.0技术,实现RSS功能,便于浏览。<br> 11。相册功能。可浏览博客相片。<br> 12。个人档案功能。可浏览博客个人资料。 <br> 13。找回密码功能。可通过问题回答找回密码。。<br> 14。聊天功能。访问者和用户可在线聊天,可以群聊,也可以私聊,反应快速,功能强大。 <br> 15。博客统计功能。可统计博客系统的基本信息。<br> 16。访问人数统计功能。可统计网站在线访问人数。<br> 17。分页功能。本系统具备完善的分页功能。<br> 18。连接池功能。本系统采用连接池技术,解决了数据库瓶颈,大大提高了运行速度。<br> 19。注销功能。可安全退出系统。<br> 20。防重复提交功能。本系统还采用Struts的Token机制和JavaScript技术实现绝对安全的防重复提交功能。 <br> 21。文章管理。可修改、删除文章。<br> 22。评论管理。可回复、删除评论。<br> 23。相片管理。可上传相片,设置主肖像,删除相片。<br> 24。档案管理。可按月建立档案,浏览档案。<br> 25 。类别管理。可建立、修改、删除类别。<br> 26。个人资料管理。可输入修改个人资料。<br> 27。 注册信息管理。可输入修改注册信息,包括修改密码。<br> 28。 错误和异常管理。可处理错误情况,提示错误信息。<br><br> MYSQL安装<br> 将安装包解压缩,运行tdbmysql.bat,然后用torchblogdb-setup.sql建表,<br>将数据导入 MYSQL数据库。<br>将torchblog目录COPY至Tomcat/webapps/下,即Tomcat/webapps/torchblog<br>修改Tomcat/webapps/torchblog/WEB-INF/classes/init.properties文件<br>主要修改<br>datasource.url=jdbc:mysql://127.0.0.1/torchblog?useUnicode=true&characterEncoding=gb2312<br>datasource.username=root<br>datasource.password=<br>这三项,根据你的实际情况修改,但注意useUnicode=true&characterEncoding=gb2312不能修改<br><br> 修改配置可用oracle。 <br>红梅居士<br>

高级java笔试题-resource-index:优质的技术博客、社区推荐

高级java笔试题 优质的技术博客、社区推荐 目前你所看到的内容由我收集并整理,如果你有优秀的博客或社区需要推荐或自荐,请点: 收到大家的提交后会及时收录与更新。 JAVA 博客 博客名称 博客简介 Spring Cloud、Docker、Kubernetes,及其相关生态的技术 架构设计,设计模式,框架使用,源码分析 Spring Cloud、Docker、Kubernetes,及其相关生态的技术 Spring Boot相关 虚拟化、容器化、API化和微服务化的WEB技术 我们将自己很大一部分时间献给了网络,从幼年到成年,网络中有我们成长的足迹 只求分享与免费,不隐含扭曲的价值观,而是整合并充盈正能量 喜欢体验各种各样的科技产品,热爱 Coding 分享技术,分享生活 所谓天才,不过是每一天的积累成才 非著名程序员 SpringCloud、Docker、Vue、MiniProgram 生命不息,奋斗不止 精选企业应用架构实践中非常实用的干货内容 专注web前后端,大数据,数据治理等技术。 沉迷于Java开发,专注于Web后端技术,追求新技术探索 探讨 Java 生态的知识点,内容覆盖

代表15支阿里系技术博客,云栖社区入驻程序员宅基地

2016,我们来了。云栖社区入驻CSDN!首批15支技术团队,包含数据库、aliexpress、云盾、云存储、资源编排、手机淘宝、智能语音交互、技术保障、容器、ODPS、E-MapReduce、中间件、持续交付还有社区技术团队,送给程序猿们一份别开生面的新年礼物。

spring对hibernate的集成中的回调(CallBack)机制

回调函数对于我们来说并不陌生,之前我们在学习js的时候经常用到回调函数,在java基础中也接触到了回调函数,在这篇博客中我们将介绍spring和hibernate集成后的回调函数的使用。   为什么使用回调函数?      我们都知道程序员在完成CRUD操作的时候,需要用到session来操作,但是在spirng和hibernate集成以后,session是有spring容器来产生并且管理,

我是一名朝九晚五的程序员(你也可以!)

我的公众号「码农之屋」(id: Spider1818),分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。 我一直在思考Safia Abdalla发的一个蛮特别的推特: 一个也许不怎么主流的见解(有点讽刺产自于我): 你没有必要写博客文...

STL c++ 使用小结

各位看官,欢迎来到趁热搬砖小码农的博客。 在写C++程序的时候会发现STL是一个不错的东西,减少了代码量,使代码的复用率大大提高,减轻了程序猿的负担。还有一个就是容器,你会发现要是自己写一个链表、队列,或者是数组的时候,既要花时间还要操心怎么去维护,里面的指针啊,内存够不够用啊,长度问题,有没有可能溢出啊等等一系列的问题等着我们去解决,还是比较头疼的。所以容器的出现解决了这一个问题,它将这些数据结构都封装成了一个类,只需要加上头文件,我们就可以轻松的应用,不用那么复杂,就连指针也被封装成了迭代器,用起来更

Java中的容器类List、Set、Map的对比

====================================================== 注:重要!程序员如何有效的放松身心!下班后做什么? ====================================================== 好长时间没有更新博客了,因为这段时间开始学习java编程思想这本书,希望可以对java有一个更深入的了解,以便在处理a

如何写好一篇博客(文章)

前言随笔: 作者:HKD 在CSDN写博客已经快一年了,第一篇博客是在2020年10月30日发表的,当初写博客的目的很纯粹,因为当时准备秋招,刷笔试题算法题,就想做做总结,进行归纳,于是乎就有了我的第一篇博客:【算法-Java实现】盛最多水的容器(下图)。虽然在网上已经有了很多同样的此类文章,但是毕竟代码是我一行一行敲出来的,思路是我一字一字写出来的。有了很多前辈的引路,我们才会避免走弯路。再次推荐:左神的《程序员代码面试指南》!非常经典的一本算法书,里面都是高频算法面试题。 好了,回归正题,本文是个人写

程序员面试刷题的书哪个好-webSummary:前端总结

程序员面试刷题的书哪个好 本文旨在加深对前端知识点的理解,资料来源于网络,由本人(博客:) 收集整理。 一些开放性题目 1.自我介绍:除了基本个人信息以外,面试官更想听的是你与众不同的地方和你的优势。 2.项目介绍 3.如何看待前端开发? 4.平时是如何学习前端开发的? 5.未来三到五年的规划是怎样的? position的值, relative和absolute分别是相对于谁进行定位的? absolute :生成绝对定位的元素, 相对于最近一级的 定位不是 static 的父元素来进行定位。 fixed (老IE不支持)生成绝对定位的元素,通常相对于浏览器窗口或 frame 进行定位。 relative 生成相对定位的元素,相对于其在普通流中的位置进行定位。 static 默认值。没有定位,元素出现在正常的流中 sticky 生成粘性定位的元素,容器的位置根据正常文档流计算得出 如何解决跨域问题 JSONP: 原理是:动态插入script标签,通过script标签引入一个js文件,这个js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入。 由

随便推点

推荐文章

热门文章

相关标签