Linux下Tomcat的使用

以下内容建立在tomcat已安装并可正常启动的前提下
之前的项目使用了SpringBoot,所以在部署的时候都是一键部署
最近负责的项目使用tomcat
其实linux上的tomcat使用与windows上类似
找到tomcat的文件路径并进入到webapps下
例如:/usr/local/tomcat/webapps
将生成的war包放进去,
等到自动编译出以项目命名的文件夹之后即可
在浏览器输入访问路径即可出现对应页面

重启的话就把原来的war包及编译出来的文件夹删除掉
重新导入war包等待编辑即可

Idea插件之五大装逼神器

TOP 5 stackoverflow
遇到报错等选中直接右键处理
说明:至于怎么处理,我也没试过,但看起来挺炫的

TOP 4 Sudoku Plugin
集成自己喜欢的游戏到Idea
说明:至于能添加什么游戏,不清楚,五子棋应该是有的

TOP 3 Nyan progress bar
将系统进度条换成彩虹进度条

TOP 2 Background Image Plus
设置idea背景图片

TOP 1 activate-power-mode OR Power mode II
这个我装了,感觉好牛逼,打代码屏幕在颤动
说明:打代码屏幕不只是在颤动

同样的代码只有你运行报错

条件一:相同的代码且是web项目
条件二:maven package正常,启动正常
条件三:点击某选项报错
今天这个异常我纠结了半天,代码是刚拉下来的,运行就报错;
我一度怀疑是队友坑我,少上传了一部分代码

试过了各种办法都没有效果
这是我注意到我使用jetty启动

于是切换了下tomcat试试
没有异常了

网上搜了下想找到原因
说法很多
还有些是tomcat报错jetty异常的
大多都没有解决方案

结束这段时间的学习计划之后,我想可以深入研究下
Tomcat和Jetty 

找到解决方案
通过这件事情我对自己的学习能力有了一个认识
在有文档或者解决方案的情况下勉强还可以
只有英文文档或者没有文档的情况下,就不行了

没有研究能力的学习能力是不真实的

Docker安装并使用MySQL(Windows下)

下载镜像
docker pull mysql

查看是否下载成功
docker images
看到mysql相关字眼则下载成功

运行 密码为123456 端口为3306
docker run --name mydb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

查看时候执行成功
docker ps
看到mysql相关字眼则说明正在启动

映射到主机启动
执行 docker images  看到mysql字眼
执行 docker run -itd -P mysql bash 进行映射
执行 docker ps  看到mysql映射信息,某端口到3306
执行 docker exec -it ID bash 连接到mysql镜像(ID为mysql ID号)
执行 service mysql status 看到mysql没有启动的信息
执行 service mysql start 启动mysql
执行 mysql 查看是否启动成功,此时进入mysql内

如何在外部访问?
此时用navcat连接,输入localhost及上面生成的端口号等
会报出错误:
2003——can't connect to mysql server on localhost(10061)
解决办法:
如果可以拿到my.ini文件
将bind-address = 127.0.0.1
改成
bind-address = 0.0.0.0
如果没有就加上

linux下
docker exec -it ID bash 进入容器,注意ID
cd 到/etc/mysql/mysql.conf.d/mysqld.cnf
cat mysqld.cnf 查看文件确认bind-address是否不正确
如不正确进行修改
sed 's/#bind-address/bind-address/g' mysqld.cnf>mysqlid.cnf.tmp
mv mysqld.cnf.tmp mysqld.cnf (覆盖原文件)
sed 's/127.0.0.1/0.0.0.0/g' mysqld.cnf mysqld.cnf>mysqlid.cnf.tmp
mv mysqld.cnf.tmp mysqld.cnf (覆盖原文件)

查看下文件是否修改正确

停止并删除容器
docker stop ID
docker rm ID

重新启动容器,命令在上方写过

依旧连不上,这段就当记录linux如何修改文件了...

Windows下安装Docker出现的问题

