分类:Java


Eclipse启动报错,找不到jvm.dll


启动eclipse报错,根据报错信息显示可知是找不到jdk下的jvm.dll文件
对照报错信息显示的路径我们可以找到对应的文件

这种情况的话就是版本不兼容
打开eclipse.ini通过
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20130521-0416
可知,eclipse为64位

打开cmd执行java -version
如果没有显示bit-64则说明当前jdk为32位

重新下载jdk选择名称带有x64的jdk
带有x86的为32位的jdk

下载安装之后切换JAVA_HOME路径即可

Idea中Maven项目不能新建Package和Class的解决方法


今天通过idea新建一个maven项目,创建之后要去创建package
却在new中怎么也找不到建package的选项
本以为是创建maven项目时的Archetype(骨架)选择错误
但是之前创建项目并未记得特意选择骨架

之后的话就认定为环境异常了

通过尝试找到的解决办法如下

通过观察发现,新建的maven项目与其他项目相比
java文件夹和rsources文件夹没有特殊标记即为普通文件夹

选中java文件夹,右键选中Mark Directory As 选中Sources Root
选中resources文件夹,右键选中Mark Directory As 选中Test Resources Root

问题解决了

企业应用快速开发平台


JeeSite

JeeSite 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring MVC、Apache 
Shiro、MyBatis、Beetl、Bootstrap、AdminLTE),在线代码生成功能,包括核心模块如:组织机构、角色
用户、菜单及按钮授权、数据权限、系统参数、内容管理、工作流等。采用松耦合设计;界面无刷新,一键换肤;
众多账号安全设置,密码策略;在线定时任务配置;支持集群,支持SAAS;支持多数据源。

JeeSite 快速开发平台的主要目的是能够让初级的研发人员快速的开发出复杂的业务功能,让开发者注重专注业务,
其余有平台来封装技术细节,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。

JeeSite 自开源以来已被广大爱好者用到了企业、政府、医疗、金融、互联网等各个领域中,JeeSite 依架构简单精良、
易于扩展、大众思维的设计模式,深入开发者的内心,并得到一致好评,于2016和2017连续两年获得开源中国《最受欢迎中
国开源软件》奖杯,期间也帮助了不少刚毕业的大学生作为入门教材,快速的去实践。

现在 JeeSite 4.0 来了,4.0的升级,作者结合了多年总结和经验,以及各方面的应用案例,对架构完成了一次全部重构,
也纳入很多新的思想。不管是从开发者模式、底层架构、逻辑处理还是到用户界面,用户交互体验上都有很大的进步,在不
忘学习成本、提高开发效率的情况下,安全方面也做和很多工作,包括:身份认证、密码策略、安全审计、日志收集。
JeeSite官网地址

另外jee系列的企业快速开发平台还有:
JeePlus
Jeecg

可通过搜索查看其部署的演示系统
例如jeecg的演示系统http://demo.jeecg.org

JavaJDK历史版本下载


打开百度,搜索JDK

进入到Orcle官网下载页面

选择Java SE

选择Downloads

移动到最底端

找到Java Archive选中其后的下载按钮

在跳转页选择自己想要下载的任意版本

Maven执行install出现ERROR


1.确定idea或eclipse等开发环境中设置的本地方库是否为你认为的位置
因此可能出现的错误:idea设置仓库地址为B,执行发生错误,你却一直在A仓库操作

2.执行install,查看错误日志
如果为多个串联项目,则先判断是自己项目的问题还是远程项目的问题
如果是自己项目的问题,则到此项目执行install
如果错误查看日志,这是应该是远程项目的问题

3.解决远程项目问题
查看本地仓库中时候成功下载jar包

3.1没有成功下载则尝试重新下载看时候为网络问题

3.1.1如非网络问题
新建项目加入pom依赖,查看是否下载成功
如下载成功则是自身项目问题,需进一步查看
3.1.2否则则是jar包问题,这是需手动下载jar包并放置到本地方库

3.2如成功下载jar包
则可能是因为jar包冲突引起,导致项目无法确定调用的某个类该选择谁

JDK版本降低无效


依照原本安装为jdk1.8降级为jdk1.7无效为例

前提:
1.之前安装jdk版本为1.8
2.重新安装jdk1.7并将JAVA_HOME切换为1.7路径
3.点击确定后打开cmd执行java -version显示还是1.8

解决方案:
1.删除C:\Windows\System32目录下的java.exe、javaw.exe、javaws.exe三个文件
如果没有找到这些文件就跳过
2.删除环境变量Path中C:\ProgramData\Oracle\Java\javapath的配置
把path的值贴出来看一下应该会有这一段的,直接删掉重新查看版本显示1.7

简单实现SpringMVC


