CentOS6.7手动安装MySQL5.6

时间是越来越紧张了呀,所以也没有这么更新博客了,最近在学习linux的基本操作,先装个mysql试试呗。

先选择从oracle官网下载安装包来安装,详细步骤参看:mysql官方下载安装教程(centos)

下面只说关键步骤和坑,以为记录:

1、下载mysql安装包,使用 lrzsz 工具上传到服务器,然后使用 tar xzvf 解压到 /usr/local 下,并创建软连接

ln -s /usr/local/mysql-5.6.38 /usr/local/mysql

2、添加用户与组,并更改刚才解压的文件的权属

groupadd mysql
useradd -r -g mysql mysql
chown -R mysql:mysql mysql-5.6.38

3、安装数据库

cd /usr/local/mysql/scripts
./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/home/mysql_data

解释:basedir为mysql的安装地址,datadir为mysql数据存放地址
继续阅读

css实现正方形,即宽度为百分比,高度与宽度相同的布置方式

这是开发中遇到的一个问题:一组图片列表,每行展示5个,图片宽度按照页面宽度的20%设置,然后高度与宽度相同,也就是展示为正方形,该如何用css设置呢?先看demo

这里需要用到伪元素:before,如下是html

<div class="box">
    <div class="content diff"><div class="img">假设这是图片<br>就是这个div</div></div>
    <div class="content"><div class="img">假设这是图片<br>就是这个div</div></div>
    <div class="content diff"><div class="img">假设这是图片<br>就是这个div</div></div>
    <div class="content"><div class="img">假设这是图片<br>就是这个div</div></div>
    <div class="content diff"><div class="img">假设这是图片<br>就是这个div</div></div>

    <div class="content"><div class="img">假设这是图片<br>就是这个div</div></div>
    <div class="content diff"><div class="img">假设这是图片<br>就是这个div</div></div>
    <div class="content"><div class="img">假设这是图片<br>就是这个div</div></div>
    <div class="content diff"><div class="img">假设这是图片<br>就是这个div</div></div>
    <div class="content"><div class="img">假设这是图片<br>就是这个div</div></div>

    <div class="content diff"><div class="img">假设这是图片<br>就是这个div</div></div>
    <div class="content"><div class="img">假设这是图片<br>就是这个div</div></div>
    <div class="content diff"><div class="img">假设这是图片<br>就是这个div</div></div>
    <div class="content"><div class="img">假设这是图片<br>就是这个div</div></div>
    <div class="content diff"><div class="img">假设这是图片<br>就是这个div</div></div>
</div>

继续阅读

hibernate的文档也会偷懒:Access to DialectResolutionInfo cannot be null when ‘hibernate.dialect’ not set

配置hibernate4的SessionFactory,按照文档配置完毕,总是下面的报错,无法创建factory:

Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

将hbm.cfg.xml中的dialect改成了hibernate.dialect还是不行,嘿,怎么肥事…还解决不了了么。

然后一阵谷歌,发现原来是hibernate的文档没有更新…下面是SessionFactory的生成方法:

Configuration configuration = new Configuration().configure("hbm.cfg.xml");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
        .applySettings(configuration.getProperties()).build(); // 就是少了applySettings
SessionFactory factory = configuration.buildSessionFactory(serviceRegistry);

估计新版本需要要将配置应用到serviceRegistry上才行吧,然后文档就这么埋了坑。

自定义nice-validator的theme

工作中使用到nice-validator.js,发现默认的theme无法满足要求,默认theme的提示框是在控件的右方,但是实际的页面中那个位置不一定可以放得下提示框,所以想到可以放在空间内部的右边(也可以浮动在上方,使用默认的“yellow_right_effect”进行调整)

因此研究了下nice-validator.js自带的theme,找到了修改的办法,下面是将提示框放在控件内部的右方的代码:

$.validator.setTheme({
    'inner-right': {
        formClass: 'n-inner-right', // 修改form的class
        msgClass: 'n-inner-right', // 修改msg-box的class
        msgShow: function ($msgbox, type) { // 重新定义msg-box的位置,可以参见zh-CN.js的代码
            $msgbox.css({
                'line-height': '0',
                'display': 'inline-block',
                'vertical-align': 'top',
                'outline': '0',
                // '+5px' 是为了更好看
                'left': -($msgbox.width() + 5) + 'px',
                // '5px' 是为了更好看
                'margin-top': '5px'
            });
            // 改变了msg-box的class,所以默认的css样式失效,需要重新设置
            $msgbox.find('.n-icon').css('background-image', 'url(../component/nice-validator-1.1.1/images/validator_default.png)');
        }
        //,
        // 这里还可以设置其他更多的方法,可以参见文档
        //msgHide: function(){}
    }
    /*
     ,
     更多主题可以在这里设置
     */
});