Windows下安装Docker会有很多坑的
安装成功后双击Docker Quickstart Terminal
提示Windows正在查找bash.exe...
错误原因:快捷方式的目标不正确(很可能是因为当初自定义了git的位置)
解决办法:
右键属性,找到目标栏,将值改正确即可,我的值为:
"D:\Program Files\Git\bin\bash.exe" 
--login -i "D:\Program Files\Docker Toolbox\start.sh"
打开Docker Quickstart Terminal后出现报错信息:
ERROR getting IP address...
解决办法:
 打开Oracle VM VirtualBox
 删除默认的虚拟机,如果在运行就停止后删除
 重启Docker Quickstart Terminal,会重新生成一个虚拟机
 启动完成,这个问题应该解决了
打开Docker Quickstart Terminal后出现报错信息:
ERROR creating machine:Error in ...UI-X/AMD-v enabled...
(虚拟化没有开启)
解决办法(以ThinkPad为例):
重启电脑按F1进入BIOS页面
按Tab或上下左右键移动到security
选中其下的visualizaiton选项将值改为enabled
然后F10保存恢复进入系统界面
 打开Oracle VM VirtualBox
 删除默认的虚拟机,如果在运行就停止后删除
 重启Docker Quickstart Terminal,会重新生成一个虚拟机
 启动完成,这个问题应该解决了
在cmd执行docker version出现信息有:
No connection could be made because 
the target machine actively refused it.
问题原因:
docker认为你并没有启动虚拟机
解决办法:
打开Docker Quickstart Terminal
$ docker-machine env default 会显示一串信息
$ export DOCKER_MACHINE_NAME="default"
打开Docker Quickstart Terminal后没有出现error相关字眼
且执行docker run ‘hello-world’出现了一大串信息
且没有出现error相关字眼则说明安装成功!

Java 启动异常

