# 大染志
分享编程、运维、生活与思考

Junv's blog

## 解决Hibernate只执行8次数据库操作

发表于 2011-11-26 更新于 2026-08-04

嗯，原因是这样的，今天下午在写一个获取某个类别下文章数量的时候，需要为每个目录都执行查询，但是我发现一个问题，Hibernate只会执行8次操作，之后就停在那里了，也不会返回数据。

噢，真是恼火，最终在百度上找到了解决办法，原因是这样了，因为我每次执行操作的数据库查询的时候没有关闭Session，因此导致出现了问题。

同志你只要加上这样这样一句话：

    1

    session.close()；

好了，再试试，已经搞定了!

## node、express、mysql、jade实现用户登录数据获取及验证

发表于 2011-11-01 更新于 2026-08-04

今天要给大家介绍一下如何利用node.js的expressjademysql三个module实现获取form表单的内容以及通过数据库验证登录的正确性。请确保你已经下载好了前面三个module并且你的电脑里面已经安装好mysql。

首先看看运行页面：

再给大家看看整个小系统的目录结构吧：

请大家按照图中所示的目录结构建立好所有的文档吧。当然jquery你下载就可以了。

接下来，我们将建立数据库：

    1
    2
    3
    4
    5
    6
    7
    8
    9

    create database receipts;  #创建数据库

    #创建名为user的表
    use receipts;
    create table  user (
        userid bigint auto_increment not null primary key,
        username  varchar(20) not null,
        pass  varchar(30) not null
    );

然后我们来书写我们所需要的login.jade。这里使用jade，我们需要创建一个简单的layout.jade（模板）,在layout模板中我们将定义最基本的网页框架。设定大多数网页相同的部分。这里关于jade的语法我就不多讲了，jade的官网上很详细，直接给出layout的代码：

    1
    2
    3
    4
    5
    6

    !!! 5
    html
          head
              title=title
            link(rel='stylesheet',type='text/css',href='/css/style.css')
          body!=body

注意，由于jade会对我们所写的代码进行重新编码，编码成linux的相关格式，这里建议大家使用类似notepad++、ultra editor等软件时将其编码为UTF-8 无DOM格式，并且请不要在文件中同时使用空格和Tab对文件分隔，会导致报错。这里强调一下比如上述 title=title，这里是把网页的标题赋值给一个变量叫做title，之后我们声明并赋值title。link后面不能添加空格。类似的也一样。

下面是我们的登录界面login.jade,代码如下：

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    form(id='login',method='post',action='/login')
        h1 Log In
        p(style='margin-top:20px;')   #{error}
        fieldset(id='inputs')
            input(id='username',name='username',type='text',placeholder='Username',autofocus='',required='')
            input(id='password',name='password',type='password',placeholder='Passowrd',required='')
         fieldset(id='actions')
            input(type='submit',id='submit',value='Log in')
            a(href='') Forgot your password
            a(href='http://google.com') Register

大致是定义一个完整的表单。并且定义一个显示提示错误信息的地方。当然还有最重要的css代码。我将在后面提供源码给大家下载。
home.jade和index.jade这个程序里面我们用不到，因此内容可以不管它。

接下来，我们就开始写代码了。当然是使用express了。首先我们将写两个路由器在app.js中，一个是显示登录的页面并且作为首页，另外一个是验证登录的页面。

//首先添加配置信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    app.set('view engine','jade');   //设置模板引擎
    app.set('views',__dirname+'/views');   //配置jade文件夹
    app.use(express.static(__dirname+'/public'));  //设置静态文件文件夹,比如css，js,/images
    app.use(express.bodyParser()); //用户获取form表单数据
    app.use(express.methodOverride());

    //设置首页。
    app.get('/',function(req,res){
        res.render('index',{title:'欢迎使用收据管理系统',error:''});
    });

    1

    style="padding-left: 30px;"

- 获取表单中数据
- 创建mysql数据库连接
- 从mysql请求数据
- 将数据库中数据与form表单进行比较，并返回结果。

//获取表单中数据
var user = req.body.username； //这样便可以获取到form表单中 name=”username”值，依赖于express.bodyParser()

创建mysql数据库连接。这里我们将做一个小小的封装。将封装的函数写入 user.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    //连接mysql服务器
    function connectServer(){
        //创建mysql连接,设置用户名，密码
        var client = mysql.createClient({
            user:'root',
            password :'root'
        });
        client.host= '127.0.0.1';
        client.port=3306;
        client.database='receipts'; //选择需要使用的数据库，创建数据库时不必须，其他时候必须
        return client;   //返回创建好的数据库连接对象
    }

