分类 技术 下的文章

CentOS release 6.5 (Final)
Oracle Release 11.2.0.4.0

  • 使用ssh连接到服务器
  • 切换到Oracle用户: su - oracle
  • 连接到Oracle:sqlplus /nolog
  • 使用管理员身份登录数据库: conn sys/sys as dba
  • 修改密码:ALTER USER user_name IDENTIFIED BY new_password;

需求:默认情况下Typecho安装完后文章链接是http://zhangguoli.cn/index.php/xxx.html这样的,强迫症是在受不了中间多了个index.php,于是想修改为:http://zhangguoli.cn/xxx.html

本文环境:
CentOS release 6.5 (Final)
Apache 2.4.29
PHP 5.6.32

Apache的安装路径: /opt/apache
网站站点文件位置: /opt/www/zhangguoli

1. 开启Apache的Rewrite模块

vi /opt/apache/conf/httpd.conf

查找httpd.conf中是否包含LoadModule rewrite_module modules/mod_rewrite.so,如果被#注释则去掉或新增。

增加配置如下:

<Directory "/opt/www/zhangguoli"> 
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>

2. 增加RewriteRule规则

- 阅读剩余部分 -

说明:本文基于CentOS release 6.5 (Final),是工作过程中记录的一些随笔,内容未做详细考究.


  • 设置DNS服务器

  vi /etc/resolv.conf
  nameserver 114.114.114.114
  • 查看Linux版本
    lsb_release -a
LSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID:    CentOS
Description:    CentOS release 6.5 (Final)
Release:    6.5
Codename:    Final

. 当前目录
..上级目录

../上级目录
/根目录


  • pwd 显示当前目录

         实例:
              (1)pwd 显示当前目录
  • ls 显示当前文件(夹)

llls -l的一个别名

         解释:list的缩写
         格式: ls [参数] [目录]
         参数:-l 除文件名外其他的文件信息
         实例:
              (1) ls 显示当前目录的下的文件和目录
              (2) ls -l 详细显示当前目录的下的文件和目录  
              (3) ll 详细显示当前目录的下的文件和目录  
  • mv 文件(夹)移动/重命名

         格式: mv [参数] [源文件/目录] [目标文件/目录]
         参数:
               -f force 强制,如果目标文件已经存在则不会询问而直接覆盖
               -i  目标文件已经存在的话会询问是否覆盖
         实例:
              (1) mv test.zip /opt/test 移动test.zip文件到/opt/test目录
              (2) mv test.zip /opt/test/1.zip 移动test.zip文件到/opt/test目录下,并重命名文件为1.zip


- 阅读剩余部分 -

通过implements ServletContextListener实现监听器Linstener

package cn.config;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/*
* Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent事件
* 
* ServletContext对象是一个为整个Web应用提供共享的内存,任何请求都可以获取里面的内容
* 实现ServletContextListener时通过ServletContext.setAttribute(key,value)将内容提交到内存中
* 其他地方通过ServletContext.getAttribute(key)获取内容(HelloWorld#doPost)
* 
* 官方对于ServletContextEvent的介绍:
* This is the event class for notifications about changes to the servlet context of a web application.
*/

public class MyLinstener implements ServletContextListener {

    /**
     * ① Servlet启动时先调用contextInitialized方法, 之后再对Filter和需要被初始化的Servlet初始化
     */
    @Override
    public void contextInitialized(ServletContextEvent paramServletContextEvent) {
        ServletContext context = paramServletContextEvent.getServletContext();
        context.setAttribute("linstener", "fromContextInitialized");
        System.out.println("...    contextInitialized    ... ");
    }

    /**
     * ② Servlet停止时先销毁所有的Servlet和Filter, 再调用contextDestroyed方法
     */
    @Override
    public void contextDestroyed(ServletContextEvent paramServletContextEvent) {
        ServletContext dest = paramServletContextEvent.getServletContext();
        System.out.println("contextDestroyed... " + dest.getAttribute("linstener"));
    }

}

web.xml配置监听器

- 阅读剩余部分 -

  1. 过滤器可以动态的拦截请求和响应, 且Filter在Servlet之前执行.
  2. 过滤器常用语编码过滤,用户是否登录,权限判断等.
  3. 通过 implements javax.servlet.Filter 实现一个过滤器