今天项目一直启动不了,报错信息如下:
java.lang.NoSuchMethodError: 
org.springframework.boot.builder.SpringApplicationBuilder
.([Ljava/lang/Object;)V
一下省略
根据报错信息可知,是找不到方法的异常;
手写代码SpringApplicationBuilder这个类是存在的
造成这样错误的原因:
切换pom文件中配置的版本,idea所识别到的配置发生了冲突
也就是通常所说的jar包冲突

解决办法:
打开maven project视图
点击刷新按钮即可
重新启动,项目正常运行
这不是一个很难解决的错误,但却耽误了很长时间,在此记录,希望不再有类似情况发生

java 实现三角形平行四边形等

记得刚开始学习编程的时候,有段时间一直在练习三角形平行四边形这些;
但是这些东西过段时间就会逻辑不清晰,今天回顾了一下,顺便做个记录.
System.out.println("直角在左下的等腰直角三角形");
        for (int i = 1; i <= 9; i++) {
            String row = "";
            for (int j = 1; j <= i; j++) {
               row += " * "; 
            }
             System.out.println(row); 
            } 
System.out.println("--------------------------------------------------------------"); 
            System.out.println("直角在左上的等腰直角三角形"); 
            for (int i = 9; i >= 1; i--) {
            String row = "";
            for (int j = 1; j <= i; j++) {
                row += " * "; 
            } 
            System.out.println(row); 
            } 
System.out.println("--------------------------------------------------------------"); 
            System.out.println("直角在右上的等腰直角三角形"); 
            for (int i = 9; i >= 1; i--) {
            String row = "";
            for (int ij = 9; ij > i; ij--) {
                row += "   ";
            }
            for (int j = 1; j <= i; j++) {
                row += " * ";
            }
            System.out.println(row);
        }
        System.out.println("--------------------------------------------------------------");

        System.out.println("直角在右下的等腰直角三角形");
        for (int i = 1; i <= 9; i++) { 
           String row = ""; 
          for (int ij = 9; ij > i; ij--) {
                row += "   ";
            }
            for (int j = 1; j <= i; j++) {
                row += " * ";
            }
            System.out.println(row);
        }
        System.out.println("--------------------------------------------------------------");

        System.out.println("底边在下的等腰三角形");
        for (int i = 1; i <= 7; i++) { 
            String row = ""; 
            for (int j = 7; j > i; j--) {
                row += "   ";
            }
            for (int ij = 1; ij <= (i * 2 - 1); ij++) {
                row += " * ";
            }
            System.out.println(row);
        }
        System.out.println("--------------------------------------------------------------");

        System.out.println("等边三角形");
        for (int i = 1; i <= 6; i++) { 
           String row = ""; 
            for (int j = 6; j > i; j--) {
                row += " ";
            }
            for (int ij = 1; ij <= i; ij++) {
                if (ij % 2 != 0) {
                    row += "*";
                } else {
                    row += " * ";
                }
            }
            System.out.println(row);
        }
        System.out.println("--------------------------------------------------------------");

        System.out.println("向右偏的平行四边形");
        for (int i = 1; i <= 6; i++) { 
            String row = ""; 
            for (int j = 6; j > i; j--) {
                row += "   ";
            }
            for (int ij = 1; ij <= 6; ij++) {
                row += " * ";
            }
            System.out.println(row);
        }
        System.out.println("--------------------------------------------------------------");

        System.out.println("空心平行四边形");
        //上半部分逻辑
        for (int i = 1; i <= 6; i++) { 
         String row = ""; 
        //左线前的空格逻辑 
         for (int j = 6; j > i; j--) {
                row += "   ";
            }
            //左线逻辑
            for (int ij = 1; ij < 2; ij++) {
                row += " * ";
            }
            //中心逻辑
            for (int ij2 = 1; ij2 < (i * 2 - 2); ij2++) {
                row += "   ";
            }
            //右线逻辑
            for (int ij = 1; ij < 2; ij++) {
                if (i != 1) {
                    row += " * ";
                }
            }
            System.out.println(row);
        }
        //下半部分逻辑
        for (int i = 1; i <= 5; i++) {
            String row = "";
            //左线前空格逻辑
            for (int j = 1; j <= i; j++) {
                row += "   ";
            }
            //左线逻辑
            for (int j = 1; j < 2; j++) {
                row += " * ";
            }
            //中间空白逻辑
            for (int ij = 1; ij < (5 - i) * 2; ij++) {
                row += "   ";
            }
            //右线逻辑
            for (int j = 1; j < 2; j++) {
                if (i != 5) {
                    row += " * ";
                }
            }
            System.out.println(row);
        }
        System.out.println("--------------------------------------------------------------");
测试结果如下:
直角在左下的等腰直角三角形
 * 
 * * 
 * * * 
 * * * * 
 * * * * * 
 * * * * * * 
 * * * * * * * 
 * * * * * * * * 
 * * * * * * * * * 
--------------------------------------------------------------
直角在左上的等腰直角三角形
 * * * * * * * * * 
 * * * * * * * * 
 * * * * * * * 
 * * * * * * 
 * * * * * 
 * * * * 
 * * * 
 * * 
 * 
--------------------------------------------------------------
直角在右上的等腰直角三角形
 * * * * * * * * * 
 * * * * * * * * 
 * * * * * * * 
 * * * * * * 
 * * * * * 
 * * * * 
 * * * 
 * * 
 * 
--------------------------------------------------------------
直角在右下的等腰直角三角形
 * 
 * * 
 * * * 
 * * * * 
 * * * * * 
 * * * * * * 
 * * * * * * * 
 * * * * * * * * 
 * * * * * * * * * 
--------------------------------------------------------------
底边在下的等腰三角形
 * 
 * * * 
 * * * * * 
 * * * * * * * 
 * * * * * * * * * 
 * * * * * * * * * * * 
 * * * * * * * * * * * * * 
--------------------------------------------------------------
等边三角形
     *
    * * 
   * * *
  * * * * 
 * * * * *
* * * * * *  
--------------------------------------------------------------
向右偏的平行四边形
           * * * * * * 
         * * * * * * 
       * * * * * * 
     * * * * * * 
   * * * * * * 
 * * * * * * 
--------------------------------------------------------------
空心平行四边形
           * 
         *   * 
       *       * 
     *           * 
   *               * 
 *                   * 
   *               * 
     *           * 
       *       * 
         *   * 
           * 
--------------------------------------------------------------

Spring提供的JdbcTemplate简单使用

所需maven配置

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-jdbc</artifactId>
 <version>4.2.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-tx</artifactId>
 <version>4.2.4.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>6.0.6</version>
</dependency>
// JDBC模板依赖于连接池来获得数据的连接,所以必须先要构造连接池
         DriverManagerDataSource dataSource = new DriverManagerDataSource();
         dataSource.setDriverClassName("com.mysql.jdbc.Driver");
         dataSource.setUrl("jdbc:mysql://localhost:3306/spring");
         dataSource.setUsername("root");
         dataSource.setPassword("123456");
 
         // 创建JDBC模板
         JdbcTemplate jdbcTemplate = new JdbcTemplate();
         // 这里也可以使用构造方法
         jdbcTemplate.setDataSource(dataSource);
 
         // sql语句
         String sql = "select count(*)  from user";
         Long num = (long) jdbcTemplate.queryForObject(sql, Long.class);
 
         System.out.println(num);

Java对JDBC结果集ResultSet的处理

代码中的Json及JsonList为本人重新创建的类,参考代码时可转为自己常用的相应类
/**
     * 将结果集转化为json对象
     *
     * @param resultSet 操作数据库后的结果集
     * @return json类型的结果集
     * @throws SQLException sql异常
     */
    protected static Json getResultSetByJson(ResultSet resultSet) throws SQLException {
        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
        int columnCount = resultSetMetaData.getColumnCount();
        Json json = new Json();
        while (resultSet.next()) {
            for (int i = 1; i <= columnCount; i++) {
                String key = resultSetMetaData.getColumnLabel(i);
                String value = resultSet.getString(key);
                json.put(key, value);
            }
        }
        return json;
    }

    /**
     * 将结果集转化为JosnList对象
     *
     * @param resultSet 结果集
     * @return jsonlist类型的结果集
     * @throws SQLException sql异常
     */
    protected static JsonList getResultSetByJsonList(ResultSet resultSet) throws SQLException {
        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
        int columnCount = resultSetMetaData.getColumnCount();
        JsonList jsonList = new JsonList();
        while (resultSet.next()) {
            Json json = new Json();
            for (int i = 1; i <= columnCount; i++) {
                String key = resultSetMetaData.getColumnLabel(i);
                String value = resultSet.getString(key);
                json.put(key, value);
            }
            jsonList.add(json);
        }
        return jsonList;
    }

    /**
     * 将结果集映射为实体类
     *
     * @param resultSet 结果集
     * @param t         实体
     * @param <T>       泛型
     * @return 实体类型的结果集
     * @throws SQLException              sql异常
     * @throws InvocationTargetException 反射异常
     * @throws IllegalAccessException    反射时访问私有成员权限不足导致的异常
     * @throws NoSuchMethodException     得不到方法异常
     */
    protected static <T> T getResultSetByT(ResultSet resultSet, T t) throws SQLException, InvocationTargetException, IllegalAccessException, NoSuchMethodException {
        //获取method方法
        Method[] methods = t.getClass().getMethods();

        //获取ResultSet列名
        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
        int columnCount = resultSetMetaData.getColumnCount();
        String[] columnNames = new String[columnCount];
        for (int i = 0; i < columnCount; i++) {
            columnNames[i] = resultSetMetaData.getColumnLabel(i + 1);
        }
        //遍历ResultSet
        while (resultSet.next()) {
            for (int i = 0; i < columnNames.length; i++) {
                //取得set方法
                String setMethodName = "set" + columnNames[i];
                //遍历method方法
                for (int j = 0; j < methods.length; j++) {
                    if (methods[j].getName().equalsIgnoreCase(setMethodName)) {
                        setMethodName = methods[j].getName();
                        Object value = resultSet.getObject(columnNames[i]);

                        //通过set方法赋值到实体
                        try {
                            if (value != null) {
                                //实体字段类型和RsultSet一样时
                                Method method = t.getClass().getMethod(setMethodName, value.getClass());
                                method.invoke(t, value);
                            }
                        } catch (Exception e) {
                            //实体字段类型和ResultSet不一样时,转为String
                            Method method = t.getClass().getMethod(setMethodName, String.class);
                            method.invoke(t, value.toString());
                        }
                    }
                }
            }
        }
        return t;
    }