wangyuheng's Blog

time for change

26了。
正在为了年初的TODO LIST努力, 虽然有些事已经没法努力了。
努力去做吧,为了表明奔三的决心,为了抡圆了活。

首马达成,果然是在大连,虽然只是个半马。
觉得生活充满了阳光。
很匆忙的一天,设错了闹钟,急匆匆出门,搭上邻居的顺风车;进错了地铁,被lan方的大哥,带着我这个小兄弟一起,打不到车,又没零钱,大哥给我20元,去后面换零钱,车就开走了;去后面遇到了大姐,给了我1元硬币;下车之后,又遇到了大哥,把20元还给了他。
跑步时,一直跟着浦老师,速度很舒服,天气也很舒服,觉得这座城市真的很美好。一路上一直是我们几个,聚在一起,互相鼓励、加油。路上很多人,大声喊着加油;志愿者们提供着水和毛巾,一次次击掌真的给了我很大的能量。
觉得人很奇怪,对陌生人可能有更多的耐心和友好。
喜欢这种感觉,感恩这种生活。
在18公里之后,脱离队伍独自向前,但是连续的几个坡度,让我的双腿越来越沉,好在路人给了我极大的鼓舞,终于坚持到了终点。
2小时6分,遗憾的没有进入2小时,不过觉得很成功了。
路上有人昏倒,希望没事吧。
发了朋友圈,应该收到了最多的一次赞和评论。
喜欢这种阳光的生活,是第二次提到阳光这个词吧。
完赛后,漫步在这座好像很熟悉,其实又很陌生的城市,没有目的,慢慢的走着,感觉很美好。
追求生活的意义,现在又多了一点,要追求阳光。
提升一些自信和美好。
终于在今年快过去一半的时候,完成了一项计划,算不算厚积而薄发?
为了遇见更好的自己,努力!
Time For Change!

forward-30-0

转载请注明出处WangYuheng’s Blog

起因

公司项目中一直用了myBatis,但是将dao层封装了,并不知道是如何使用的。学习的第一步是查看官方文档,发现虽然有中文文档,但是并没有完整的示例,只介绍特性和一些用法,但是并不知道怎么让环境跑起来。于是按照官方blog的介绍,搭建了一个示例环境,留给有需要的人。

环境搭建

项目采用maven构造方式,IDE为eclipse,依赖mybatis包及mysql驱动,具体版本及jdk版本见下文pom。

pom文件

采用了jdk1.8版本,以及最新的mysql驱动,如果jdk版本较低,需要选用相应的低版本驱动。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>wang.crick</groupId>
    <artifactId>study.mybatis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>study.mybatis</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.2</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

数据脚本

数据库安装及环境搭建,可参照其他博客,这里只提供创建表的数据脚本。

DROP DATABASE IF EXISTS `zero`;
CREATE DATABASE IF NOT EXISTS `zero`;
USE `zero`;