//接下来我们将从数据库获取数据，同样我们也做一个封装。因为要执行数据库操作。因此我们需要传入一个数据库连接对象client，并且传入用户名，以便查出该用户对应的密码。再则我们需要创建一个回调函数以便于，在获取到数据库中的值后，做出相关判断。按照常规长发很难获取值。应该闭包可以。（这个回调函数得感谢一个群里的大牛。），代码如下。

    1
    2
    3
    4
    5
    6
    7
    8
    9

    //执行mysql查询操作。返回查询获取到的对象
     function  selectFun(client,username,callback){
        //client为一个mysql连接对象
        client.query('select pass from user where username="'+username+'"',function(err,results,fields){
            if(err) throw err;

            callback(results);   //在获取结果之后由回调函数进行相关操作
        });
    }

    1

    style="padding-left: 30px;"

    1

    style="padding-left: 30px;"

    1

    style="padding-left: 30px;"

    1

    style="padding-left: 30px;"

    1

    style="padding-left: 30px;"

    1

    style="padding-left: 30px;"

    1

    style="padding-left: 30px;"

## Node.js web框架express入门（1）

发表于 2011-10-29 更新于 2026-08-04

从我自己现在学校node.js说了解的情况，我觉得node.js至少比Java简单不少。使用node.js的诸多第三方框架更是让node.js简单了不少。其实express 框架几天前我就看了一些。也写了一些例子。虽然没有完全掌握，但是我想在这里和大家一起分享我学到的知识，也算是一种记录。

首先，当然我们也得安装express 的module

    1

    npm install express

接下来我们就是可以开始写一个简单的程序了。

    1
    2
    3
    4
    5
    6

    var express = require('express'); //导入module
     var app = express.createServer(); //创建并返回一个express的server对象
     app.get('/',function (req,res){ //为跟地址目录设置路由，并且监听get方法。
           res.send("Hello,World"); //向浏览器返回hello world
      });
     app.listen(4000); //设置服务器监听4000端口

运行程序，然后再浏览器中输入localhost:4000试试，是不是出现了hello world了。当然这只是一个最简单的程序。下面我们可以再多做一些。

这里需要说明一下。默认的，系统将在您的请求处理中，在此例里面即在app.get();里面为你添加下面两句话

    1
    2

    res.charset='utf-8';         //系统默认的res.send()和res.render（）都默认采用utf-8编码
        res.contentType('Text/html');      //系统提供默认为Text/Html的Content-Type

接下来，我们将通过链接中的地址获取请求内容

在程序中加入一段代码如下

    1
    2
    3
    4
    5

    app.get('/hello/:name',function (req,res){
           //如果你在地址栏中输入如下/hello/Junv.那么你将在页面中看到name=======Junv
          //'/hello/:name'中的name相当于定义一个变量name，并且把我们输入的名字赋值给他。
           res.send('name======'+req.params.name);
    });

试试看看吧。成功了吧！

对不起，写着写着觉得很别扭。今天就写到这里吧。下次在继续吧。

## 使用Node.js发送电子邮件（E-mail）

发表于 2011-10-26 更新于 2026-08-04

10月27日更新，可以发送附件

今天晚上花了点时间试了一下使用node.js发送电子邮件，也挺简单的，不过有个问题一直没有解决，就是发送附件,我弄明白的时候，会补充资料的。

首先我们还是得安装node的第三方用户发送email的module 。

    1

    npm install nodemailer

安装好之后，还有一个问题需要注意，我们应该确保用来发送邮件的邮箱地址是打开只是IMAP 、SMTP功能的，这样才可以发送邮件成功。

接下来我们就开始写代码，其实很简单，官方网站也都已经说得很清楚了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

    var mail = require('nodemailer');  //包含发送邮件所需module
    mail.SMTP = {
        use_authentication: true, //如果我们使用QQ等邮箱，这个必须写且为true
        host: 'smtp.qq.com',   //定义用来发送邮件的邮箱服务器，一般是QQ这些的
        port:25,    //定义服务器端口，一般是25	,如果是使用SSL端口一般为465,或者587
        ssl:false,     //默认不适用SSL，可以省略不写
        user: 'wahyd4@qq.com',   //邮箱用户名
        pass:'*****'   //输入邮箱密码
    }
    mail.send_mail(
    {
        sender:'wahyd4@qq.com',   //发送邮件的地址
        to:'wahyd4@gmail.com',     //发给谁
        subject:'随便把',               //主题
        body:'Hello,这个邮件来自node.js'
    },
    //回调函数，用户判断发送是否成功，如果失败，输出失败原因。
    function(error,success){
        if(!error){
            console.log('message success');
            }else{
            console.log('failed'+error);
        }
    }
    );