将代码保存到custom_theme.js中,并在nice-validator.js的下方引入,调用方法就是 {theme: ‘inner-right’}

这里给出了DEMO,可以F12研究下,这里是文档地址:https://niceue.com/validator,搜索“setTheme()”即可找到

通过Java连接mysql对反斜杠“\”转义的测试

在java中,反斜杠“\”转义是“\”,因此表示一个“\”要使用“\\”,如果是正则表达式,那么表示一个“\”需要用“\\\\”,在mysql中,反斜杠转义依然是“\”,和java相同。

现在问题是:如果mysql中一个字段的内容包含反斜杠,然后通过java连接mysql去筛选这个字段所在的条目,要怎么写才能将该字段筛选出来呢?下面就是一个实验:

1,先建立测试数据:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);
insert into test (name) values ('\\'), ('\\\\');

向数据库中插入2条数据,name的值分别是“\”和“\\”。

2,使用jdbc连接mysql,然后测试筛选条件:

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
PreparedStatement pstmt = conn.prepareStatement("select * from test where *条件"); // “*条件”见下文
pstmt.setString(1, "*筛选值"); // “*筛选值”见下文
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
	System.out.println(rs.getString("name"));
}

继续阅读

Spring自动扫描无法扫描jar包中的bean的解决办法

前几天用eclipse打包了一个jar包,jar包里面是定义的Spring的bean。

然后将jar包放到lib下,设置spring的自动扫描这个jar包中的bean,可谁知根本无法扫描到bean,显示错误就是找不到bean,当时就纳闷儿了,为什么扫描不到,结果搜索之后才发现,用eclipse打包jar包要勾选“Add directory entries”才能被Spring正确扫描到,居然有这个说法,呵呵… 不知道

勾选“Add directory entries”才能被spring扫描到

勾选“Add directory entries”才能被spring扫描到

继续阅读

cas client3.4.x部署包1.0.0发布

cas client部署包也搞定了,因为弄cas server的时候要cas client配合,所以cas client也就一起弄了,文档比cas server少多了,今天一天就搞定了,下面是部署包的连接:

cas-client-3.4.x-deployment-package:
https://github.com/Strangeen/cas-client-3.4.x-deployment-package

介绍还是引用我写的文档的概述吧:

cas client用于部署在应用中,与cas server交互实现单点登录功能,每个需要实现单点登录的应用均需要部署cas client。出于达到对后期快速开发的目的,我在研究cas server的同时,也基于cas官方提供的client模板JA-SIG Java Client Simple WebApp Sample对cas client进行配置和封装出一套部署包,该套部署包需要与cas server部署包同时使用

继续阅读

cas server4.2.x部署包1.0.0发布

抽空时间研究了1个月吧,终于把cas4.2.7搞通了。

配置真的太多太杂了,而且各种文档版本迭代太多,让人搞不清楚到底要怎么配置,还是要拿出杀手锏,有些地方不明白直接干源码… 最终还是搞定了基本的需求配置。

于是,配置了一套部署包,用于后期快速使用和部署,详见我的github:

cas-server-4.2.x-deployment-package:
https://github.com/Strangeen/cas-server-4.2.x-deployment-package

其他的不想写了,文档就断断续续写了1周,写得太累了,介绍就直接引用我写的文档中的概述吧:

cas是yale大学的单点登录系统开源项目,在行业中非常流行,功能也非常强大,但由于cas系统非常庞大,系统和文档版本迭代又比较多,造成各种文档和网上的教程都无法完全匹配,初次使用时的学习成本会非常大。所以出于方便后期快速使用的考虑,我对cas4.2.7进行了学习研究,在我能理解的范围内,将工作和学习中接触过的场景纳入cas进行配置,基于方便统一配置的理念,基于cas4.2.7修改了一些配置文件、文件存放路径以及添加了部分功能,并最终打包封装成了一套仅需极简配置就可以部署完成的系统部署包

jquery.ztree.js搜索插件v1.0发布:jquery.ztree.search.js

之前工作中有个需求,是模糊搜索ztree树节点名称,然后展示出来,当时研究了下ztree,然后做出来了,当时只是写了几个零散的方法就实现了(DEMO见之前一篇文章:《我也来实现ztree模糊搜索功能》)。