1.新建maven项目
2.到pom中添加servlet依赖
<groupId>com.justin.springmvc</groupId>
    <artifactId>springmvc</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>war</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>

3.新建web.xml文件(src下main下webapp下WEB-INF下)
<?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"
         version="3.0">
    <servlet>
        <servlet-name>MySpringMVC</servlet-name>
        <servlet-class>com.justin.servlet.MyDispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>application.properties</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>MySpringMVC</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

4.新建application.properties文件(resources下)
配置待扫描的包
scanPackage=com.justin.core

5.新建包com.justin.annotation
6.创建自己的controller注解
package com.justin.annotation;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyController {

    /**
     * 给MyController注册别名
     *
     * @return 别名
     */
    String value() default "";
}
7.创建自己的MyRequestMapping注解
package com.justin.annotation;

import java.lang.annotation.*;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyRequestMapping {

    /**
     * 访问该方法的url
     *
     * @return url
     */
    String value() default "";
}
8.创建自己的MyRequestParam
package com.justin.annotation;

import java.lang.annotation.*;

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyRequestParam {

    /**
     * 参数的别名,必填
     *
     * @return 别名
     */
    String value();
}
9.新建com.justin.servlet包
10.新建MyDispatcherServlet
package com.justin.servlet;

import com.justin.annotation.MyController;
import com.justin.annotation.MyRequestMapping;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.*;

public class MyDispatcherServlet extends HttpServlet {

    private Properties properties = new Properties();

    private List&lt;String&gt; classNames = new ArrayList&lt;&gt;();

    private Map&lt;String, Object&gt; ioc = new HashMap&lt;&gt;();

    private Map&lt;String, Method&gt; handlerMapping = new HashMap&lt;&gt;();

    private Map&lt;String, Object&gt; conntrollerMap = new HashMap&lt;&gt;();