DROP TABLE IF EXISTS `z_user`;
CREATE TABLE `z_user` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(50) NULL DEFAULT NULL,
    `password` VARCHAR(50) NULL DEFAULT NULL,
    `role_type` INT(11) NULL DEFAULT NULL,
    `address` VARCHAR(200) NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE INDEX `username` (`username`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=13;

INSERT INTO `z_user` (`id`, `username`, `password`, `role_type`, `address`) VALUES
    (1, 'zhangsan', '123131', 1, 'shanghai,pudong');

XML配置文件

根据使用习惯,推荐使用XML配置文件。因为是maven项目,所以在src/main/resources目录下新建一个配置文件mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <!-- 数据库配置信息 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://172.16.99.121:3306/zero?useUnicode=true&amp;characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="mysqlPwd123456!" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="wang/crick/study/mybatis/UserMapper.xml" />
    </mappers>
</configuration>

配置文件配置了一个数据源,和jdbc的配置方法类似。这里需要注意,如果在url增加额外属性配置,连字符需要用转义后的&代替&。
在mappers标签内,指定了mybatis映射的 SQL 语句。

映射SQL语句

配置文件指定的UserMapper.xml文件内容如下

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"   
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="wang.crick.study.mybatis.UserMapper">

    <select id="selectByName" resultType="wang.crick.study.mybatis.User">
        select username , password , role_type AS role_type , address 
        from z_user
        where username = #{username}
    </select>
    
    <insert id="add" parameterType="wang.crick.study.mybatis.User">
        insert into z_user
        (username , password , role_type , address)
        values(#{username} , #{password} , #{roleType} , #{address} )
    </insert>

</mapper>  

namespace指定了唯一标识,为了保证其唯一性,通常以包名+文件名来命名,也可以自定义名称。
从标签名可以判断出两个方法的作用是select和insert。
wang.crick.study.mybatis.User指向了一个javeBean文件,通过#{}方式,可以映射javaBean的属性变量。

package wang.crick.study.mybatis;

public class User {

    private int id;
    private String password;
    private String username;
    private int roleType;
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getRoleType() {
        return roleType;
    }

    public void setRoleType(int roleType) {
        this.roleType = roleType;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

}

执行数据操作

mybatis提供了一个SqlSessionFactory,用来根据配置文件,创建资源。SqlSessionFactory创建出来后,在程序运行期间,一直存在,并且不应该被修改或清除。在需要执行数据操作的时候,通过单例的SqlSessionFactory打开一个SqlSession,执行CRUD操作,在执行完毕后,关闭SqlSession。

package wang.crick.study.mybatis;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Main {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
        
        User liUser = new User();
        liUser.setUsername("lisi");
        liUser.setPassword("123654");
        liUser.setRoleType(2);
        liUser.setAddress("辽宁省大连市");
        int result = session.insert("wang.crick.study.mybatis.UserMapper.add", liUser);
        System.out.println(result);
        
        User zhang = (User)session.selectOne("wang.crick.study.mybatis.UserMapper.selectByName", "lisi");
        System.out.println(zhang.getUsername() + ": from " + zhang.getAddress());
//        session.commit();
    }
}

程序通过SqlSessionFactoryBuilder读取xml配置文件的方式构建了一个SqlSessionFactory,并打开一个SqlSession,执行了insert和select操作,对应Mapper文件中的两个标签,具体的映射规则为,根据Mapper文件中的namespace+方法id。参数直接传入javaBean,或者用javaBean接收参数,通过属性名映射规则,将属性与数据库字段对应。
只有执行commit()方法后,操作才会提交至数据库。
因为只有一个main方法,所以没有关闭session的操作。正常程序,应该将session.close()放在finally中,保证一定会执行。

至此,一个最基本的mybatis环境搭建完毕,但是这只是一个简单而丑陋的方式,还有很多方法,可以将项目精简与美化,让mybatis发挥出自身的优势。

项目优化

properties配置文件

在src/main/resources/prop目录下新建一个配置文件config.properties

db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://172.16.99.121:3306/zero?useUnicode=true&characterEncoding=utf-8
db.username=root
db.password=mysqlPwd123456!

注意,此时不需转义,不能用&替换&
将配置信息抽离到此文件中,在mybatis-config.xml中通过properties标签注入属性。

<properties resource="prop/config.properties">
    <!-- <property name="driver" value="com.mysql.cj.jdbc.Driver" /> -->
</properties>

此标签在标签内部,property标签会替换properties中的内容。

别名

在Mapper文件中,指定了javaBean的位置,但是需要指定包名+类名。在这里,我们可以单独指定某个类的别名,可以在Mapper中用别名替换全路径名,或者指定基础包名,然后就可以在基础包上加上路径类名,简化操作。

<typeAliases>
    <!-- <typeAlias alias="User" type="wang.crick.study.mybatis.User" /> -->
    <package name="wang.crick.study.mybatis"/>
</typeAliases>

此标签同样要在标签内部。
此时UserMapper.xml就可以修改为

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"   
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="wang.crick.study.mybatis.UserMapper">

    <select id="selectByName" resultType="User">
        select username , password , role_type AS role_type , address 
        from z_user
        where username = #{username}
    </select>
    
    <insert id="add" parameterType="User" >
        insert into z_user
        (username , password , role_type , address)
        values(#{username} , #{password} , #{roleType} , #{address} )
    </insert>

</mapper>

接口

在main方法中,对于sql的调用语句如下:

User zhang = (User)session.selectOne("wang.crick.study.mybatis.UserMapper.selectByName", "lisi");

这有2个问题,一是通过字符串定位映射,容易出现误差,而是需要执行强制转型。
mybatis提供了更为清晰和类型安全的实现形式:利用接口。

UserMapper userMapper = session.getMapper(UserMapper.class);

然后可以用

User zhang = userMapper.selectByName("lisi");

替换之前的

User zhang = (User)session.selectOne("wang.crick.study.mybatis.UserMapper.selectByName", "lisi");

除此之外,接口还提供了另一种简便的方法,可以通过标签自定义sql语句,而不需要xml的映射文件。

package wang.crick.study.mybatis;

import org.apache.ibatis.annotations.Select;

public interface UserMapper {

    User selectByName(String username);
    
    int add(User user);
    
    @Select("select * from z_user where id = #{id}")
    User selectById(int id);
}

调用方法为

package wang.crick.study.mybatis;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Main {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        
        User liUser = new User();
        liUser.setUsername("lisi");
        liUser.setPassword("123654");
        liUser.setRoleType(2);
        liUser.setAddress("辽宁省大连市");
        int result = userMapper.add(liUser);
        System.out.println(result);
        
        User zhang = userMapper.selectByName("lisi");
        System.out.println(zhang.getUsername() + ": from " + zhang.getAddress());
        
        User firstUser = userMapper.selectById(1);
        System.out.println(firstUser.getUsername() + ": from " + firstUser.getAddress());
//        session.commit();
    }
}

注意,此时UserMapper.xml文件中的namespace必须指向接口文件UserMapper.java

mappers指向包

可以将Mapper的接口和xml单独抽离到某个包下,然后在mybatis-config.xml中修改标签的配置。
因为是不支持通配符操作的,按之前的配置方式,没增加一个映射,就需要增加一个配置。
抽离之后,可以扫描整个包目录,增加映射后,不需要修改配置文件。
修改后的mybatis-config.xml文件为

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <properties resource="prop/config.properties">
    </properties>
    <typeAliases>
        <package name="wang.crick.study.mybatis.domain"/>
    </typeAliases>
    <!-- 数据库配置信息 -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${driver}" />
                <property name="url" value="${db.url}" />
                <property name="username" value="${db.username}" />
                <property name="password" value="${db.password}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name="wang.crick.study.mybatis.mapper"/>
    </mappers>
</configuration>

目录结构为

mybatis-starter-00

Mapper XML 文件

xml中的映射sql文件,是mybatis最强大的功能,但不是本篇文章的重点。所以会在另一篇文章中详细介绍一些技巧、已经容易遇到的问题。

至此,一个集成了mybatis的java项目已经搭建完成,可以在此基础上编写业务逻辑代码。

转载请注明出处WangYuheng’s Blog

在CentOS7环境下搭建mysql5.7数据库服务,强调一下版本号,因为安装过程中需要指定。

安装过程

下载mysql仓库rpm

wget http://repo.mysql.com//mysql57-community-release-el7-8.noarch.rpm

安装仓库

sudo rpm -Uvh /mysql57-community-release-el7-8.noarch.rpm

也可以手动配置repo,此时不需要下载rpm文件。

配置仓库

vi /etc/yum.repos.d/mysql-community.repo 

通过命令打开文档,输入如下内容

[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

注意baseurl中的版本号需要与当前系统环境一致。如/el/7中的7与系统centOS7版本一致。

查看可用软件源

yum repolist enabled | grep mysql

执行yum安装

yum install mysql-community-server 

启动mysql服务

service mysqld start

配置

查询root密码

密码由mysql自动生成,可以在log文件中查看。

sudo grep 'temporary password' /var/log/mysqld.log

登陆mysql

mysql -uroot -p上步获取的密码

修改密码

登陆成功后,不能执行操作,需要先修改密码。犹豫安全策略,新设置的密码必须包含大小写字母,数字以及符号。

ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'; 

修改访问权限

此时的数据库只能本机访问,通过修改表的方式将权限开放给全部用户。

mysql -uroot -pMyNewPass4!

use mysql;

update user set Host = '%' where User='root';

注意,修改表后,必须重启mysql服务,修改才能生效。

service mysqld restart;

转载请注明出处WangYuheng’s Blog

在CentOS7环境下搭建mysql5.7数据库服务,强调一下版本号,因为安装过程中需要指定。

安装过程

下载mysql仓库rpm

wget http://repo.mysql.com//mysql57-community-release-el7-8.noarch.rpm

安装仓库

sudo rpm -Uvh /mysql57-community-release-el7-8.noarch.rpm

也可以手动配置repo,此时不需要下载rpm文件。

配置仓库

vi /etc/yum.repos.d/mysql-community.repo 

通过命令打开文档,输入如下内容

[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

注意baseurl中的版本号需要与当前系统环境一致。如/el/7中的7与系统centOS7版本一致。

查看可用软件源

yum repolist enabled | grep mysql

执行yum安装

yum install mysql-community-server 

启动mysql服务

service mysqld start

配置

查询root密码

密码由mysql自动生成,可以在log文件中查看。

sudo grep 'temporary password' /var/log/mysqld.log

登陆mysql

mysql -uroot -p上步获取的密码

修改密码

登陆成功后,不能执行操作,需要先修改密码。犹豫安全策略,新设置的密码必须包含大小写字母,数字以及符号。

ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!'; 

修改访问权限

此时的数据库只能本机访问,通过修改表的方式将权限开放给全部用户。

mysql -uroot -pMyNewPass4!

use mysql;

update user set Host = '%' where User='root';

注意,修改表后,必须重启mysql服务,修改才能生效。

service mysqld restart;

转载请注明出处WangYuheng’s Blog

在CentOS环境下搭建一个nginx的服务器,安装过程比较简单,做一个简单的记录。

安装过程

配置repo

vi /etc/yum.repos.d/nginx.repo 

通过命令打开文档,输入如下内容

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

其中centos表明当前系统,7表示系统版本。

执行yum安装

sudo yum install -y nginx

安装程序执行完毕后,可以通过

nginx -v

查看安装nginx版本,并确认程序安装成功。

启动服务

service nginx start 

此时会提示 Redirecting to /bin/systemctl start nginx.service
因为在centos7中将service 和 chkconfig 命令合并到systemctl中,但仍可通过service启动nginx服务。
此时通过浏览器访问http://localhost,可以看到nginx启动成功的提示。

配置

修改服务目录

vi /etc/nginx/conf.d/default.conf

listen 80; 表示监听80端口
server_name localhost;表示域名或ip,可以以此搭建反向代理服务器,实现负载均衡。这个后续会有文档单独写。
location / {} root表示指向的静态文件目录路径,index表示首页文件,可以自定义修改root目录, 或者直接修改默认目录下的首页文件 /usr/share/nginx/www/index.html
重启nginx服务

service nginx restart

刷新浏览器,可以看见修改以生效。

转载请注明出处WangYuheng’s Blog

在CentOS环境下搭建一个nginx的服务器,安装过程比较简单,做一个简单的记录。

安装过程

配置repo

vi /etc/yum.repos.d/nginx.repo 

通过命令打开文档,输入如下内容

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

其中centos表明当前系统,7表示系统版本。

执行yum安装

sudo yum install -y nginx

安装程序执行完毕后,可以通过

nginx -v

查看安装nginx版本,并确认程序安装成功。

启动服务

service nginx start 

此时会提示 Redirecting to /bin/systemctl start nginx.service
因为在centos7中将service 和 chkconfig 命令合并到systemctl中,但仍可通过service启动nginx服务。
此时通过浏览器访问http://localhost,可以看到nginx启动成功的提示。

配置

修改服务目录

vi /etc/nginx/conf.d/default.conf

listen 80; 表示监听80端口
server_name localhost;表示域名或ip,可以以此搭建反向代理服务器,实现负载均衡。这个后续会有文档单独写。
location / {} root表示指向的静态文件目录路径,index表示首页文件,可以自定义修改root目录, 或者直接修改默认目录下的首页文件 /usr/share/nginx/www/index.html
重启nginx服务

service nginx restart

刷新浏览器,可以看见修改以生效。

转载请注明出处WangYuheng’s Blog

工作需要,在虚拟机中安装了一个CentOS7的linux环境,用来测试MongoDB。记录一下MongoDB的安装和配置过程。

安装过程

安装过程通过yum方式,需要配置repo。

配置repo

vi /etc/yum.repos.d/mongodb-org-3.2.repo

通过命令打开文档,输入如下内容

[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc

执行yum安装

sudo yum install -y mongodb-org

设置mongodb监听端口

semanage port -a -t mongod_port_t -p tcp 27017

启动服务

sudo service mongod start

开机自启动

chkconfig mongod on

此时会看到服务启动成功的提示 【OK】

开发调试

在虚拟机中安装好环境后,如何用本机环境进行开发访问?
本机为windows环境并没有安装mongodb客户端程序,无法通过命令行直接访问,全部依赖于java代码访问。
此时有个问题,mongodb安装完成后,默认只监听本机ip(localhost),必须要修改绑定

查看本机ip

为了让mongodb监听虚拟机的ip(局域网内ip),必须先将虚拟机的网络连接环境设置为桥接。通过命令查看

ifconfig

注:因为我的安装镜像为mini.iso,默认并没有安装网络工具,此时可能会报错
ifconfig command not found,需要先安装此工具集

yum install net-tools

修改绑定监听IP

vi /etc/mongod.conf

打开文档,并将bind_ip修改为ifconfig查看到的本地ip

重启mongodb服务

sudo service mongod restart

创建集合(数据库)

需要进入mongo后,才可以执行mongo相关命令。进入方式为执行如下命令。默认ip为127.0.0.1,因为修改过bind_ip,所以此处的ip地址为刚配置的bing_ip

mongo ip地址

创建集合

use zero

创建用户

mongodb默认为允许匿名用户访问,可以通过以下命令添加此集合的管理员账户

db.createUser({user:'zero_admin',pwd:'zero_123456',roles:[{role:'dbOwner',db:'zero'}]}) 

至此,已完成在虚拟机中搭建mongodb服务,并可在本机程序访问调试。下篇文章将介绍如何通过java程序连接mongodb

工作需要,在虚拟机中安装了一个CentOS7的linux环境,用来测试MongoDB。记录一下MongoDB的安装和配置过程。

安装过程

安装过程通过yum方式,需要配置repo。

配置repo

vi /etc/yum.repos.d/mongodb-org-3.2.repo

通过命令打开文档,输入如下内容

[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc

执行yum安装

sudo yum install -y mongodb-org

设置mongodb监听端口

semanage port -a -t mongod_port_t -p tcp 27017

启动服务

sudo service mongod start

开机自启动

chkconfig mongod on

此时会看到服务启动成功的提示 【OK】

开发调试

在虚拟机中安装好环境后,如何用本机环境进行开发访问?
本机为windows环境并没有安装mongodb客户端程序,无法通过命令行直接访问,全部依赖于java代码访问。
此时有个问题,mongodb安装完成后,默认只监听本机ip(localhost),必须要修改绑定

查看本机ip

为了让mongodb监听虚拟机的ip(局域网内ip),必须先将虚拟机的网络连接环境设置为桥接。通过命令查看

ifconfig

注:因为我的安装镜像为mini.iso,默认并没有安装网络工具,此时可能会报错
ifconfig command not found,需要先安装此工具集

yum install net-tools

修改绑定监听IP

vi /etc/mongod.conf

打开文档,并将bind_ip修改为ifconfig查看到的本地ip

重启mongodb服务

sudo service mongod restart

创建集合(数据库)

需要进入mongo后,才可以执行mongo相关命令。进入方式为执行如下命令。默认ip为127.0.0.1,因为修改过bind_ip,所以此处的ip地址为刚配置的bing_ip

mongo ip地址

创建集合

use zero

创建用户

mongodb默认为允许匿名用户访问,可以通过以下命令添加此集合的管理员账户

db.createUser({user:'zero_admin',pwd:'zero_123456',roles:[{role:'dbOwner',db:'zero'}]}) 

至此,已完成在虚拟机中搭建mongodb服务,并可在本机程序访问调试。下篇文章将介绍如何通过java程序连接mongodb

时间比较匆忙,可能记录有些乱。

先说明一下问题:我用Spring MVC 4.0+ 编写restful框架, 因为看到了提供有MappingJackson2JsonView类,就没有通过自己转换json, 返回字符串。

但是遇到一个灵异的问题:如果利用javaBean类接收参数,在返回值中,会自动把javaBean的键值对以json格式返回,效果等同于对javaBean参数使用了标签@ModelAttribute


MappingJackson2JsonView-0

会返回

MappingJackson2JsonView-1

使用 View 是因为以后有需要的话,可能会重写一个JsonView。

翻了一天的源码,看到了如下几个部分(以图片中的代码举例):

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#getModelAndView(ModelAndViewContainer mavContainer, ModelFactory modelFactory, NativeWebRequest webRequest)

初始container的model里有2个对象,但并没有返回的data Map, 而是一个user和一个BindingResult,user是入参,BindingResult用于validation绑定页面元素。


org.springframework.web.servlet.DispatcherServlet#processDispatchResult(HttpServletRequest request, HttpServletResponse response, HandlerExecutionChain mappedHandler, ModelAndView mv, Exception exception)

方法中通过

org.springframework.web.servlet.view.AbstractView#createMergedOutputModel(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)

方法将data Map参数放入model,由ModelAndView对象持有。

然后MappingJackson2JsonView#filterModel 方法会过滤掉BindingResult 以及 指定的filter规则类

protected Object filterModel(Map<String, Object> model) {
    Map<String, Object> result = new HashMap<String, Object>(model.size());
    Set<String> modelKeys = (!CollectionUtils.isEmpty(this.modelKeys) ? this.modelKeys : model.keySet());
    for (Map.Entry<String, Object> entry : model.entrySet()) {
        if (!(entry.getValue() instanceof BindingResult) && modelKeys.contains(entry.getKey()) &&
                !entry.getKey().equals(JsonView.class.getName()) &&
                !entry.getKey().equals(FilterProvider.class.getName())) {
            result.put(entry.getKey(), entry.getValue());
        }
    }
    return (this.extractValueFromSingleKeyModel && result.size() == 1 ? result.values().iterator().next() : result);
}

modelKeys 可以通过 MappingJackson2JsonView#setModelKeys方法指定,所以如果希望只返回data Map 需要指定

    MappingJackson2JsonView model = new MappingJackson2JsonView();
    Map<String, Object> params = new HashMap<String, Object>();
    params.put("data", object);
    model.setModelKeys(params.keySet());
    

这种设计默认全部返回,通过Set数组参数 指定需要返回的json对象。如果全部展平为一级的map,是不是就可以不经过转换,而通过此参数指定给客户端返回的参数?

BindingResult 是将校验结果返回给页面展现,包括元素和错误message等信息。restful不需要此信息,所以系统自动忽略。

但是可以通过此规则进行入参校验

转载请注明出处WangYuheng’s Blog

起因

很多web开发者对360浏览器都没有什么好感,拥有着庞大的用户量,但又因为种种特性导致网页兼容问题,尤其是360安全浏览器提供的双内核功能,总是将网站用IE内核去解析,而自己的网站 http://se.360.cn/ 却指定Webkit内核且不能切换。

html-360-webkit-01

但是,其实你们都错了,360是一家有着节操和普世情怀的良心企业,在官网中提供了通过meta指定内核的方法,并且希望通过推广,让更多的浏览器厂商认可这一标准

指定内核

360浏览器提供的方式非常简单,只需要在meta中指定希望浏览器解析网页的默认的内核即可

<meta name="renderer" content="webkit|ie-comp|ie-stand">
  • webkit 使用Webkit内核,效果等同于chrome浏览器,别称chrome内核。
  • ie-comp 使用IE兼容内核,相当于IE6、7,这两个现在看来迷一样的浏览器。
  • ie-stand 使用IE标准内核,次模式下会调用用户安装的IE内核进行解析,如用户本地IE版本为IE9,则通过IE9内核进行解析。

通过此方法,就可以让360安全浏览器以Webkit内核解析网页,以便达到对HTML5的良好支持。

<html>
    <head>
        <meta name="renderer" content="webkit">
    </head>
    <body>
    </body>
</html>

总结

强大的360。附官网对此功能的详细介绍http://se.360.cn/v6/help/meta.html

0%