这几天,突然有同事问我要代码,看来其他同事也会使用呢,于是我把几个零散的方法给了他。可是我在给他的过程中,觉得零散方法是挺乱的,而且有些过度方法也会暴露给调用者,为什么不自己封装一下呢?另外既然ztree原生没有这种功能(原生ztree只能找到搜索出来的节点,要展示还需要结合另外几个方法),那么我应该做一个插件实现这个功能,就一个js,其他的同事只要引入,然后直接用tree对象调用方法就可以实现。

于是研究了下ztree的源码,发现ztree对象的生成是靠绑定在$上的zTree.init方法实现的,于是按照作者的思路和写法对zTree.init方法进行了重写,这样我自己就可以很容易的插入自定义的方法了,于是就完成了这个插件。

插件下载地址:
https://github.com/strangeen/jquery.ztree.search

下面是Quick Start,详见上面的地址:

<script type="text/javascript" src="jquery.ztree.all.min.js"></script>
<script type="text/javascript" src="jquery.ztree.search.js"></script>
<script type="text/javascript">
  var zTreeObj = $.fn.zTree.init($("#tree"), setting, zNodes);
</script>
  
<input type="text" value="" id="in" />
<input type="button" value="SEARCH" onclick="zTreeObj.searchNodes($('#in').val())" />
  1. jquery.ztree.search.js必须在jquery.ztree.all.min.js下方引入
  2. 点击search按钮,zTree对象zTreeObj在页面上的显示状态就为按输入框中值搜索后的结果,清空输入框会擦除高亮展示,tree视图不改变

Maven构建SpringMVC环境报错“java.lang.ClassNotFoundException: org.springframework.web.servlet. DispatcherServlet”

今天朋友发了个maven项目给我看,问我为什么启动不了。说实话,一直用Jfinal都快不会用spring了… 还是决定看看。

接收了文件,是maven构建的,打开eclipse,导入maven项目,然后部署到tomcat,启动tomcat,就报错了:“java.lang.ClassNotFoundException: org.springframework.web. servlet.DispatcherServlet”,错误信息如下图:

java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet

java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet

很明显的第一反应就是没有SpringMVC的包,于是检查pom.xml,发现没有问题,spring web mvc包是正确引入了的,查看Maven Dependencies,发现也是正常的,打开jar包,也没有问题,web.xml配置也没有问题…

我去,难道jar包版本问题,于是部署了更高版本的jar包,并且还试过配置更高的JDK版本,依然报错,不能启动…

于是google,发现大部分人都是说没有导入jar包,没有部署成功,可是jar包我导入了,也配置正确了。

就在这时,突然看到有个人说tomcat是否部署成功,于是立刻查看网站部署的文件夹,发现WEB-INF下根本没有lib文件夹… 继续阅读

https部署折腾(五):修改function.php设置wordpress文章中链接的http为https

当站点部署为https后,原来的文章中很多地方还是引用的http的链接,怎么办呢?其实可以不用管的,但是觉得很不爽,强迫症嘛,理解一下。另外,如果链接是资源文件,比如js啊,iframe的src链接啊什么的,可能还会造成浏览器网址栏前面的绿色小锁消失,并提示“您与此网站建立的是私密链接,但网络上的某些用户也许能更改此网页的外观”,差不多就是这个提示了。这个听起来是比较严重,是因为页面上有些东西并没有通过https加密,所以从服务器到浏览器的过程中可能被篡改,这时浏览器就会认为不是绝对安全的,但是who care,小博客,没用户,没流量,谁吃饱了撑着会改呢?

下面还是说说怎么修改吧…可以通过修改主题中的function.php文件达到目的,找到function.php文件,在末尾的“?>”前加上如下代码(如果没有“?>”,那么下面的代码就加在最后),然后将我的网址juwends.com替换成自己的:

//=== 替换内容中http链接为https ===//
function my_content_manipulator($content){
 if( is_ssl() ){
 $content = str_replace('https://www.juwends.com', 'https://www.juwends.com', $content);
 $content = str_replace('https://www.juwends.com', 'https://www.juwends.com', $content);
 }
 return $content;
}
add_filter('the_content', 'my_content_manipulator');

加上这段代码后,就可以实现文章中的链接的http变成https了。

注意,这里只是修改了页面的展示,并没有修改数据库中的内容。

https部署折腾(四):修改wp-config.php设置wordpress的https访问

本文中所说的站点部署https是利用阿里云的CDN部署的https,我的理解是CDN上面的站点(缓存页面)是https访问,而部署在阿里云空间上的原始网站并不是https,还是http,这个http站点也就是CDN的回源站点。上述是我的理解,但是是否正确还需要再深入研究才能窥其真理。

