学习记录01

记录:

  1. @CrossOrigin可以处理跨域请求;

  2. @Data : 注解在类上, 为类提供读写属性, 此外还提供了 equals()、hashCode()、toString() 方法;

  3. JDK动态代理是面向接口,CGLib动态代理是通过字节码底层继承要代理类来实现,Spirng默认采用JDK动态代理实现机制;

  4. 使用的是spring-session实现分布式集群session的共享,共享同一份session数据。把session数据保存到内存以外的一个统一的地方;

  5. 定时任务使用的是elasticJob,实现了幂等性;

  6. 幂等性:在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。https://www.cnblogs.com/leechenxiang/p/6626629.html

  7. 定时任务重复执行,通过zookeeper选举其中一个持久化server的ip信息
    https://www.jianshu.com/p/fc345064767c
    https://blog.csdn.net/jiequandao12/article/details/75575205
    https://www.cnblogs.com/wyb628/p/7682580.html

  8. Springboot中配置CORS解决前后端分离跨域问题,使用corsFilter,设置UrlBasedCorsConfigurationSource;

  9. 使用@Cacheable,当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的;

  10. postman设置绕过登录验证,先页面登录,获取到cookie,然后把cookie的键值对放到postman请求url中的headers中;

  11. @RequestParam这个的参数是用在get方式中,放在url?后面的,而@PathVariable放在post方式中,@requestBody可以将请求体中的JSON字符串绑定到相应的bean上;

  12. kafka分布式消息订阅系统,https://blog.csdn.net/yy756127197/article/details/78252432;

  13. 前端传日期戳或者string的日期,后端接收日期,标记类型为Date时候就可以自动对应上了;

  14. 因为在持久层、业务层和控制层中,分别采用@Repository、@Service和@Controller对分层中的类进行凝视,而用@Component对那些比较中立的类进行凝视。https://blog.csdn.net/m0_37626813/article/details/78558010;

  15. @ConditionalOnProperty,这个注解能够控制某个configuration是否生效。具体操作是通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值,如果该值为空,则返回false;如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。如果返回值为false,则该configuration不生效;为true则生效;

  16. @payload:有效载荷,注意请求的Content-Type为text/plain;charset=UTF-8,而请求表单参数在RequestPayload中。使用原生ajax请求时,如果不显示的设置Content-Type,那么默认是text/plain,这时服务器就不知道怎么解析数据了,所以才只能通过获取原始数据流的方式来进行解析请求数据;

  17. idea常用配置详细图解:https://mp.weixin.qq.com/s?__biz=MjM5NzM0MjcyMQ==&mid=2650083718&idx=2&sn=7c34d6e26384c439b9128bf1f5e1844c&chksm=bedacae889ad43fe20e052272fba592a05ad9a0434a9d79a6a4f78fbd6e714a56b6effe68a27&mpshare=1&scene=1&srcid=0915POtF4BVifyttG2y7BRr3#rd;

  18. 运行时异常和非运行时异常:
    1)运行期异常使用RuntimeException的子类来表示,不用在可能抛出异常的方法声明上加throws子句。非运行期异常是从Exception继承而来,必须在方法声明上加throws子句。
    2)非运行期异常是由外界运行环境决定异常抛出条件的异常,例如文件操作,可能受权限、磁盘空间大小的影响而失败,这种异常是程序本身无法避免的,需要调用者明确考虑该异常出现时该如何处理方法,因此非运行期异常必须有throws子句标出,不标出或者调用者不捕获该类型异常都会导致编译失败,从而防止程序员本身疏忽。
    3)运行期异常是程序在运行过程中本身考虑不周导致的异常,例如传入错误的参数等。抛出运行期异常的目的是防止异常扩散,导致定位困难。因此在做异常体系设计时要根据错误的性质合理选择自定义异常的继承关系。
    4)throw是语句抛出一个异常,一般是在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常。throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常);

  19. 如果一个类中出现很多的属性,同时这些属性值很多又是可选的,可以使用构建器。https://www.cnblogs.com/parryyang/p/5696916.html;

  20. 不要在循环体内调用同步方法和使用 try-catch 块;

  21. StringTokenizer是字符串分割解析类;

  22. 日志管理平台ELK,ElasticSearch、Logstash、Kibana,https://blog.csdn.net/polaris_1/article/details/54381502;

  23. idea的debug调试,F5进入到方法中,F6下一步,F8跳到下一个断点,https://www.cnblogs.com/chiangchou/archive/2017/09/05/idea-debug.html;

  24. spring的BeanUtils可以直接复制Date类型的,如果元对象有null值,也会覆盖目标对象的值,变成null。设置忽略属性可以防止元对象中为null值得覆盖掉目标对象中存在的值。BeanUtils.copyProperties(Object source,Object target, String… ignoreProperties)。https://blog.csdn.net/qq_28988969/article/details/75442637;

  25. 在Spring依赖注入中有两个非常关键的接口,那就是BeanDefinition和BeanWrapper。由BeanDefinition提供数据,然后BeanWrapper负责依赖注入。https://blog.csdn.net/u012410733/article/details/53346345;

  26. JVM调优:https://www.cnblogs.com/xingzc/p/5756119.html;

  27. 垃圾回收算法:

    1. 按照基本回收策略分:
      1)引用计数,引用一个增加一个计数,删除一个引用减少一个计数,此算法最致命的是无法处理循环引用的问题;
      2)标记-清除,从根节点标记所有被引用的对象,遍历整个堆,把没有被引用的对象清除,会产生内存碎片,导致不能合理分配较大的内存;
      3)复制,把内存空间分为两个相等的区域,每次只用一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中,缺点需要两倍的内存空间;
      4)标记-整理,结合标记-清除和复制的优点;
    2. 按分区对待的方式分:
      1)增量收集,在应用进行的同时进行垃圾回收;
      2)分代收集,对象分年轻代,年老代,持久代;
    3. 按系统线程分:
      1)串行收集:单线程处理;
      2)并行收集:多线程处理;
      3)并发收集;
  28. 垃圾回收:分代。年轻代分三个区:一个Eden区,两个Survivor区,年老代,持久代;

  29. JVM设置:
    -Xmx设置JVM最大可用内存。
    -Xms是指初始内存。
    -XMn2g设置年轻代大小为2g。整个堆大小=年轻代大小+年老代大小+持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
    -Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256k。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
    -XX:NewRatio=4:设置年轻代(包括Eden和两个Survior区)与年老代的比值。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5.
    -XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6。
    -XX:MaxPermSize=16m:设置持久代大小为16m。
    -XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代被回收的概率。
    吞吐量优先的并行收集器,并行收集器主要以到达一定的吞吐量为目标,适用于科学计算和后台处理等。
    -XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
    -XX:+ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
    -XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。
    -XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。
    -XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低响应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
    响应时间优先的并发收集器,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等。
    -XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。
    -XX:+UseParNewGC:设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。
    -XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。( -XX:CMSFullGCsBeforeCompaction=5)
    -XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片。

  30. JVM调优常见配置汇总
    堆设置
    -Xms:初始堆大小
    -Xmx:最大堆大小
    -XX:NewSize=n:设置年轻代大小
    -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5。
    -XX:MaxPermSize=n:设置持久代大小
    收集器设置
    -XX:+UseSerialGC:设置串行收集器
    -XX:+UseParallelGC:设置并行收集器
    -XX:+UseParalledlOldGC:设置并行年老代收集器
    -XX:+UseConcMarkSweepGC:设置并发收集器
    垃圾回收统计信息
    -XX:+PrintGC
    -XX:+PrintGCDetails
    -XX:+PrintGCTimeStamps
    -Xloggc:filename
    并行收集器设置
    -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
    -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
    -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+N)
    并发收集器设置
    -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
    -XX:+ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

  31. 阻塞、非阻塞:程序等待调用结果时的状态。涉及到CPU线程调度;所谓阻塞,就是调用结果返回之前,该执行线程会被挂起,不释放CPU执行权,线程不能做其它事情,只能等待,只有等到调用结果返回了,才能接着往下执行;所谓非阻塞,就是在没有获取调用结果时,不是一直等待,线程可以往下执行,如果是同步的,通过轮询的方式检查有没有调用结果返回,如果是异步的,会通知回调;

  32. springboot整合springmvc和mybatis;

  33. Spring缓存注解@Cacheable(设置缓存,方法上或类上)、@CacheEvict(清空缓存)、Condition(设置缓存条件);

  34. TimeUnit是Concurrent包下的一个类,它提供了两大功能:
    1)提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep();
    2)提供了便捷方法用于把时间转换成不同单位,如把秒转换成毫秒;

  35. 延时任务可以使用HashedWheelTimer,https://www.cnblogs.com/zemliu/p/3928285.html;

  36. oracle的merge into,是:“有则更新,无则插入”,用来合并UPDATE和INSERT语句,MERGE INTO table_name alias1 USING (table|view|sub_query) alias2 ON (join condition) WHEN MATCHED THEN UPDATE table_name SET col1 = col_val1,col2 = col_val2 WHEN NOT MATCHED THEN INSERT (column_list) VALUES (column_values);

  37. 编程式事务,使用TransactionTemplate中的execute(TransactionCallback action),可以在这个方法中添加需要事务的所有方法。声明式事务,则可以在实现类中的方法上添加@Transactional,保证其中的逻辑调用方法保持一致性;

  38. 事务的选择,如果是少量事务使用编程式事务,大量事务使用声明式事务(注解);https://blog.csdn.net/liaohaojian/article/details/70139151;

  39. springboot开启事务,就是在启动类上使用注解@EnableTransactionManagement,具体使用事务:找到你的service实现类,加上@Transactional 注解;

  40. 事务隔离级别,定义一个事务可能受其他并发事务活动活动影响的程度。事务传播行为,确定客户端和被调用端的事务边界(说得通俗一点就是多个具有事务控制的service的相互调用时所形成的复杂的事务边界控制);https://www.cnblogs.com/zhishan/p/3195219.html;

  41. 状态码:http://www.runoob.com/http/http-status-codes.html
    1)状态码分类:
    1**:服务器接收到请求,需要执行者继续执行操作,
    2**:成功,操作被成功接收并处理,
    3**:重定向,需要进一步操作完成请求,
    4**:客户端错误:请求包含语法错误或无法完成请求,
    5**:服务端错误,服务端在处理请求的过程中发生了错误;
    2)403没有权限访问此站;
    3)404资源路径错误;
    4)405错误一般是HTTP使用的method类型不对导致的,用了不是指定的get或post方式等;
    5)500内部错误;
    6)501不支持请求的功能,无法完成请求;
    7)502 bad gateway 错误网关,无效网关,解决方法通过快捷键 ctrl+F5,从服务器刷新来处理,这样就是重新向服务器发送请求了;
    8)503由于超载或系统维护,服务器暂时无法处理客户端的请求;
    9)504 Gateway Time-out,充当网关或者代理的服务器,未及时从远端服务器获取请求;
    10)505 HTTP Version not supported,服务器不支持请求的HTTP协议的版本,无法完成处理;

  42. JSON.parseObject,是将Json字符串转化为相应的对象;JSON.toJSONString则是将对象转化为Json字符串;

  43. spring-data-redis操作redis通过redisTemplate, redisTemplate.opsForValue().set(key,value)用于缓存对象,redisTemplate.boundValueOps(“key”)用于获取key对应的value值。https://www.cnblogs.com/fingerboy/p/6704812.html;

  44. 找不到类导入的时候,试试maven-reimport;

  45. oracle中的||相当于串联,连接字符串,substr是字符串截取一定的长度,instr是字符查找,返回所在的位置;

  46. 一个分区只能被一个线程消费,但一个消费线程可以消费多个分区的数据;

  47. 抽象类包含抽象方法,还可以包含具体方法和具体数据;

  48. linux中sed用于编辑处理文件内容,awk用于在数据中查找内容()。last -n 5 | awk ‘{print $1}’(是显示最近登录的5个帐号);

  49. 前端页面调试,如果不是一直调试的话使用chrome的硬刷新即可, ctrl+shift+R;

  50. springboot中,自定义类注册为bean,实现ImportBeanDefinitionRegistrar接口,重写registerBeanDefinitions方法。使用GenericBeanDefinition的setBeanClass方法设置beanClass,再注册;

  51. springboot中,注册到Spring容器内的bean,实现了EnvironmentAware接口重写setEnvironment方法后,在工程启动时可以获得application.properties的配置文件配置的属性值;

  52. spring AOP中的@Around用于环绕通知,其中ProceedingJoinPoint的proceed方法用于让目标方法执行,这这个方法前配置前置,在方法执行之后配置后置;

  53. CompareTo()比较方法理解:根据返回值来判断大小, 结果是1,说明2大,1小, 排序后是1,2;参数顺序是(2,1)—> 比较方案是1-2=-1; 根据-1的返回结果,程序就认为2比1小,排序后就是2,1;

  54. angularjs中,集合list的长度,通过list.length得到,如 for(var i=0; i<$scope.fansDetail.length; i++);

  55. CDH:Cloudera’s Distribution Including Apache Hadoop(Cloudera公司发行的),CM:Cloudera Manager,用来配置、监控和管理CDH集群;

  56. Docker三个基本概念:镜像(Image)、容器(Container)、仓库(Repository)。Docker镜像(Image)就是一个只读的模板。一个镜像可以包含一个完整的ubuntu操作系统环境,里面仅安装了Apache或用户需要的其它应用程序。镜像可以用来创建Docker容器。Docker利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。镜像是只读的,容器在启动的时候创建一层可写层作为最上层。仓库(Repository)是集中存放镜像文件的场所。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载;

  57. 对于微信端页面的调试,可以通过idea的访问html到浏览器中调试;

  58. 前端的调试,也可以把项目的静态页面html、样式css和js取出来,传给其他人调试;

  59. 调试前端:通过service设置分页数据,本地启动返回参数,设置域名手机访问,有地方可以alert一下,可以chrome的F12source打断点;

  60. sql优化可以参考使用执行计划调优和优化表结构;

  61. oracle的执行计划:
    explain plan for
    select * from ticket where COUPON_CODE=‘1000001282874698’;
    select * from table(DBMS_XPLAN.DISPLAY);
    mysql的执行计划:EXPLAIN select * from city,可以参考:https://blog.csdn.net/wuseyukui/article/details/71512793;

  62. 优化sql的时候,考虑加索引,考虑最先执行的时候筛选掉大部分的数据,使用执行计划作为参考;

  63. 编程式事务控制:
    DefaultTransactionDefinition td = new DefaultTransactionDefinition();
    td.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
    final TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager, td);
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    @Override
    protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
    //调用方法

            }
        });
    
  64. 如果springboot中事务类TransactionAutoConfiguration依赖的是DataSourceTransactionManagerAutoConfiguration,则无须显示开启使用@EnableTransactionManagement注解,因为DataSourceTransactionManagerAutoConfiguration配置里默认开启了声明式事务的支持;

  65. 创建对象时候不写默认已经有无参构造方法,如果设置了有参构造方法,要用到无参的要把无参构造方法也写出来;

  66. 乐观锁和悲观锁:
    悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现;
    乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的;
    乐观锁适用于写比较少的情况下,一般多写的场景下用悲观锁就比较合适;

  67. mybatis的一级缓存和二级缓存:

    1. MyBatis默认开启了一级缓存,一级缓存是在SqlSession 层面进行缓存的。同一个SqlSession ,多次调用同一个Mapper和同一个方法的同一个参数,只会进行一次数据库查询,然后把数据缓存到缓冲中,以后直接先从缓存中取出数据,不会直接去查数据库。但是不同的SqlSession对象,因为不用的SqlSession都是相互隔离的,所以相同的Mapper、参数和方法,他还是会再次发送到SQL到数据库去执行,返回结果。
    2. 二级缓存是缓存在SqlSessionFactory层面给各个SqlSession对象共享。默认二级缓存是不开启的,需要手动进行配置。https://blog.csdn.net/qq_35673617/article/details/80543873;
  68. JMS消息传输模型:

    1. 点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除)。这个模型的特点是发送到队列的消息被一个且只有一个接收者接收处理,即使有多个消息监听者也是如此;
    2. 发布/订阅模式(一对多,数据生产后,推送给所有订阅者)。发布订阅模型则是一个基于推送的消息传送模型。发布订阅模型可以有多种不同的订阅者,临时订阅者只在主动监听主题时才接收消息,而持久订阅者则监听主题的所有消息,即时当前订阅者不可用,处于离线状态;
  69. 消息系统的核心作用就是三点:解耦,异步和并行;

  70. idea导入多个项目通过Module模块方式导入;

  71. 关于zookeeper:
    1)zookeeper查看进程:jps
    2)zookeeper启动指定配置文件:
    ./zkServer.sh start myzoo.cfg

  72. 数据库文档生成工具DBCHM v1.7:https://www.oschina.net/news/104111/dbchm-v-1-7-released;

  73. oracle造数据:https://blog.csdn.net/ck3207/article/details/78315843

  74. oracle教程:https://www.cnblogs.com/wayne-ivan/p/5651028.html

  75. 排查问题,定位问题:
    1)理解业务逻辑
    2)真正找到看日志的地方
    3)使用grep查找
    4)要客观

  76. HSSF和XSSF的区别:
    HSSF是POI工程对Excel 97(-2007)文件操作的纯Java实现
    XSSF是POI工程对Excel 2007 OOXML (.xlsx)文件操作的纯Java实现

  77. linux中查看磁盘io:sar -d

  78. inner join是默认的连接方式,可缩写为join,在使用Left(right)join的时候,一定要在先给出尽可能多的匹配满足条件(在on中加条件),减少Where的执行;

  79. 在使用left join时,on和where条件的区别如下:
    1.on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录;
    2.where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉;
    3.在使用INNER JOIN时会产生一个结果集,WHERE条件在这个结果集中再根据条件进行过滤,如果把条件都放在ON中,在INNER JOIN的时候就进行过滤了;

  80. 关于left join和join(inner join)的效率问题,具体问题具体分析,要考虑索引、on条件、where条件等;

  81. dubbo的rpc错误:rpc异常,RpcException可能是因为,生产者和消费者的版本号不一致,可能本身有默认的version,然后还有人为设定的version,可以通过查看编译之后的jar包,查看dubbo-consumer.xml和dubbo-provider.xml,以及配置参数的application.yml,来判断版本号是否对应一致;

  82. 加锁使用redis分布式锁LockRegistry,lockRegistry.obtain()获取锁对象;

  83. ArrayList是稳定无序的,TreeSet是稳定有序的;

  84. 进程进行到一半,突然停住了,一个多小时之后重新进行数据库的操作,原因:数据库表锁住了,可能有人操作数据库(delete/update等操作)后没有commit,导致表被锁住了;

  85. swift,如果文件路径完全一样,再上传上去,就会覆盖,如果文件路径不一样,包括后缀不一样,就会新增一个文件;

  86. java8新特性,Optional类可以解决java的null安全问题;

  87. idea指定配置文件打war包,首先使用maven的install,在install指定活跃文件即可,install之后再启动;

  88. Tomcat的webApp下面的文件名称就是访问路径,一般都是默认项目名称的,如果webapp下有多个项目,是根据项目名来做区分的;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值