0%

2017年9月6日 下午6:38

涉及到的技术:Servlet_JSP_js_JDBC_SQ

eclipse Mac 中文下载
中级的最后
学生表.sql
MacOS升级10.13系统eclipse菜单灰色
SVN
关于数据库中date类型时间处理
中期练习总结
中级项目出现的问题
servlet中filter组件
EL表达式+JSTL
在servlet+jsp项目开始写逻辑之前的准备工作
cookie和session
request和response最常用手册
导入别人的项目注意事项
JSP基本语法
servlet三个作用域
Servlet上下文对象
Servlet实现类HttpServlet的使用
servlet简介 + 项目配置步骤
Tomcat的在eclipse中配置
tomcat简介
Mac中安装tomcat9

HOSTS文件
JDBC常见错误
JDBC
JDBC批处理
JDBC调用存储过程和函数
JDBC,通过属性配置文件封装DbUtiles类
两种数据库连接池 (2017/9/5)
DAO层
JDBC提交事务
ORACLE 11g 的了解
用Navicat premium连接win7虚拟机中的ORACLE11g(附账户密码)
关于ORACLE配置文件和连接的问题总结
SQL的执行顺序
SQL相关子查询的补充
关于聚合函数注意事项
SQL表连接
数据库中索引+事务+sequence
ORACLE的三个客户端工具
表复制(根据一个表创建另一个表)
PLSQL(PLSQL语法+存储过程+触发器)
SQL如何分析(SQL测试题)
ORCALE SQL语法总结

js的面向对象总结
js的细小知识点总结(恶心)
js知识体系的梳理
js实现各种动画的经验

HTML一些常见标签
HTML5总结
CSS选择器总结
CSS3中以前不知道的特性
CSS常用元素和常见错误
CSS 定位 (Positioning)/浮动 总结

2017年9月6日 下午4:20

tomcat6支持servlet2.5
tomcat7支持servlet3.0

tomcat 服务器:
安装版:
解压版:

tomcat的运行基于java的JAVA_HOME
注:mac不用配置此项


普通配置

启动关闭tomcat

  1. 需要先配置JAVA_HOME
    * 双击%CATALANA_HOME%\bin\startup.bat
    * 双击%CATALANA_HOME%\bin\shutdown.bat
  2. 访问服务器:http://localhost:8080/index.jsp
    * 因为服务器在本机上,所以主机名为localhost,表示本机
    * tomcat的默认端口为8080
    * index.jsp是主页

修改端口号

* 修改端口号,%CATALANA_HOME%\conf\server.xml,修改<Connector port="8080">,把8080修改了即可。
* http协议默认端口为80,也就是说http://localhost,等同与http://localhost:80

如果把Tomcat端口号修改成80,那么访问服务器就可以无需再给出端口号。

注:这个端口号改这里就行,其他地方不用改,很简单,重启一个服务器就好

tomcat目录结构

  • bin:二进制可执行文件,例如startup.bat和shutdown.bat
  • conf:配置文件,例如:server.xml、context.xml、web.xml、tomcatusers.xml
  • lib:tomcat所需jar包
  • logs:日志文件
  • temp:存放tomcat运行时产生的临时文件,当tomcat关闭后,这个目录中的文件可以删除
  • webapps:这个目录下的每个文件夹对应一个JavaWeb应用程序
  • work:webapps下的应用程序在运行时会自动生成文件,就在work目录下。work目录删除了也没问题,但再次运行应用程序还要再生成work目录和文件。

创建JavaWeb目录:hello

  • webapps目录下建一个hello目录,hello目录就是项目目录了;
  • 在hello目录下创建WEB-INFf
  • 在WEB-INF下创建web.xml
  • 在WEB-INF下创建classes目录
  • 在WEB-INF下创建lib目录
  • 在hello目录下创建index.html

  在web.xml文件中添加如下内容:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
</web-app>

  在index.html中添加如下内容:

1
2
3
4
5
6
<html>
<head><title>index.html</title></head>
<body>
<h1>hello主页</h1>
</body>
</html>

  启动tomcat,打开客户端访问http://localhost:8080/hello/index.html


配置外部应用

  外部应用既是把应用程序不放到Tomcat的wabapps目录下!而是放在外面,例如:F:/hello

第一种方式

  1. 在conf/server.xml下配置,指定外部应用的路径。