因此,wordpress配置https就不能简单的在后台的设置里面将主页设置为https,因为这个站点其实是http的,如果配置成https,那么当访问https的时候,会先访问CDN,而CDN会回源,也就是会去找http的站点,这时回源站点又被设置为了https,那么又会被重定向到CDN,这样就出现了访问CDN的无限重定向,导致网页无法打开,或者某些文件无法加载的问题。

所以使用CDN部署的https必须将wordpress的后台主页设置为http。

然后设置https访问通过修改wp-config.php文件实现,找到这个文件,打开后在开头的“<?”下面添加如下代码即可(“//”后面的注释可以不用加,习惯加上注释,才知道是做什么的)

//=== 将用户界面与主页相关的http链接替换为https,后台不用更改主页地址 ===//
define('WP_HOME', 'https://'.$_SERVER['HTTP_HOST']);
define('WP_SITEURL', 'https://'.$_SERVER['HTTP_HOST']);
//=== 设置https为开启 ===//
$_SERVER['HTTPS'] = 'ON';

保存后就可以通过https访问了,到这里,就设置完毕了。那么,再总结下:

1,wordpress主页在后台依然设置为http
2,在wp-config.php中添加代码实现https访问

MySQL联表删除语法

之前写到联表更新,那么有没有联表删除呢?

答案也是有的,下面将是代码记录:

假设有2张表:
1,user表,字段为:id,user_name
2,user_role表,字段为:id,role_name,user_id
关联关系是 user.id = user_role.user_id

现要删除某一条user表的数据以及该user对应的user_role表中的数据,那么用下面的sql就可以实现这个目的了:

delete u, u_r from user u, user_role u_r 
where u.id = ? and u.id = u.user_id

上述sql中,u是user的别名,u_r是user_role的别名,from语句前面要附上别名,这个别名是用于指定删除哪张表数据的,如果只有u或者u_r,那么仅删除对应的那张表上的数据。

MySQL联表更新语法

之前写代码操作数据库,如果遇到需要同时更新两张表时,我会采用在同一个事务中使用2句sql语句分别进行更新。其实,这种需要发送2句sql语句的方法效率相对来说是比较低的,有没有只用1句sql语句就可以完成这个操作的呢?

答案是有的,下面将是代码记录:

假设有2张表:
1,user表,字段为:id,user_name
2,user_role表,字段为:id,role_name,user_id
关联关系是 user.id = user_role.user_id

现要更改某一条user表的数据的的user_name字段以及该user对应的user_role表中的数据的role_name字段,那么用下面的sql就可以实现这个目的了:

update user, user_role set 
	user.user_name = ?, user_role.role_name = ?  
where user.id = ? and user.id = user_role.user_id

Filter和HttpServletRequest代理类实现Request参数值更改

前几日写代码,发现没有过滤搜索框输入的特殊字符,比如输入“_”会导致所有数据都被搜索出来(数据库为MySQL),这显然是不正确的,所以决定将搜索关键词中的“_”替换成”\_”,但是我突然想到个问题,这个搜索值获取是在每个Controller中获取的,我必须要找到所有的Controller中获取该参数的代码位置,然后进行修改,然而我并不想这么做…

我想到将request中该参数的值在被Controller获取前更改,然后就不用修改之前的代码就可以实现,但是后面我发现ServletRequest并没有提供修改参数值的方法… 后面经过思考,想到可以制造一个ServletRequest代理类,在代理类中将getParameter重写,即返回需要的值,再将代理类的实例传给Controller使用,这个方法最后验证是可行的。

下面将记录代码,这里使用到Filter,作为请求到达Controller前的拦截器,对request进行代理:

继续阅读

WordPress文章转载版权信息添加(第二篇):添加编辑面板

昨天写了一篇文章《WordPress添加文章转载版权信息(第一篇):自定义栏目(字段)来实现》,文中说到使用自定义字段来实现转载版权信息的添加,但是这个方法依然显得有些麻烦,所以今天这篇文章就准备说说如何改进(如果没有看上一篇文章,建议看一遍,因为下文用到了上文的参数和值)。

自定义的转载版权信息面板

我们可以使用自定义面板来完成这个工作,先来看看我自定义的面板样子(右图),这个面板就位于文章编辑栏的右侧,“版权类型”默认就是“原创可以被转载”,即reprint为pr,下面两栏分别对应info和src。

添加面板相对来说要简单一些了,仅仅是更改代码而已,所有代码都在主题的function.php中添加,添加到文档末尾的?>上面(如果没有?>,那就添加到末尾即可),由于代码比较长,我拆成了几块,挨个贴进文件即可:

继续阅读