以字符编码过滤器为例

package cn.config;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CharSetFilter implements Filter {

    private String encode = "utf-8";

    /**
     * init()用于初始化工作
     * filterConfig.getInitParameter("charset")获取web.xml中配置的内容
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String defaultCharset = filterConfig.getInitParameter("charset").trim();
        this.encode = "".equals(defaultCharset) ? this.encode : defaultCharset;
        System.out.println("init complete...");
    }

    
    /**
     * doFilter()完成实际的过滤工作 FilterChain用于访问后续过滤器
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        req.setCharacterEncoding(encode);
        res.setCharacterEncoding(encode);
                System.out.println("doFilter...");
        filterChain.doFilter(request, response);
    }

    /**
     * Servlet容器在销毁过滤器实例前调用destroy()方法,释放Servlet过滤器占用的资源。
     */
    @Override
    public void destroy() {
        System.out.println("destroy complete...");
    }

}
<filter>
        <filter-name>charSetFilter</filter-name>
        <filter-class>cn.config.CharSetFilter</filter-class>
        <init-param>
            <param-name>charset</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>contentType</param-name>
            <param-value>text/html;charset=UTF-8</param-value>
        </init-param>
    </filter>
        <!-- 
         多个filter,按照filter-mapping的执行顺序执行,
         而不是按照filter的定义顺序 
         -->
    <filter-mapping>
        <filter-name>charSetFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

使用Servlet的示例代码,此处会先后输出init complete...和doFilter...

一、生命周期 init()、service()、destory()

  1. 在第一次创建Servlet的时候通过init()初始化,之后不再执行此方法
  2. 通过service()处理HTTP请求,常用doGet()、doPost()
  3. destory()在Servlet结束时执行
    最后由JVM进行垃圾回收.

二、实现方式 implements Servlet、extends GenericServlet、extends HttpServlet

HttpServlet本身就是通过implements Servlet实现的.


三、代码示例: 通过继承HttpServlet实现Servlet


- 阅读剩余部分 -

需要增加UML
需要增加UML
需要增加UML

开发中通常使用new产生一个对象的实例

无模式

//生产Audi
public class Audi{
    public Audi(){
        System.out.println("制造 audi.....");
    }
}
//生产Benz
public class Benz {
    public Benz(){
        System.out.println("制造Benz....");
    }
}
//客户使用new生产一辆车
public class Customer{
    public static void main(String[] args) {
        Audi audi = new Audi();
        Benz benz = new Benz();
    }
}

简单工厂(SimpleFactory)模式



- 阅读剩余部分 -

单例模式即只有一个实例,实现分为懒汉模式和饿汉模式。

饿汉模式

/**
 * 单例模式_饿汉模式
 * 类加载的时候完成初始化,因此加载速度相对较慢,但运行是获取对象的速度相对较快
 * 线程安全
 * Created by zhangguoli on 09-18-018.
 * YXV0aG9yOiB6aGFuZ2d1b2xpLmNu
 */
public class SingletonHungry {

    //① 构造方法私有化,外部不可以直接创建对象
    private SingletonHungry() {

    }

    //② 创建类的唯一实例,使用private static修饰
    private static SingletonHungry instance = new SingletonHungry();

    //③ 提供统一对外获取实例的方法
    public static SingletonHungry getInstance() {
        return instance;
    }
}

懒汉模式

- 阅读剩余部分 -

二分查找的前提是数组已经是排好序的了

递归方式

 /**
     * 二分查找_递归
     *
     * @param array 排序好的数组
     * @param low   数组下标
     * @param high  数组下标
     * @param key   要查找的值
     * @return 返回数组下标, 找不到返回-1
     */
    static int binarySearchRecursion(int array[], int low, int high, int key) {
        if (low > high)
            return -1;
        int mid = (low + high) / 2;
        if (array[mid] > key)
            return binarySearchRecursion(array, low, mid - 1, key);
        if (array[mid] < key)
            return binarySearchRecursion(array, mid + 1, high, key);
        return mid;
    }

非递归方式

- 阅读剩余部分 -