    @Override
    public void init(ServletConfig config) throws ServletException {
        //加载配置文件
        doLoadConfig(config.getInitParameter("contextConfigLocation"));
        //2.初始化所有相关联的类,扫描用户设定的包下面所有的类
        doScanner(properties.getProperty("scanPackage"));
        //3.拿到扫描到的类,通过反射机制,实例化,并且放到ioc容器中(k-v  beanName-bean) beanName默认是首字母小写
        doInstance();
        //4.初始化HandlerMapping(将url和method对应上)
        initHandlerMapping();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            //处理请求
            doDispatch(req, resp);
        } catch (Exception e) {
            resp.getWriter().write("500!! Server Exception");
        }
    }

    private void doDispatch(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        if (handlerMapping.isEmpty()) {
            return;
        }
        String url = req.getRequestURI();
        String contextPath = req.getContextPath();

        url = url.replace(contextPath, "").replaceAll("/+", "/");

        if (!this.handlerMapping.containsKey(url)) {
            resp.getWriter().write("404 NOT FOUND!");
            return;
        }

        Method method = this.handlerMapping.get(url);

        //获取方法的参数列表
        Class&lt;?&gt;[] parameterTypes = method.getParameterTypes();

        //获取请求的参数
        Map&lt;String, String[]&gt; parameterMap = req.getParameterMap();

        //保存参数值
        Object[] paramValues = new Object[parameterTypes.length];

        //方法的参数列表
        for (int i = 0; i &lt; parameterTypes.length; i++) {
            //根据参数名称做某些处理
            String requestParam = parameterTypes[i].getSimpleName();

            if (requestParam.equals("HttpServletRequest")) {
                //参数类型已明确,这边强转类型
                paramValues[i] = req;
                continue;
            }
            if (requestParam.equals("HttpServletResponse")) {
                paramValues[i] = resp;
                continue;
            }
            if (requestParam.equals("String")) {
                for (Map.Entry&lt;String, String[]&gt; param : parameterMap.entrySet()) {
                    String value = Arrays.toString(param.getValue()).replaceAll("\\[|\\]", "").replaceAll(",\\s", "");
                    paramValues[i] = value;
                }
            }
        }
        //利用反射机制来调用
        try {
            //第一个参数是method所对应的实例 在ioc容器中
            method.invoke(this.conntrollerMap.get(url), paramValues);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void doLoadConfig(String location) {
        //把web.xml中的contextConfigLocation对应value值的文件加载到流里面
        InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream(location);
        try {
            properties.load(resourceAsStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != resourceAsStream) {
                try {
                    resourceAsStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private void doScanner(String packageName) {
        //把所有的,替换成/
        URL url = this.getClass().getClassLoader().getResource("/" + packageName.replaceAll("\\.", "/"));
        File dir = new File(url.getFile());
        for (File file : dir.listFiles()) {
            if (file.isDirectory()) {
                doScanner(packageName + "." + file.getName());
            } else {
                String className = packageName + "." + file.getName().replace(".class", "");
                classNames.add(className);
            }
        }
    }

    private void doInstance() {
        if (classNames.isEmpty()) {
            return;
        }
        for (String className : classNames) {
            try {
                //把类搞出来,反射来实例化(只有加@MyController需要实例化)
                Class&lt;?&gt; clazz = Class.forName(className);
                if (clazz.isAnnotationPresent(MyController.class)) {
                    ioc.put(toLowerFirstWord(clazz.getSimpleName()), clazz.newInstance());
                } else {
                    continue;
                }
            } catch (Exception e) {
                e.printStackTrace();
                continue;
            }
        }
    }

    private void initHandlerMapping() {
        if (ioc.isEmpty()) {
            return;
        }
        try {
            for (Map.Entry&lt;String, Object&gt; entry : ioc.entrySet()) {
                Class&lt;? extends Object&gt; clazz = entry.getValue().getClass();
                if (!clazz.isAnnotationPresent(MyController.class)) {
                    continue;
                }
                //拼url时,是controller头的url拼上方法上的url
                String baseUrl = "";
                if (clazz.isAnnotationPresent(MyRequestMapping.class)) {
                    MyRequestMapping annotation = clazz.getAnnotation(MyRequestMapping.class);
                    baseUrl = annotation.value();
                }
                Method[] methods = clazz.getMethods();
                for (Method method : methods) {
                    if (!method.isAnnotationPresent(MyRequestMapping.class)) {
                        continue;
                    }
                    MyRequestMapping annotation = method.getAnnotation(MyRequestMapping.class);
                    String url = annotation.value();

                    url = (baseUrl + "/" + url).replaceAll("/+", "/");
                    handlerMapping.put(url, method);
                    conntrollerMap.put(url, clazz.newInstance());
                    System.out.println(url + "," + method);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 把字符串的首字母小写
     *
     * @param name 代转字符串
     * @return 转出结果
     */
    private String toLowerFirstWord(String name) {
        char[] charArray = name.toCharArray();
        charArray[0] += 32;
        return String.valueOf(charArray);
    }
}
11.新建com.justin.core.controller
12.新建TestController
package com.justin.core.controller;

import com.justin.annotation.MyController;
import com.justin.annotation.MyRequestMapping;
import com.justin.annotation.MyRequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@MyController
@MyRequestMapping("/test")
public class TestController {

    @MyRequestMapping("/doTest")
    public void test1(HttpServletRequest request, HttpServletResponse response, @MyRequestParam("param") String param) {
        System.out.println(param);
        try {
            response.getWriter().write("doTest method success! param:" + param);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @MyRequestMapping("/doTest2")
    public void test2(HttpServletRequest request, HttpServletResponse response) {
        try {
            response.getWriter().println("doTest2 method success!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
13.大功告成,通过tomcat或jetty启动项目
14.访问localhost:8080/test/doTest?param=justin
15.没报异常错误则说明构建成功,否则请根据异常自行检查!

Linux下Tomcat的使用


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

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

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("--------------------------------------------------------------");
测试结果如下:
直角在左下的等腰直角三角形
 * 
 * * 
 * * * 
 * * * * 
 * * * * * 
 * * * * * * 
 * * * * * * * 
 * * * * * * * * 
 * * * * * * * * * 
--------------------------------------------------------------
直角在左上的等腰直角三角形
 * * * * * * * * * 
 * * * * * * * * 
 * * * * * * * 
 * * * * * * 
 * * * * * 
 * * * * 
 * * * 
 * * 
 * 
--------------------------------------------------------------
直角在右上的等腰直角三角形
 * * * * * * * * * 
 * * * * * * * * 
 * * * * * * * 
 * * * * * * 
 * * * * * 
 * * * * 
 * * * 
 * * 
 * 
--------------------------------------------------------------
直角在右下的等腰直角三角形
 * 
 * * 
 * * * 
 * * * * 
 * * * * * 
 * * * * * * 
 * * * * * * * 
 * * * * * * * * 
 * * * * * * * * * 
--------------------------------------------------------------
底边在下的等腰三角形
 * 
 * * * 
 * * * * * 
 * * * * * * * 
 * * * * * * * * * 
 * * * * * * * * * * * 
 * * * * * * * * * * * * * 
--------------------------------------------------------------
等边三角形
     *
    * * 
   * * *
  * * * * 
 * * * * *
* * * * * *  
--------------------------------------------------------------
向右偏的平行四边形
           * * * * * * 
         * * * * * * 
       * * * * * * 
     * * * * * * 
   * * * * * * 
 * * * * * * 
--------------------------------------------------------------
空心平行四边形
           * 
         *   * 
       *       * 
     *           * 
   *               * 
 *                   * 
   *               * 
     *           * 
       *       * 
         *   * 
           * 
--------------------------------------------------------------