这里我没有使用SSL进行发送，而且发送的是纯文本，也可以发送html,如果发送html则在send_mail函数里面加上：

    1

    html: ' 你好。。邮件来自node.js',

如果使用SSL进行发送我们则需要将mail.SMTP改为：

    1
    2
    3
    4
    5
    6
    7
    8

    mail.SMTP = {
        use_authentication: true,  //如果我们使用QQ等邮箱，这个必须写且为true
        host: 'smtp.qq.com',   //定义用来发送邮件的邮箱服务器，一般是QQ这些的
        port:465,    //定义服务器端口，一般是25	,如果是使用SSL端口一般为465
        ssl:true,     //默认不适用SSL，可以省略不写
        user: 'wahyd4@qq.com',   //邮箱用户名
        pass:'*****'   //输入邮箱密码
    }

好了。现在你运行程序试试,是不是成功了。

我今天晚上遇到一个错误 :503 ERROR,need EHLO and AUTH first。就是因为没有添加use_authentication = true的缘故。加上之后，搞定。

———————————————————分割线———————-

发送附件的话。首先我们得使用

    1

    var fs = require('fs');    //导入文件系统相关的包

饭后我们将文件读入内存，并将其发送。

    1
    2
    3
    4
    5
    6
    7

    //读入文件
    var img = fs.readFileSync(__dirname+"/cat.jpg");

    var attachment = [{
        'filename': "cat.jpg",   //这里只是给附件取名称，而不是导入文件内容
        'contents': img         //导入文件
    }]    //定义我们需要发送的附件