1
2
3
4
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="hello" docBase="F:/hello"/>
</Host>
* 在<Host>元素下添加<Context>元素,path为URL访问路径,docBase为外部应用的目录。
* 在浏览器地址栏中访问:http://localhost:8080/itcast_hello/index.html

第二种方式

  1. 在conf_catalana_localhost下添加配置文件,指定外部应用路径
    • 在conf_catalana_localhost目录下创建hello.xml文件,其中hello就是URL访问路径
    • 在hello.xml文件中添加:<Context docBase=”F:hello”>,docBase指定外部应用的目录。

缺省web应用

* 在webapps目录下有一个ROOT目录,它是缺省web应用,访问这个应用的路径:http://localhost:8080/index.jsp
* 如果把web应用的内部放到webapps/ROOT下,访问URL路径中不用给出应用名称。

配置虚拟主机

  1. 找到C:\WINDOWS\system32\drivers\etc\hosts文件,添加 www.baidu.com 127.0.0.1
  2. 在conf/server.xml中修改端口为80
  3. 在conf/server.xml中添加元素
    1. name:指定该主机域名为www.baidu.com 2. appBase:指定该主机的应用目录为F:/myapps
  • 在F:/myapps下创建名为ROOT的web应用。
  • 访问:http://www.baidu.com/index.html。其中www.baidu.com在本机上会被解析为127.0.0.1,但其他电脑访问时无效
  • 2017年9月6日 下午3:49

    前期准备Tomcat的在eclipse中配置

    了解

    web.xml 是应用程序入口文件

    javaWeb的三大组件之一 filter listener servlet

    servlet是一个类,需要实现servlet接口。并且需要在web.xml中注册

    Webcontent文件夹下有编译好的项目文件,直接给服务器执行用
    tomcat只要webcontent,其实不用你的src文件


    servlet的生命周期

    1. 如果在web.xml中某个servlet中配置属性,那么当把项目放到tomcat的时候这个servlet就会执行init方法,开始servlet生命周期
    2. 要是没有配置,只有在启动对应的servlet时,才会触发对应的init()方法
    3. service()运行方法 每次访问都会执行到
    4. destory()销毁方法只有在tomcat正常关闭的时候才会触发 整个生命周期只执行一次

    servlet项目配置步骤


    新建web项目的时候选上此项,生成web.xml文件


    找不到Servlet接口,解决方案用eclipse导入web项目时提示的找不到servlet包的错误


    给当前servletDemo类文件配置路径
    大小写区分
    两个必须配置的
    附录一


    放在服务器上运行


    输入/first就访问到了对应的servlet类


    在web.xml中,配置属性
    使用情景:用于提高一个应用的相应速度,这时需要让服务器开始运行的时候就让这个应用启动
    作用附录二中的代码注释


    附录一:
    web.xml文件内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <display-name>Servlet906</display-name>
    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>


    <!-- servlet 配置 -->
    <servlet>
    <servlet-name>servletDemo</servlet-name> <!-- servlet名称 -->
    <servlet-class>cn.chenzhiheng.servlet.servletDemo</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>servletDemo</servlet-name>
    <url-pattern>/first</url-pattern> <!-- 该控制器可接收并处理的请求 -->
    </servlet-mapping>
    </web-app>

    附录二:
    servletDemo.java

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    package cn.chenzhiheng.servlet;

    import java.io.IOException;
    import java.util.Enumeration;

    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;

    public class servletDemo implements Servlet{

    private ServletConfig sc ;
    /*
    * servlet 初始化方法
    * servlet生命周期方法之一
    */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    System.out.println(servletConfig.getServletName());
    Enumeration<String> e = servletConfig.getInitParameterNames();
    while(e.hasMoreElements()){
    String key = e.nextElement();
    String value = servletConfig.getInitParameter(key);
    System.out.println(key+" : "+value );
    }
    this.sc = servletConfig;
    System.out.println("init ...");
    }
    /*
    * servlet 处理请求方法
    * servlet生命周期方法之一
    */
    @Override
    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
    System.out.println("service ...");
    }
    /*
    * servlet 销毁方法
    * servlet生命周期方法之一
    */
    @Override
    public void destroy() {
    System.out.println("destroy ...");
    }
    /*
    * 获取 servlet 配置信息方法。
    */
    @Override
    public ServletConfig getServletConfig() {
    System.out.println("getServletConfig ...");
    return sc;
    }
    /*
    * 获取servlet信息。
    */
    @Override
    public String getServletInfo() {
    System.out.println("我是一个快乐的小Servlet! ...");
    return null;
    }

    }

    web.xml

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <display-name>Servlet906</display-name>
    <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>


    <!-- servlet 配置 -->
    <servlet>
    <servlet-name>servletDemo</servlet-name> <!-- servlet名称 -->
    <servlet-class>cn.chenzhiheng.servlet.servletDemo</servlet-class>


    <init-param>
    <param-name>name</param-name>
    <param-value>mike</param-value>
    </init-param>
    <init-param>
    <param-name>age</param-name>
    <param-value>20</param-value>
    </init-param>
    <!-- 配置初始化参数 在init方法中获取此参数 -->

    <load-on-startup>2</load-on-startup> <!-- 配置servlet初始化顺序 -->
    <!-- 如果配置此参数 表示由服务器初始化servlet 参数数值越小越先初始化 -->
    <!-- 如果参数为负数,则服务器不初始化此servlet -->
    <!-- 如果所有servlet都由服务器启动 那么启动时间将会延长 但是每次访问对应的servlet时 效率略高点 -->

    </servlet>

    <servlet-mapping>
    <servlet-name>servletDemo</servlet-name>
    <url-pattern>/first</url-pattern> <!-- 该控制器可接收并处理的请求 -->
    </servlet-mapping>
    </web-app>

    注:这里的配置两个标签
    1.
    2.
    3. 必须在之前

    2017年9月6日 下午2:35

    server.xml区分大小写
    Tomcat路径存放路径不能有中文


    配置步骤



    在window下找到并添加servers栏


    新建一个server


    选择对应的版本


    这里指定路径是根路径,不是bin路径


    这里是要你配置当前web项目到tomcat下


    开启服务器


    表示正常开启了


    如果是web项目,servers是下底栏中显示


    左侧栏中出现Servers项,可以方便的更改配置文件


    如果在eclipse中开启服务器,那么localhost:8080是访问不到资源的


    接着参考 servlet项目配置步骤

    2017年9月5日 上午9:56

    前身:JDBC,通过属性配置文件封装DbUtiles类
    这篇是对上一篇的改进。

    概述:

    要起到的效果:使用C3P0方式封装的DbUtils工具类,用来获取连接和关闭连接(让dao层去调用DbUtils工具类),也就是说,DbUtils成为了dao的下层,服务层调用的是dao层完成数据库操作,根本不知道DbUtils的存在。
    使用:要与dao(数据持久层)共同使用,参照DAO层

    1. 这东西其实对于写代码来说感觉不出来啥,基本上和不用连接池技术时的写代码的感觉是一样的
    2. 但是,这对于数据库来说就不一样的,可以减轻他的压力,我们当然感觉不出来了
    3. 说明封装的好

    DataSource

    1. DataSource (Java Platform SE 7 )
    2. DataSource是一个java接口,是实现连接池的关键,但是java中没有给出这个接口的实现类,所以我们要使用第三方的如DBCP和C3P0
    3. 作用是:A factory for connections to the physical data source ,An alternative to the DriverManager facility
    4. 使用:由于The DataSource interface is implemented by a driver vendor,所以要使用第三方vendor的jar包

    现在有两种实现方法:DBCP和C3P0

    这两种方法对于开发者来说,使用起来是一样的
    他们的实现原理不同,但这与使用者来说无关

    他们都有官方的手册查询(english)

    第一步是引入的jar包


    方式一:C3P0

    C3P0连接池配置和实现详解 - pplsunny——舞动青春 - CSDN博客

    文章解读:

    1. 其中的说的classPath是指的当前项目src目录下,一层都不能深
    2. 如果c3p0位置不在src目录下,要进行配置
    3. 配置代码为:
    4. System.setProperty("com.mchange.v2.c3p0.cfg.xml", System.getProperty("user.dir") + "/src/dbUtils/c3p0-config.xml");
    5. 其中的com.mchange.v2.c3p0.cfg.xml是c3p0中的默认属性,通过给这个属性赋值来说明当前c3p0-config.xml文件位置

    关于C3P0的使用代码,看附录


    方式二:DBCP

    DBCP数据库连接池的简单使用
    DBCP2配置详细说明(中文翻译) - 老黎的专栏 - CSDN博客

    重点摘抄

    应用程序中,使用完一个数据库连接后,DBCP连接池如何管理该连接
       分两种情况:
    1. 应用程序中主动关闭该连接,即DBCPTest.java中第79行 conn.close();
    1. 这种情况并不是手动将该连接关闭,而是将该连接交回给DBCP连接池,由连接池管理该连接。即用完连接后显示的将数据库连接提交至DBCP连接池。
    2. 应用程序中不关闭该连接,即将DBCPTest.java中第79行 conn.close()注释掉
    1. 这种情况DBCP配置文件dbcp.properties中的配置项(注意jar包版本,低版本中使用removeAbandoned=true配置项)
    2. removeAbandonedOnMaintenance=true
    3. removeAbandonedOnBorrow=true
    4. removeAbandonedTimeout=1
    5. 会起作用,removeAbandonedOnMaintenance=true和removeAbandonedOnBorrow=true表示DBCP连接池自动管理应程序中使用完毕的连接,removeAbandonedTimeout=1表示一个连接在程序中使用完毕后,若在1秒之内没有再次使用,则DBCP连接池回收该连接(通常removeAbandonedTimeout不会配置1,此处为了测试使用)。
    3. 验证removeAbandonedOnMaintenance=true、removeAbandonedOnBorrow=true和removeAbandonedTimeout=1配置项的作用


    导包排错

    当我们在web项目中导入c3p0和mysql的时
    第一种方式是:图一
    第二种方式是:图二
    如果出现图一方式不行,那么换用第二种方式。


    图1

    图2


    附录:
    使用C3P0方式封装的DbUtils工具类,用来获取连接和关闭连接

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    package dbUtils;

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.sql.Statement;
    import javax.sql.DataSource;
    import com.mchange.v2.c3p0.ComboPooledDataSource;


    /*
    * 数据库工具类
    */
    public class DbUtils {
    //连接池对象
    private static DataSource dataSource;
    //数据库连接对象 Connection
    private static Connection conn;
    //操作数据库对象Statement
    private static Statement sta;
    //操作数据库预编译对象Preparstatement
    private static PreparedStatement ps;

    /*
    * 静态代码块 类加载时完成数据初始化
    */
    static {
    ComboPooledDataSource cpds = new ComboPooledDataSource();
    dataSource = cpds;
    }
    /*
    * 获取Connection连接的方法
    * @return conn
    */
    public static Connection getConnection() {
    try {
    conn = dataSource.getConnection();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return conn;
    }

    /*
    * 关闭Connection连接的方法
    */
    public static void close(){
    if(conn!=null){
    try {
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }finally {
    try {
    conn.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }
    }

    // public static void main(String[] args) {
    // Connection conn = DbUtils.getConnection();
    // System.out.println(conn);
    // }
    }

    2017年9月5日 上午8:40

    CallableStatement pc = conn.prepareCall("{?= call fun_getInfo(?)}");
    参考CallableStatement_百度百科
    摘抄:
    1. 这种调用是 用一种换码语法来写的,有两种形式:一种形式带结果参,另一种形式不带结果参数
    2. 其他仔细的看看这个链接就行了

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    package com.shanxi.weixin;

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.Types;
    import java.util.Properties;

    public class JDBCDemo6 {

    public static void main(String[] args) {

    try {
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.42.43:1521:orcl","gao", "gao");
    //操作数据库调用函数或存储过程需要另一个操作数据库的对象CallableStatement
    CallableStatement pc = conn.prepareCall("{?= call fun_getInfo(?)}");
    // 注册返回值的类型
    pc.registerOutParameter(1,Types.VARCHAR);
    // 设置函数/存储过程的参数列表 in in out out
    pc.setInt(2,10);
    //调用对应的函数/存储过程
    pc.execute();
    //接受返回值
    String name = pc.getString(1);
    System.out.println(name);
    if(conn!=null){
    conn.close();
    }

    }catch (ClassNotFoundException e) {
    e.printStackTrace();
    }catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }

    2017年9月5日 上午8:35

    作用:通过预编译对象,同时执行多条sql
    实现方式:
    1. PreparedStatement ps = conn.prepareStatement(sql);使用预编译对象,绑定sql
    2. ps.addBatch();添加批处理
    3. int[] counts = ps.executeBatch();执行批处理

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    package com.shanxi.weixin;

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;

    public class JDBCDemo5 {

    public static void main(String[] args) {

    try {
    Class.forName("com.mysql.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test4?useUnicode=true&characterEncoding=utf8","root", "root");
    String sql = "insert into people(name,age,sex) values(?,?,?)";
    //Statement sta = conn.createStatement();

    //打开一个预编译对象 同时绑定sql
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setString(1, "bob");
    ps.setString(3, "boy");
    ps.setInt(2, 22);
    //将本条sql处理 加入批处理
    ps.addBatch();

    ps.setString(1, "mary");
    ps.setString(3, "girl");
    ps.setInt(2, 18);
    //将重新设置参数后的预编译sql继续加入批处理
    ps.addBatch();
    //同时也可以绑定多条静态sql
    ps.addBatch("insert into people(name,age,sex) values('rose',19,'girl')");
    //执行批处理任务
    int[] counts = ps.executeBatch();
    ps.clearBatch();
    for (int i : counts) {
    System.out.println(i);
    }
    if(conn!=null){
    conn.close();
    }
    }catch (ClassNotFoundException e) {
    e.printStackTrace();
    }catch (SQLException e) {
    e.printStackTrace();
    }
    }
    }

    2017年9月5日 下午5:36

    php配置笔记.pages
    两个重要文档
    https://segmentfault.com/a/1190000000606752
    http://www.thinkphp.cn/topic/34380.html

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49

    #测试php-fpm配置
    php-fpm -t
    php-fpm -c /usr/local/etc/php/5.6/php.ini -y /usr/local/etc/php/5.6/php-fpm.conf -t

    #启动php-fpm——这个命令报错
    php-fpm -D
    php-fpm -c /usr/local/etc/php/5.6/php.ini -y /usr/local/etc/php/5.6/php-fpm.conf -D

    #关闭php-fpm
    kill -INT `cat /usr/local/var/run/php-fpm.pid`

    #重启php-fpm
    kill -USR2 `cat /usr/local/var/run/php-fpm.pid`

    #也可以用上文提到的brew命令来重启php-fpm,不过他官方不推荐用这个命令了
    brew services restart php56

    #还可以用这个命令来启动php-fpm
    launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php56.plist


    由于Mac自带了php和php-fpm,因此需要添加系统环境变量PATH来替代自带PHP版本。
    echo 'export PATH="$(brew --prefix php56)/bin:$PATH"' >> ~/.bash_profile #for php
    echo 'export PATH="$(brew --prefix php56)/sbin:$PATH"' >> ~/.bash_profile #for php-fpm
    echo 'export PATH="/usr/local/bin:/usr/local/sbib:$PATH"' >> ~/.bash_profile #for other brew install soft
    source ~/.bash_profile


    sudo chown root:wheel /usr/local/Cellar/nginx/1.10.2_1/bin/nginx
    sudo chmod u+s /usr/local/Cellar/nginx/1.10.2_1/bin/nginx

    ln -sfv /usr/local/opt/php56/*.plist ~/Library/LaunchAgents
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.php56.plist

    更换php7.0

    #关闭php-fpm
    kill -INT `cat /usr/local/var/run/php-fpm.pid`

    #php7.0
    echo 'export PATH="$(brew --prefix php70)/bin:$PATH"' >> ~/.bash_profile #for php
    echo 'export PATH="$(brew --prefix php70)/sbin:$PATH"' >> ~/.bash_profile #for php-fpm
    echo 'export PATH="/usr/local/bin:/usr/local/sbib:$PATH"' >> ~/.bash_profile #for other brew install soft
    source ~/.bash_profile

    #php开机自启
    ln -sfv /usr/local/opt/php70/*.plist ~/Library/LaunchAgents
    launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php70.plist

    2017年9月5日 下午5:14

    tomcat启动常用指令

    cd _usr_local_tomcat9_bin
    ./startup.sh
    ./shutdown.sh

    注:Mac中调出 前往文件夹 的快捷键command + shift + g

    tomcat类别:

    1. 第一种:安装版,一个电脑只能安装一个
    2. 第二种:绿色版,一个电脑可以安装多个,但是需要不同的端口

    下载地址:(绿色版)

    Apache Tomcat® - Apache Tomcat 9 Software Downloads

    安装过程

    注:nginx的端口是80,而tomcat的端口是8080,不冲突

    我的安装路径_usr_local_tomcat9_bin


    在默认的~路径下配置没有用,我也不知道为啥
    我现在还是得cd /usr/local/tomcat9/bin,然后./startup.sh才能启动,用完后./shutdown.sh


    在iterm中对路径下的tomcat进行权限配置


    在给startup.sh配置权限的时候,提示也要对catalina.sh文件权限配置


    我在第二次启动tomcat的时候,会提示logs/catalina.out:permissin denied
    这时切到logs目录下,chmod 777 catalina.out就行了
    注:我试过给整个文件夹777权限,但是依然报错


    这样就开启了



    创建站点目录到主目录,方便快捷访问
    Linux ln命令 | 菜鸟教程

    附录:


    发现不同的路径下,有不同的.bash_profile文件

    2017年9月5日 下午4:10

    先看:
    JDBC,通过属性配置文件封装DbUtiles类
    两种数据库连接池 (2017/9/5)

    概述:

    Dao(持久层)是与改进的DbUtiles层同时使用的,可以参考两种数据库连接池 (2017/9/5),这篇文件中就详细介绍了dao层和DbUtils的关系

    附录代码:

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    package com.shanxi.weixin.dao;

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.Types;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;

    import com.shanxi.weixin.dbUtils.DbUtils;
    /**
    * superDao实现类
    * 本类提供了 查询多条数据 查询单条数据 查询数量 对数据增删改的基本实现
    */
    public class SuperDaoImpl implements SuperDao {

    /**
    * 不支持预编译的查询多条数据方法
    * @param sql 需要执行的sql语句
    * @return list 执行查询sql后返回的结果视图集合
    */
    @Override
    public List<Map<String, Object>> queryForList(String sql) {
    List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
    try {
    Connection conn = DbUtils.getConnection();
    Statement sta = conn.createStatement();
    ResultSet rs = sta.executeQuery(sql);
    list = rsToList(rs);
    DbUtils.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return list;
    }

    /**
    * 支持预编译的查询多条数据方法
    * @param sql 需要执行的预编译sql语句
    * @param types 预编译sql中参数的类型数组
    * @param obj 预编译sql中参数的值数组
    * @return 执行查询sql后返回的结果视图集合
    */
    @Override
    public List<Map<String, Object>> queryForList(String sql, int[] types, Object[] obj) {
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    try {
    Connection conn = DbUtils.getConnection();
    PreparedStatement ps = conn.prepareStatement(sql);
    //循环遍历参数数组 并将数组中的值设置给预编译sql
    for (int i = 0; i < obj.length; i++) {
    switch (types[i]) {
    case Types.INTEGER:
    ps.setInt(i+1,Integer.parseInt(obj[i].toString()));
    break;
    case Types.VARCHAR:
    ps.setString(i+1,obj[i].toString());
    break;
    default:
    ps.setString(i+1,obj[i].toString());
    }
    }
    ResultSet rs = ps.executeQuery();
    list = rsToList(rs);
    DbUtils.close();

    } catch (SQLException e) {
    e.printStackTrace();
    }

    return list;
    }

    /**
    * 不支持预编译的查询单条数据方法
    * @param sql 需要执行的sql语句
    * @return 执行查询sql后返回的单条数据
    */
    @Override
    public Map<String, Object> queryForMap(String sql) {
    List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
    try {

    Connection conn = DbUtils.getConnection();
    Statement sta = conn.createStatement();
    ResultSet rs = sta.executeQuery(sql);
    list = rsToList(rs);
    DbUtils.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    if(!list.isEmpty()){
    return list.get(0);
    }
    return null;
    }
    /**
    * 支持预编译的查询单条数据方法
    * @param sql 需要执行的预编译sql语句
    * @param types 预编译sql中参数的类型数组
    * @param obj 预编译sql中参数的值数组
    * @return 执行查询sql后返回的单条数据
    */
    @Override
    public Map<String, Object> queryForMap(String sql, int[] types, Object[] obj) {
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    try {
    Connection conn = DbUtils.getConnection();
    PreparedStatement ps = conn.prepareStatement(sql);
    //循环遍历参数数组 并将数组中的值设置给预编译sql
    for (int i = 0; i < obj.length; i++) {
    switch (types[i]) {
    case Types.INTEGER:
    ps.setInt(i+1,Integer.parseInt(obj[i].toString()));
    break;
    case Types.VARCHAR:
    ps.setString(i+1,obj[i].toString());
    break;
    default:
    ps.setString(i+1,obj[i].toString());
    }
    }
    ResultSet rs = ps.executeQuery();
    list = rsToList(rs);
    DbUtils.close();

    } catch (SQLException e) {
    e.printStackTrace();
    }
    if(!list.isEmpty()){
    return list.get(0);
    }
    return null;
    }

    /**
    * 不支持预编译的增删改方法
    * @param sql 需要执行的sql语句
    * @return 对数据库操作后发生变化的数据条数
    */
    @Override
    public int excuteUpdate(String sql) {
    try {
    Connection conn = DbUtils.getConnection();
    Statement sta = conn.createStatement();
    int count = sta.executeUpdate(sql);
    DbUtils.close();
    return count;
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return 0;
    }

    /**
    * 支持预编译的增删改方法
    * @param sql 需要执行的预编译sql语句
    * @param types 预编译sql中参数的类型数组
    * @param obj 预编译sql中参数的值数组
    * @return 对数据库操作后发生变化的数据条数
    */
    @Override
    public int excuteUpdate(String sql, int[] types, Object[] obj) {
    try {
    Connection conn = DbUtils.getConnection();
    PreparedStatement ps = conn.prepareStatement(sql);
    //循环遍历参数数组 并将数组中的值设置给预编译sql
    for (int i = 0; i < obj.length; i++) {
    switch (types[i]) {
    case Types.INTEGER:
    ps.setInt(i+1,Integer.parseInt(obj[i].toString()));
    break;
    case Types.VARCHAR:
    ps.setString(i+1,obj[i].toString());
    break;
    default:
    ps.setString(i+1,obj[i].toString());
    }
    }
    int count = ps.executeUpdate();
    DbUtils.close();
    return count;
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return 0;
    }

    /**
    * 不支持预编译的统计数据条数方法
    * @param sql 需要执行的sql语句
    * @return 查询sql执行后返回的条目数量结果
    */
    @Override
    public int queryForCount(String sql) {
    try {
    Connection conn = DbUtils.getConnection();
    Statement sta = conn.createStatement();
    ResultSet rs = sta.executeQuery(sql);
    int count = 0 ;
    while(rs.next()){
    count = rs.getInt(1);
    }
    DbUtils.close();
    return count;
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return 0;
    }

    /**
    * 支持预编译的统计数据条数方法
    * @param sql 需要执行的预编译sql语句
    * @param types 预编译sql中参数的类型数组
    * @param obj 预编译sql中参数的值数组
    * @return 查询sql执行后返回的条目数量结果
    */
    @Override
    public int queryForCount(String sql, int[] types, Object[] obj) {
    try {
    Connection conn = DbUtils.getConnection();
    PreparedStatement ps = conn.prepareStatement(sql);
    //循环遍历参数数组 并将数组中的值设置给预编译sql
    for (int i = 0; i < obj.length; i++) {
    switch (types[i]) {
    case Types.INTEGER:
    ps.setInt(i+1,Integer.parseInt(obj[i].toString()));
    break;
    case Types.VARCHAR:
    ps.setString(i+1,obj[i].toString());
    break;
    default:
    ps.setString(i+1,obj[i].toString());
    }
    }
    ResultSet rs = ps.executeQuery();
    int count = 0;
    while(rs.next()){
    count = rs.getInt(1);
    }
    DbUtils.close();
    return count;
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return 0;
    }

    /**
    * 提供将ResultSet结果集转换为list集合的实现
    * @param rs 需要转换的结果集视图
    * @return list 转换后封装数据的集合
    */
    private List<Map<String, Object>> rsToList(ResultSet rs) {
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    try {
    while(rs.next()){
    Map<String, Object> map = new HashMap<String,Object>();
    for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
    switch (rs.getMetaData().getColumnType(i)) {
    case Types.INTEGER:
    map.put(rs.getMetaData().getColumnName(i),rs.getInt(i));
    break;
    case Types.VARCHAR:
    map.put(rs.getMetaData().getColumnName(i),rs.getString(i));
    break;
    default:
    map.put(rs.getMetaData().getColumnName(i),rs.getObject(i));
    }
    }
    list.add(map);
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return list;
    }


    public static void main(String[] args) {
    //查询多条数据
    SuperDao dao = new SuperDaoImpl();
    String sql = "select * from people";
    List<Map<String, Object>> list = dao.queryForList(sql);
    System.out.println(list);
    }
    }