0%

博客真的是好几个月没更了,2019新年第一篇,继续深入动态代理,前两篇简单分析了动态代理的实现原理之后,这次继续深入了解具体的实现方式,并手写一套简易的动态代理已加强理解;

本博客关于Java动态代理相关内容直达链接:

  1. JDK动态代理浅析
  2. Cglib动态代理浅析
  3. JDK动态代理深入理解分析并手写简易JDK动态代理(上)
  4. JDK动态代理深入理解分析并手写简易JDK动态代理(下)

博客真的是好几个月没更了,2019新年第一篇,继续深入动态代理,前两篇简单分析了动态代理的实现原理之后,这次继续深入了解具体的实现方式,并手写一套简易的动态代理已加强理解;
先接上一篇代码,这里先上代码说话,一个简单案列,代理找对象和找工作:

JDK动态代理只能代理有接口的类,定义Persion接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.guitu18.study.proxy;
/**
* @author zhangkuan
* @email xianjian-mail@qq.com
* @Date 2018/12/31 20:30
*/
public interface Persion {
/**
* 找对象
*
* @param condition 对另一半的要求
* @return 表态
*/
String findLove(String condition);
/**
* 找工作
*/
void findWord();
}
阅读全文 »

公司有个落地页需要我们放在阿里云上,但是他们经常需要改动,我们每次都帮他们发布有些繁琐,索性弄一个FTP服务让他们自个上传去,按照百度的各种教程搭建了,虽然步骤简单但是过程中还是有不少小坑,看了好多个帖子才弄好了,国际惯例,记录学习过程;

一、安装:

直接使用yum方式安装:

1
2
3
4
5
yum install vsftpd

相关操作:
# 启动|停止|重启
service vsftpd start|stop|restart

添加用户:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
一般出于安全考虑,ftp用户是不允许登陆系统的,且只能访问自己主目录下的文件

# 先创建ftp根目录
mkdir -p /home/ftp
# 添加用户并指定目录和用户组,设置为不可登陆系统
useradd -d /home/ftp/guitu -g ftp -s /sbin/nologin guitu

# -d 命令是指定用户主目录
# -g 是指定用户分组
# -s /sbin/nologin 禁止用户登陆系统
# guitu 新建ftp用户的用户名。

# 为用户 guitu 设置密码,按提示操作输入两次密码:
passwd guitu

二、配置:

1
2
3
4
5
# 配置文件默认在 /etc/vsftpd/vsftpd.conf
# 具体的配置项说明太多了,贴在最后,这里说一下在默认配置中需要修改的部分

# 修改为NO,关闭匿名用户访问
anonymous_enable=NO

重启vsftpd服务,这时候使用ftp工具应该就能连接上了(比如FIleZilla),别忘记防火墙放行端口,ftp默认端口是21;
但是连上之后会发现刚添加的用户guitu能够跳到上一层目录,访问系统中其他的目录,guitu作为ftp用户组的成员,此时对于其他目录guitu是拥有着ftp用户组的权限的,这时候需要限制guitu只能访问其自身根目录

阅读全文 »

前段时间不是出了腾讯云服务器丢失导致一家创业公司几乎被摧毁的事件嘛,云服务终归不是百分之百可靠,虽然我还是比较相信阿里,但是有备无患不是吗;服务器上的数据库我是有每天做定时备份的,但都是备份到服务器本地,现在我想的是,能不能把备份的文件文件定时发送到我自己的邮箱,多做一份远程备份;这里就用到了mailx发送邮件的功能了;

先要说一下的是,现在很多博客文档复制粘贴的太多了,我找的好多mailx的教程都是各种不能用,后面各种折腾终于配置成功后我决定要自己写一篇博文记录一下;

一、安装和配置mailx

首先需要安装mailx,yum安装方式非常简单

1
yum install mailx -y

配置:配置文件默认是/etc/mail.rc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim /etc/mail.rc
# 直接在文件末尾添加如下内容:

set ssl-verify=ignore
# 这里使用的是我服务器的默认位置,此处有个坑,下面会讲
set nss-config-dir=/etc/pki/nssdb
# 发送地址
set from=123456@qq.com
# 邮件服务商smtp服务地址
set smtp=smtps://smtp.qq.com:465
# 登陆邮箱,同上发送地址相同即可
set smtp-auth-user=123456@qq.com
# 邮箱登陆授权密码,不是登陆密码,SMTP服务通常都是授权码登陆,开通SMTP服务时会提供登陆授权码
# 具体怎么开通SMTP服务及获取授权码请自行百度,这里不作展开
set smtp-auth-password=abcabc
set smtp-auth=login

正常来说,这么配置完成之后就可以使用mailx命令发送邮件了;

发送一封测试邮件:

1
2
3
4
5
6
mailx -vs "测试邮件" -a ./test.txt xianjian-mail@qq.com<./test.txt
命令参数说明:
-v 是显示发送过程
-s 是指定邮件主题
-a 是发送附件,后面是附件文件地址
邮件地址后面的 <./test.txt 是写入到邮件正文的文本文件地址,需要提前编辑好
阅读全文 »