接下来我们需要在send_mail函数中加入发送附件即可

    1
    2
    3
    4
    5
    6
    7
    8
    9

    mail.send_mail(
    {
        sender:'wahyd4@qq.com',   //发送邮件的地址
        to:'wahyd4@gmail.com',     //发给谁
        subject:'测试发送文件',       //主题
        attachments: attachment, //添加附件
        body:'Hello,这个邮件来自node.js，包含附件哦，亲！'

    },

附上Nodemailer的网址：http://www.nodemailer.org/

enjoy it!

最后还是感谢 andris9 大叔很快帮我解决了问题！

## 使用node.js连接mysql数据库

发表于 2011-10-25 更新于 2026-08-04

Javascript连接数据库可能很多同学之前都没有想到吧，不过现在使用node.js我们可以很容易地连接各种数据库。比如传统关系型数据库Mysql以及现在正火的非关系型数据库。这里讲一下如何连接mysql数据库其实官方的文档以及很详细了。

首先我们需要连接mysql所需的Module

    1

    npm install mysql

接下来就可以开始编程，连接数据库了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    var mysql = require('mysql');//导入mysql Module
    var client = mysql.createClient({
        user:'root',
        password :'root'
    });
    /*
    设置数据库的地址，这里请不要使用localhost，
    至少我在windows这里出错,如果不写系统默认为localhost
    */
    client.host ='127.0.0.1';
    client.port = 3306;       //设置数据库端口，如果不写默认为3306
    client.database = 'node';
        //create a database
        client.query('create database test_db',function(err){
        if (err && err.number != mysql.ERROR_DB_CREATE_EXISTS) {
                 throw err;   //添加异常处理
        }
        });

这里我们使用的是client.query();执行sql语句，官方的API中client.query(sql,[params,cb])方法中还可以添加回调函数。

执行其他SQL语句也是使用client.query()函数。这里说一下插入语句

    1

    client.query('insert into node_t  values(?,?)',[1000,'Junv']  );

推荐这种参数化插入，而不是将值直接写在里面，可以防止sql注入。

注意：今天下午我最初尝试连接数据库的时候，它一直报错“Domain name not found”,只要我们加上

    1

    client.host ='127.0.0.1';

将系统默认的host=localhost改成127.0.0.1即可。具体原因不明。

是不是很简单呢？接下来我会写关于express 和jade的博客了。一边学习一边写博客。哈哈。

## 解决npm.js不能成功安装Node.js包

发表于 2011-10-23 更新于 2026-08-04

学习Node.js当然安装其他开发者开发的各种各样的包一定是必须的，不知道在内地的童鞋发现一个问题没有，我们现在很难从npm.js直接去下载安装包了。笔者在电信和教育网连续试了几天都没有成功。

大概介绍一下npm.js吧。npm.js是node.js的一个包管理工具。通过你可以很方便的安装所有node.js的第三方包、类库，而不需要知道他们的地址、不需要再自己一次一次手动安装。

过程是这样的：（注：笔者只是在windows环境下测试过）

一般地我们会在cygwin里面使用” npm install 你需安装的包名”进行安装。但是我反反复复试过多次，均是很难成功，只有昨天夜里一点左右成功过一次。最初我认为我我们的网速太慢了，于是我在cygwin下面配置代理：

> export http_proxy=http://127.0.0.1:8087 注：我使用的是go agent进行代理（具体安装请google一下）。

通过代理我成功地安装成功了npm 本身，但是当我转而通过 npm install …进行安装的时候就出现错误了，npm提示 Socket hang up。具体原因不明，总之npm 不能使用cygwin里面配置的代理，于是我使用 export -n http_proxy 删除代理设置。

随后我在网上又收到了另外一个解决方法。在npm里面设置打理

> npm –proxy http://127.0.0.1:8087

不过设置好之后使用 npm install …，发现同样不成成功，npm 根本没有通过代理去发请求。

最后，我找到一个神器npmf。它的大致介绍是说npmf 是npm的一个复制，他可以永久保存那些包的每个版本。并且你通过npmf安装的包在你下次部署软件的时候依然可用。老实说后面一句话，我没有理解明白，到底是本地缓存，还是在网上缓存。

> 各位可以前往npmf网站一看究竟：http://npmfjs.org/

> 同时还有一个介绍npmf的网页：http://nodeknockout.com/teams/preservation-society

接下来就是见证奇迹的时刻了：

我们可以直接把npm 默认的registry 换成 npmf的：

> npm config set registry http://npmfjs.org:9000

> npm install 你需要安装的包

是不是发现很神奇，一个包可能10秒甚至更少就可以安装成功。如果你想把registry改成npm默认的

> npm config set registry http://registry.npmjs.org

或者你可以临时使用npmf的registry的包，在你每次安装的包的时候都使用一下语句

> npm –registry http://npmfjs.org:9000 install 你需要安装的包

告诉你们个秘密：通过上面的两种方法，可以使用代理哦。速度又提高了不少。哈哈。。。。。

总结：造成npmjs.org的速度很慢的原因我始终不太清楚。我想npmjs.org的网络应该比npmfjs.org好很多才对。怎么会反过来了。以前我在有人抱怨过说内地使用 npm安装包很难。但是我不知道这是个别现象还是大家都是这个样子。难道G*F*W故意把 registry.npmjs.org和谐了？哎，不管了，大家使用我这个方法来吧。欢迎各位留言

## Notepad++ 设置、插件配置

发表于 2011-10-19 更新于 2026-08-04

虽然平时也一直在使用Notepad++，但是并没有深入地了解它，没有去鼓捣它。今天中午看了一篇博文说另外一个文本编辑器多么多么强大。我下载使用了一下，发现里面比较好的功能就是函数花括号自动完成、可以更换主题、支持分屏、可以安装插件同时查看几个文件，不过有一点不好就是他是收费软件。于是我想，开源的notepad++是不是也有那些功能呢？在我搜索一番之后，于是就发现了notepad的惊天大秘密。

主题设置

依次点击面板上的settings——style configurator。系统默认提供十几种不同的风格，可供选择。用户还可以为不同的编程语言设置个性化的前、后景色，设置字体大小、种类。我个人使用的主题是Black Board.

分屏实现

据我发现目前notepad++没有快捷键可以开启分屏，而是用户右键点击某个打开的文档列表的Tab。选择Move to other view 或者 Copy to other view，即可以移动或者复制到分屏。此时屏幕编程两屏界面（好像notepad++目前只支持两屏）

字体的放缩

当光标在目前程序时，按住Ctrl键同时，滚动鼠标滚轮即可实现字体的大小改变。

函数自动补充

依次点击Settings—-preferences—Back up/Auto completion。勾选enable auto-completion on each input.下面有function completion 和word completion可供选择。

同样也可以勾选Function parameter hint on input。这个是函数暗示吧。需要注意的是，我发现在javascript 和html 下提示相对较好，但是都不会补充完全，都是部分补充。笔者在Java下面测试，大致只能提示类一级，不能提示其二级方法。如果你想拥有很好的提示还是使用eclipse吧。

插件安装：

notepad++支持两种方式安装插件（plugin）：第一种，将插件的.dll文件复制到notepad++安装目录的plugin目录下。第二种方法是通过notepad++自带的插件plugin management 进行安装。点击即可实现自动安装插件。安装完成后重启即可工作。

这里推荐一些比较好的插件列表：http://my.oschina.net/hcom/blog/4429

Notepad++官方下载：http://notepad-plus-plus.org/

我也是今天才发现notepad的这些功能，希望可以和大家一起交流、讨论。

## Struts2 国际化使用、实现

发表于 2011-10-15 更新于 2026-08-04

这学期在学习Java EE，也是我选择的方向。因此很感兴趣。前几天看了Struts2 实现国际化，于是今天下午便真实操作一遍。

首先我们要实现国际化，当然得建立相关语言的**.properties**文件。且该文件需放在classes目录下。即是eclipse的src的根目录。

struts2的命名规则是 “自定义名_语言_国别(英文字母为大写).properties”

比如：

> 中文简体:test_zh_CN.properties

> 美国英文:test_en_US.properties

其他国家的，请大家自己在网上搜索一下吧。

.properties 文件的内容形式为key=value

比如：

> 中文： username=用户名（这里中文要被转码为另外一种格式，才能使用。转换后为： u7528u6237u540D，eclise会自动帮你转换）

> 英文：username=username

写好properties文件之后。我们就需要修改struts.xml文件让其支持国际化属性，在struts标签下添加：

这里的value属性的值“test”为你的properties文件的最前面的自定义名。

然后再使用的时候，比如我想获取username的国际化属性：

> <s:text name=”username” >或者 <s:property value=”getText(‘username’)”/> 均可以

当然还有另外一种方法不需要在struts.xml添加语句。在jsp需要使用国际化资源的时候，添加如下：

> <s:i18n name=”test”>

> <s:text name=”username” > 或者<s:property value=”getText(‘username’)”/>

这里的name标签的test和上面的一样。需要注意的是。你每使用一次国际化资源就需要添加一个<s:i18n>标签。

其他的使用就和一般的struts没有区别了。

然后我们可能需要手动切换语言，在jsp页面里面添加：

    1

    1

    1

## 吵架好烦，哎，心力交瘁

发表于 2011-10-13 更新于 2026-08-04

好累！好累！

我哪里错了嘛，就因为我说了一句话不太该说的话！

然后你就拂袖而去，纵使我再三挽留你，你却越来越凶，每次你这个样子，我真的不晓得应该怎么办！

我可以怎么办嘛？

我有这样凶过吗？在你面前，我不晓得脾气好了好多倍

你个性却却越来越不好。一摸到就生气，我每次都是在第一时间给你道歉，告诉你我错了。我不该这样做，但是不晓得你想过没有，难道真的每次错的都是我吗，我有那样吼过你吗？

我不是怕你，是因为我爱你，所以我在忍！我愿意接受这一切。但是你不能每次都这样啊。

好累，好烦。不晓得应该从哪里和你沟通，

今天明明不是因为我们的问题，你却说我偏向你寝室的同学，说我偏向漂亮的女生。

真的，大部分关于他们的印象我是从你那里得到的啊。我不喜欢太要强的女生，有啥子了不起嘛。我见多了。

你每次都说我是做错了不愿意道歉。但是你又晓得，很多次我真的觉得我没得错，但是我又在道歉。

在你面前我永远都是错的。

在你们寝室面前，我永远都是被最后考虑的。呼之即来挥之即去。。。。

你理解我一下嘛。你怎么就不理解人呢！

没人理解我，好累。好累！

## 钱让很多小人原形毕露

发表于 2011-10-12 更新于 2026-08-04

这几天学校正在搞奖学金的评比，需要每个同学自己对自己的情况进行评估，你在上一学年所获得的将和其他证书这些都是获得加分，当然学习成绩也是分数中很重要的一部分。于是情况出现了。

能够得奖的人为了得更高的将，千方百计地去找分加，同时还要看看其他人是不是快要超过他了。其他人加分是不是正规的，其他人是不是在到处找关系盖章?

真他妈的恶心，在这个奖学金评比之中我看到了谄媚、欺诈、鬼鬼祟祟，说人家加分这样或者那样的不正常。

哎！真的是，钱让小人原形毕露了。

想想去年我也不是这个样子啊。看看有些人，把所有能够加的分都加到最高！你妹啊！

一个奖学金也是，得奖的人都是妈的一群水货，什么都不会，就是会考试、会讨好老师、会拍马屁、会装疯卖傻！

你们就潇洒吧！我又一次明白了，千里之堤，溃于蚁穴！

0%