IDEA入门与springboot第一个项目

IDEA新手入门:

1、汉化idea

    如果需要汉化idea,那么下载汉化jar包之后,需要将jar包中的某几个文件删除,否则idea的设置或其他的有可能打不开。就算删除了那几个文件之后,配置tomcat的时候还是配置不了,因此建议还是使用英文版。


2、创建springmvc非mvn项目

    配置完tomcat之后,创建一个javaweb项目(非mvn项目),直接新建一个Web Application即可,然后在tomcat中配置他的artifacts,其中配置这个项目在tomcat中的访问路径URL:http://localhost:8081/OneWebTest/index.jsp,其中OneWebTest是访问的项目,index.jsp是首页文件,然后再在Deployment中设置这个应用的访问Application context一般设置为 / 就行了。如果Deploy at the servicer startup中没有这个项目的artifacts则按+号添加。


3、创建一个mvn的javaweb项目

    地址:https://blog.csdn.net/czc9309/article/details/80304074
    直接创建一个mvn的项目,完成之后为其添加tomcat运行环境,然后与上面一样,不过有不同之处是:添加的artifacts是 ***:war这一个,另一个***:war exploded可以不添加,另外Application context:需要设置成 /*** 即可。
    遇见的问题:
        1)、当配置已经准备完成后,运行项目,发现接口调用出现404,最终问题出在xml上,不是里面的配置的问题,二十web.xml虽然是引用的classpath*:...xml,但是如果xml不放在资源文件夹下(需要将这个文件右击选择 “Mark Directory as” 然后选择资源文件),那么引用是不会成功,因此springmvc的xml文件没有被引用,导致里面扫描注解失败,最终导致接口调用不成功出现404。
        2)、返回中文乱码问题:如果直接返回一个字符串(如:“123我是谁”),并且返回的设置是:"application/json;charset=UTF-8",那么返回的则是中文乱码,但是如果返回的设置是"html/text;charset=UTF-8"那么返回的中文则不是乱码。
        3)、跨域问题暂时还未遇到,如果遇到就使用csdn中记录的操作
        4)、这个mvn项目的结构则是:src/main/java(source源码包,并不是文件夹)/controller(package),src/main/resouce(资源包resources),src/main/webapp(web的目录结构),pom.xml,这几种结构;spring和springmvc的配置文件:spring的配置文件不用操作,springmvc的配置文件添加两行即可:①(开启注释)②(扫描注解);接着即可在前端编写ajax访问后台添加的接口即可。这便是一个最小最小的springmvc项目结构。

4、创建简单的springboot项目并打包成jar部署到服务器运行

    依赖框架的选择:web、jpa(jpa默认使用hibernate作为orm实现,一般使用jpa会使用hibernate)
    构建项目之后,运行项目出现:o.s.b.d.LoggingFailureAnalysisReporter 错误,在@SpringBootApplication后面添加(exclude = {DataSourceAutoConfiguration.class})则不会报错(这是因为初始项目没有添加数据源,所以这里在注解中添加一下)。在项目中添加接口接口类(添加的这些类,必须和启动类在一个目录里面(或者在这个目录里面的文件夹中),否则就找不到),然后在浏览器输入localhost:8080/***则可访问接口。
    说明:jpa的优势:
        1)任何声明符合jpa标准的框架都遵循同样的架构,提供相同访问的api,这样保证了基于jpa开发的企业应用经过少量的修改,就能够在不同的jpa框架下运行。
        2)容器级特性的支持:支持大数据集、事务、并发等容器级事务。
        3)简单方便:简单的编程模型,jpa框架和接口也非常简单,没有太多的规则和设计模式的要求。jpa基于非侵入式原则设计 ,很容易和其他框架或容器集成。
        4)查询能力:jpa查询是面向对象而非面向数据库的,操作对象是实体,而非关系型数据库,而且能够支持批量更新和修改、join等只有sql才能够提供的高级查询特性。
        5)高级特性:能够支持面向对象的高级特性,如类之间的集成,多态和类之间的复杂关系。(这一点暂时不理解)
    1、pom中添加mysql的依赖,创建application.yml或者直接使用application.properties,在yml中配置数据源,配置jpa自动生成表。如下所示
        spring:
          datasource:
            driver-class-name: com.mysql.jdbc.Driver
            url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
            username: root
            password: 12345678
          jpa:
            hibernate:
              ddl-auto: update
            show-sql: true
            database: mysql
    2、创建实体与dao、service、controller
        1)给实体注释@Entity和表名@Table(name = "表名称")
        2)id字段,注释@Id和自增@GeneratedValue(strategy = GenerationType.IDENTITY)
        3)创建dao、dao需要实现JpaRepository这个接口,就可以直接定义接口实现sql操作了
        4)创建controller和service实现接口
        5)运行项目
        6)项目运行报错
            1、数据源问题:可以去掉上面添加的数据源了,另外mysql的驱动也需要将 com.mysql.jdbc.Driver 换成 com.mysql.cj.jdbc.Driver,因为前面的已经被弃用。
            2、mysql时区错误问题:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone:因此直接在数据库运行:set global time_zone = '+8:00' 即可。

            3、(项目名称:blog-road)某一次在一个controller中写了两个接口,这两个接口中@requestMapping或@getmapping中写的是(name =“/***”),当这样一写,则报错说已经存在了,但是如果接口只有一个,则写name=/***没有报错,而且访问路径是locahost:8080/blog-road/***,然后将其中一个name换成value=/***,没有报错,而且访问路劲可以是/blog-road/***或者是/***,但是将两个都写成value,那么访问路劲只能是:locahost:8080/***;当在controller上加上@RequestMapping(value = "/blog-road")那么访问路径则是:locahost:8080/blog-road/***,所以如果没有其他说明,最好是直接使用value来作为映射地址
    3、将springboot项目使用maven打包成jar文件,部署到Linux上运行
        1)在右侧Maven中的Lifecycle,点击clean,等待执行完成,然后点击package打包,等待执行完成后,在target中就会生成.jar文件
        2)然后将jar文件发布到服务器上
        3)执行 nohup java -jar springboottest-0.0.1-SNAPSHOT.jar >> log.out 2>&1 & 命令,使此jar文件在服务器后台执行
        nohup说明:
            nohup是不挂断的运行命令。
            语法:nohup Command [Arg..] [&]
            描述:nohup命令运行由Command参数和任何相关的Arg参数指定的命令,忽略所有挂断信号。在注销后使用nohup命令运行后台中的程序。要运行后台中的nohup命令,添加 & (表示“and”符号)到命令的尾部。
            操作系统中有三个常用的流:
            0:标准输入流 stdin
            1:标准输出流 stdout
            2:标准错误流 stderr
            一般我们用 > console.txt,实际是 1 > console.txt的省略用法;< console.txt,实际是 0 < console.txt的省略用法;
            2>&1的意思:这个意思是把标准错误(2)重定向到标准输出中(1),而标准输出又导入到文件log.out中里面了。至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。
            最后谈一下/dev/null文件的作用,这是一个无底洞,任何东西都可以定向到这里,但是却无法打开。所以一般很大的stdou和stderr当你不关心的时候可以利用stdout和stderr定向到这里>./command.sh >/dev/null 2>&1
            >>:是在文件后面追加
            >:是覆盖

5、springboot应该掌握的内容

    1)注解列表
        @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。

6、搭建springcloud+springboottest

    1)搭建springcloud,即服务中心
        1、创建一个mvn的web工程,命名为springcloudtest
        2、在该工程下面创建module(和创建springboot项目一样,不过导入的包只导入:Eureka Server即可)
        3、在启动类上面添加@EnabledEurekaServer
        4、在yml中配置如下:
            server:
              port: 8888
            eureka:
              instance:
                hostname: localhost
              client:
                register-with-eureka: false # 不向自己注册自己,表明自己是服务注册中心
                fetch-registry: false # 不需要检索服务
                # defaultZone :如果没有这个,那么服务启动将会失败(.defaultZone(都可以) 和 -defaultZone(在生产者里面就不行了),使用下面方法即可)
                service-url: 
                    defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
              server:
                enable-self-preservation: false # 关闭自我保护
                eviction-interval-timer-in-ms: 30000 #清理时间间隔,单位毫秒ms
            spring:
              application:
                name: cloud-server
        5、启动注册中心,访问http://localhost:8080即可看到服务中心
    2)创建生产者
        1、在工程下创建一个module,导入Eureka Server
        3、在启动类上添加@EnableEurekaClient,如果没有数据源则再@SpringBootApplication后面添加(exclude = {DataSourceAutoConfiguration.class})
        3、配置yml如下:
            server:
              port: 8889
            eureka:
              client:
                service-url:
                  defaultZone: http://localhost:8888/eureka/ #表示注册到这个服务中心
            spring:
              application:
                name: producer
        4、创建接口,假设接口是@GetMapping(value = "/producer/test")
    3)创建消费者
        1、在工程下创建一个module,导入Eureka Server
        2、由于该项目使用feign调用和Hystrix熔断器,则导入如下包
            如果没有1.4.4.RELEASE 启动类添加@EnableFeignClients会失败
            
                org.springframework.cloud
                spring-cloud-starter-feign
                1.4.4.RELEASE
            

            
                org.springframework.cloud
                spring-cloud-starter-netflix-hystrix
            

        3、在启动类上添加@EnableFeignClients,@EnableDiscoveryClient,如果没有数据源则再@SpringBootApplication后面添加(exclude = {DataSourceAutoConfiguration.class})(之前忘在启动类上添加@EnableFeignClients,导致服务调用不成功)
        4、创建接口(注意这是接口不是类):假设接口是@RequestMapping(value = "/consumer/test")
            创建feign类(作用是调用远程producer):类上添加:@FeignClient(value = "producer", fallback = DemoFallback.class)(producer是生产者名称,DemoFallback实现该接口的类(即如果调用失败,则返回该实现类中的响应)),方法的接口头和生产者接口头一样,@GetMapping(value = "/producer/test")。
    4)需要注意的地方:
        ①当很多模块在一个工程下,那么如果可以共用一个实体
        ②当每个模块使用单独的工程,那么就需要在每个工程上面都添加一样的实体,这样的操作很麻烦,而且非常难管理,因此可以这样做:把实体做成一个jar包,让其他工程依赖,或者把实体抽取出来,让其他工程依赖
        ③依赖关系,每个工程肯定都会有一样的依赖项,因此都可以提取出来,让他们共同依赖

7、springboot

    1、多环境配置:一个应用通常会在开发、测试、生成等环境上面运行,其中每个环境数据库地址、服务器端口等等都会不同,如果为不同环境打包,需要频繁修改配置文件,繁琐、容易出错
        在springboot中多环境配置文件名需要满足:application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:
        application-dev.properties:开发环境,假设端口1111
        application-test.properties:测试环境,假设端口2222
        application-prod.properties:生成环境,假设端口3333
        至于那个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。
        如:spring.profiels.active=test就会加载application-test.properties配置文件内容
        下面以不同环境配置不同服务端口为例:
        针对各环境新建不同的配置文件如上。
        在这三个文件中均都设置不容的server.port。
        application.properties中设置spring.profiels.active=dev就是说默认以dev环境设置。
        测试不同配置的加载:
            执行java -jar xxx.jar,可以观察到服务器端口被设置为1111,也就是默认的开发环境
            执行java -jar --spring.profiels.active=test,测试环境,正式环境也是一样。
            说明: -- 就是对 application.properties中的属性进行赋值的标识.
    2、springboot中使用@Scheduled创建定时任务
        解决的场景:我们需要定时发送一些短信、邮件之类的操作,也可能会定时的检查和监控一些标志、参数等。
        在springboot的启动类假如@EnableScheduling注解,启用定时任务的配置
        @Scheduled详解:
            @Scheduled(fixedRate = 5000):上一次开始执行时间之后5s再执行
            @Scheduled(fixedDelay = 5000):上一次执行完毕之后5s再执行
            @Scheduled(initialDelay = 1000, fixedRete = 5000):第一次延迟1s后执行,之后按fixedRate的规则5s执行一次
            @Scheduled(cron = "*/5 * * * * *"):通过cron表达式定义规则
    3、使用JavaMailSender 实现QQ邮箱发送邮件
        1、如果使用Junit4进行测试的话(spring-boot-test 在工程创建的时候,就已经依赖进来了)
            首先:配置测试环境,新建一个类,在类上添加 @RunWith(SpringRunner.class) 和 @SpringBootTest(classes = {SpringboottestApplication.class}) (SpringboottestApplication是该工程的启动类),如果提示中没有该包的引入提示,可以直接 Alt + enter键导入包。
        2、引入java发送邮件的依赖
            
                org.springframework.boot
                spring-boot-starter-mail
            

        3、yml配置:
            server:
                mail:
                host: smtp.qq.com
                username: 1099530925
                password: **** #这是授权码,这里不能用qq密码登陆
                properties:
                  mail:
                    stmp:
                      auth: true
                      starttls:
                        enable: true
                      required: true
        4、在测试类中添加:
            @Autowired
            JavaMailSender mailSender;
            然后在测试方法上添加@Test
            然后键入如下内容即可:
                SimpleMailMessage mailMessage = new SimpleMailMessage();
                mailMessage.setFrom("[email protected]");
                mailMessage.setTo("[email protected]");
                mailMessage.setSubject("简单的邮件-标题");
                mailMessage.setText("测试邮件的内容");
                mailSender.send(mailMessage);
        5、点击测试类或方法前的按钮,即可执行。或者右键选择执行。
        6、将邮件发送做到项目中,出现的一些问题:
            ①项目需要定时器,因此需要一个@Scheduled,该注解需要在类上添加@Component,另外还需要在启动类上添加@EnableScheduling开启定时器才能够完成
            ②该邮件发送中有@Component和@Autowired注解,但我将此注解注入进来的类设置成了static,造成了null指针异常。
            ③dao集成jpa的时候,使用findById必须使用Optional findById(Integer id),说明一下:Optional类是一个可以为null的容器对象,如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象
        


idea快捷键:
    alt + enter :导入包
    alt + insert :生成构造函数、getter等等方法
    ctrl + alt + v :自动补全代码

你可能感兴趣的:(idea,java后台,IDEA)