最近玩了玩微信公众号开发之后,想写一个爬虫为公众号爬一点数据;在测试过程中,需要获取页面的所有链接,比较快捷的办法是使用正则表达式直接匹配,那么Java中的字符串正则用的是Pattern和Matcher结合,功能还是蛮强大的;我平时工作中对这两个类接触的少,具体的使用这篇博文写的很详细,转载记录一下;

转载自:http://blog.csdn.net/cclovett/article/details/12448843/

结论:

Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持.
单独用Pattern只能使用Pattern.matches(String regex,CharSequence input)一种最基础最简单的匹配

java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现(建议在阅读本文时,打开java API文档,当介绍到哪个方法时,查看java API中的方法说明,效果会更佳).

Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式;

Java代码示例:

1
2
3
4
Pattern p=Pattern.compile("\\w+"); 
p.pattern();//返回 \w+

pattern() 返回正则表达式的字符串形式,其实就是返回Pattern.complile(String regex)的regex参数
阅读全文 »

作为一名程序员,版本控制工具肯定是接触的非常多的,国内公司一般用的是Git个SVN,我比较常用的是SVN,SVN全程Subversion,是一个自由开源的版本控制系统,SVN有两种运行方式:独立服务器和结合Apache运行,今天就分别就这两种运行方式做一下分析和测试

一、独立服务器运行

  1. 安装是在阿里云ECS上进行

    1
    2
    3
    系统:Centos 7  
    IP:47.100.199.117
    客户端环境分别是阿里云ECS和本地Windows环境;
  2. 安装SVN

    1
    2
    3
    4
    5
    6
    # 直接使用yum方式安装
    yum install -y subversion
    # 创建SVN仓库文件夹
    mkdir -p /var/svn/repo
    # 创建仓库
    svnadmin create /var/svn/repo
  3. 创建完成之后进入 /var/svn/repo 可以看到如下结构

阅读全文 »

我搞JAVA也有些日子了, 因为我比较贪玩,上进心不那么强, 总是逼不得已为了高薪跳槽才去学习, 所以也没混成什么大牛, 但好在现在也已经成家立业, 小日子过的还算滋润, 起码顶得住一月近万元的吃喝拉撒玩各种贷款信用卡 不为金钱过于发愁了。 我特别感谢当初贴吧遇见的那位大神, 虽然每个月也就聊那么几句, 但是他总能在我不知道该学啥, 该怎么走的时候, 给我方向, 毫不夸张的说,我现在的衣食无忧, 技术马马虎虎, 都是拜他所赐。 所以 我也想分享一些自己的成长过程 以及技术路线 希望一些迷茫的新人,或者想转行但是踌躇不前的老哥老弟们 能够得到一些建议吧。

其实这行的工资待遇和前景,比起一些风吹日晒的苦逼行业 还是要好不少的, 很多人说程序员累, 加班 , 掉头发 但其实在生存压力面前 这都不算什么, 有哪一行是轻松的呢?起码程序员技术到位了,工资还是比较可观的。

那么 入门的新手 要达到一个什么水平才能找到工作养活自己呢?

首先 JAVA基础语法:集合类 线程 IO操作, 这些掌握了 基础算是过关了, IO操作有点麻烦 被搞晕没关系, 知道什么时候用 用到了 再去搜索就行。

其次 web部分:servlet jsp session cookie mysql数据库, 都要知道怎么操作怎么用; 前端页面的话 html不必太深 能看懂就行 ,js或者jquery会操作dom能够把后台数据放到合适的位置就可以, 现在前段js技术五花八门 基本很少有项目让后台弄前端了, 如果有并且很长时间了 你可以考虑跳槽了……

学到这个阶段,你需要知道一个请求从页面或者移动端发起之后 经历什么样的过程再返回去的 知道ajax是什么 会发起异步请求到后台 。

阅读全文 »

这几天因为工作的关系,忙了好几天,博客几天没有更新,进度慢了,要加油了;接着简单分析一下ServletConfig和ServletContext两大对象;ServletConfig和ServletContext最常见的使用之一就是传递初始化参数,比如我们最常用的在Spring中配置contextConfigLocation;

ServletConfig

继续查看ServletConfig源码:

1
2
3
4
5
6
7
package javax.servlet;
public interface ServletConfig {
public String getServletName();
public ServletContext getServletContext();
public String getInitParameter(String name);
public Enumeration<String> getInitParameterNames();
}

getServletName();

getServletName方法用于获取当前Servlet名称,这个是在xml中配置的:springmvcdemo

getServletContext();

getServletContext方法用于获取代表当前web应用的ServletContext对象;

getInitParameter(String name);

getInitParameter方法用于获取当前Servlet指定名称的初始化参数的值;

getInitParameterNames();

getInitParameterNames获取当前Servlet所有初始化参数的名字枚举集合;

Servlet容器初始化时每一个Servlet对象时,会为其创建一个ServletConfig对象,通过Servlet的init方法,会把ServletContext对象传递给当前Servlet:

1
public void init(ServletConfig config) throws ServletException;

之后使用this.getServletConfig()对象获取当前Servlet的ServletConfig对象;

1
ServletConfig servletConfig = getServletConfig();

我们在xml中配置Servlet时,还可以配置Servlet初始化参数信息:

1
2
3
4
5
6
7
8
<servlet>
<servlet-name>Servlet_1</servlet-name>
<servlet-class>com.guitu.servlet.Servlet_1</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>zhangkuan</param-value>
</init-param>
</servlet>

之后可以通过servletConfig获取InitParameter参数;

1
Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();java

获得的是一个参数名字的枚举集合,在调用getInitParameter(String name)即可获得参数的值:

1
String initParameter = servletConfig.getInitParameter(parameterName);
阅读全文 »

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。

Servlet生命周期和加载机制

最近打算翻看学习一下Spring源码,先从JavaWeb过起;
查看Servlet3.1源码,其接口定义如下:

1
2
3
4
5
6
7
8
9
10
package javax.servlet;  
public interface Servlet {
public void init(ServletConfig config)
throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}

init(ServletConfig config);

init方法在容器启动时会被容器调用,且只会被调用一次;
调用的时机是跟Servlet的配置项’load-on-startup’有关系的;

1
2
3
4
5
6
7
8
9
<servlet>
<servlet-name>springmvcdemo</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

1:配置的值如果不小于0,那么标识容器在启动时就会加载这个Servlet,配置的值越小,加载的优先级越高;如果没有配置或者配置的值小于0时,容器会在该Servlet第一次被调用时才会被加载;不论哪种配置,init方法只会被调用一次;

init方法的参数,是容器传进去的;我们在web.xml中配置的contextConfigLocation参数,就保存在ServletConfig中;

这项参数我们不配置的话,它有默认值:WEB-INF/${ServletName}-servlet.xml,变量${ServletName}是xml中配置的’servlet-name’;

阅读全文 »

Java中的动态代理设计模式是非常经典且非常重要的设计模式之一,在感叹设计者的天才设计至于,我们想去探究一下这个设计模式是如何来实现的; 著名的spring框架的AOP的原理就是Java的动态代理机制; 在Spring中动态代理是实现有两种:JDK动态代理和Cglib动态代理,本篇分析的是Cglib动态代理的实现;

本博客关于Java动态代理相关内容直达链接:

  1. JDK动态代理浅析
  2. Cglib动态代理浅析
  3. JDK动态代理深入理解分析并手写简易JDK动态代理(上)
  4. JDK动态代理深入理解分析并手写简易JDK动态代理(下)

Java中的动态代理设计模式是非常经典且非常重要的设计模式之一,在感叹设计者的天才设计至于,我们想去探究一下这个设计模式是如何来实现的;

著名的spring框架的AOP的原理就是Java的动态代理机制;

在Spring中动态代理是实现有两种:JDK动态代理和Cglib动态代理,本篇分析的是Cglib动态代理的实现;

JDK动态代理之前已经做过分析了[ JDK动态代理浅析 ],通过案例我们知道了,Java动态代理的强大之处;但是不难看出来使用JDK动态代理也有着它的局限性,JDK动态代理是在JVM内部动态的生成class字节码对象,但是JDK动态代理只能针对接口进行操作,也就是只能对接口的实现类去进行代理;

现在分析一下另一种常用的动态代理技术:Cglib动态代理;

CGLIB(Code Generation Library)是一个开源项目;
是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口;
CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类;
Cglib是针对类来实现代理的,原理是对指定的业务类生成一个子类,并覆盖其中业务方法实现代理;
所以Cglib可以为无接口的类直接做代理,当然有接口的类也是可以的并无影响。

因为采用的是继承,所以不能对final修饰的类进行代理;Cglib的使用限制无疑要比JDK动态代理要宽松很多;

废话不多说,先上案例;

阅读全文 »

Java中的动态代理设计模式是非常经典且非常重要的设计模式之一,在感叹设计者的天才设计至于,我们想去探究一下这个设计模式是如何来实现的; 著名的spring框架的AOP的原理就是Java的动态代理机制;

在Spring中动态代理是实现有两种:JDK动态代理和Cglib动态代理,本篇分析的是JDK动态代理的实现;

本博客关于Java动态代理相关内容直达链接:

  1. JDK动态代理浅析
  2. Cglib动态代理浅析
  3. JDK动态代理深入理解分析并手写简易JDK动态代理(上)
  4. JDK动态代理深入理解分析并手写简易JDK动态代理(下)

Java中的动态代理设计模式是非常经典且非常重要的设计模式之一,在感叹设计者的天才设计至于,我们想去探究一下这个设计模式是如何来实现的;

著名的spring框架的AOP的原理就是Java的动态代理机制;

在Spring中动态代理是实现有两种:JDK动态代理和Cglib动态代理,本篇分析的是JDK动态代理的实现;

查看下篇 [ Cglib动态代理浅析 ]

在探究动态代理之前,先看一下静态代理,这可以帮助我们更好的理解动态代理;

阅读全文 »