5.1 spring程序与springBoot程序对比
boot程序不需要依赖tomcat和idea工具等,只需要将jar包发给前端人员,然后连接数据就行
5.2 打包运行
1.使用maven打包
2.找到jar包
3.启动程序
1.起步依赖
2.辅助功能
3.启动方式
4.换一个服务器
使用jetty:轻量级,用的东西比较少时使用,因为需要自己配置
tomcat:里面配置了很多的东西,一般使用是需要配置很多的配置项
本身是一个配置类:
@SpringBootConfiguration
当前启动类可以扫描其他的配置类:扫描范围是同包或者子包
@EnableAutoConfiguration
启动类可以扫描其他的组件,并应用:扫描范围是同包或者子包
@ComponentScan
过滤
@Filter
3.1.创建git仓库
3.2.赋值仓库的地址
3.3.在本地的仓库中克隆此仓库
正在上传…重新上传取消
3.4.克隆后,创建一个项目
3.5.创建项目后,忽略不用上传的东西
3.6.上传项目
4.1.git 常用的命令表
4.2.git 命令进行项目的上传
git status
git add *
git status
git commit -m "2022-08-16 创建spring项目"
git status
git push origin master
5.1.maven仓库(Jar仓库)
远程jar仓库
本地jar仓库:
依赖的三要素:groupId、artifactId、version
maven软件读取项目pom.xml文件,根据依赖,从远处仓库下载依赖到本地仓库
项目依赖本地仓库,根据三要素 在本地仓库寻找响应的依赖包
clean: 清除target
cleaninstall:清除,安装时将项目打成jar包,打包的位置是本地仓库和target
-D maven -test.skap :在安装时
5.2.代码仓库
远程的代码仓库:gitee
本地代码仓库:repository_git(防止项目的代码文件夹)/仓库的文件夹/项目的文件夹
1.1定义
REST(Representational State Tranfer),表示形式转换,也就是访问网络资源的格式。
http://localhost/user/getuserId?id=1 http://localhost/user/saveUser
http://localhost/user/1 http://localhost/user
1.2.REST风格的行为
路径+请求方式=行为
使用RESTful进行开发
spring支持的8种提交方式
2.1 修改删除增加
2.2 设定参数请求参数(路径变量)
2.3 注解格式
1.@RequestMapping
2.@PathVariable
2.4 接收参数的注解区别
简化代码
3.1.提出公共路径和@ResonseBody注解
在类上提出到类上,@ResponseBody也是提出来写到类的上方,表示类中所有的方法都可以引用。
但是由@controller和@ResonseBody一起的,所以可以用他们的共讨那个父类,替换两者,父类是@RestController
3.2 简化method
- @RestController
- @RequestMapping("/book")
- public class UserController {
-
- // @RequestMapping(method = RequestMethod.POST)
- @PostMapping
- public String save(@RequestBody Book book){
- System.out.println("user save。。。。。"+book);
- return "{'module','spring mvc'}";
- }
-
- // @RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
- @DeleteMapping("/{id}")
- public String delete(@PathVariable Integer id){
- System.out.println("user del "+id);
- return "{'module','spring mvc'}";
- }
-
- }
3.3 简化的注解两个
1.@RestController
2.请求方式的注解
/**
* 方法的描述:/test/helloworld
* 参数列表: get
* 返回值说明: string
* @return
*/
- java -jar *.jar || java -jar *.war;
- java -jar ***.jar --server.port=9090 ---- 设置端口;
- java -jar ***.jar --spring.profiles.active=dev ---- 设置环境;
- java -jar ***.jar --spring.config.location=/opt/config/application.properties ---- 指定外部配置文件;
- 内置:Jar 包 ---- 执行 Main 方法 ---- 启动 IOC ---- 启动 Servlet 容器;
- 外置:War 包 ---- 启动 Servlet 容器 ---- 执行 Main 方法 ---- 启动 IOC;
问题:
解决方案:
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-tomcatartifactId>
- <scope>providedscope>
- dependency>
- @SpringBootApplication
- public class JavaSpringBootApplication extends SpringBootServletInitializer {
- @Override
- protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
- return builder.sources(JavaSpringBootApplication.class);
- }
- public static void main(String[] args) {
- SpringApplication.run(JavaSpringBootApplication.class, args);
- }
- }
- @SpringBootApplication
- public class JavaSpringBootApplication extends SpringBootServletInitializer {
-
- @Override
-
- protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
-
- return builder.sources(JavaSpringBootApplication.class); }
-
- public static void main(String[] args) {
-
- // SpringApplication.run(JavaSpringBootApplication.class, args);
-
- SpringApplication springApplication = new SpringApplication(JavaSpringBootApplication.class);
-
- springApplication.setBannerMode(Banner.Mode.OFF);
-
- springApplication.run(args);
-
- }
-
- }
ASCII ----单字节编码0-127 ,键盘上
Iso8859-1 ------单字节
GBK ----
因为太多的编码格式出现乱码,所以使用
unicode -----多字节定长编码,也会出现异常
utf-8 -----多字节变长编码
所以在配置application时就不要使用中文
此时生效是application.properties文件中配置的接口生效
此时放在src/main/resources/config 下 的配置文件生效。
重点:
使用 @Value 注解读取配置文件属性,注意 key 命名不能用 com.thornBird 驼峰法命名,需用.或者-间隔;
- server.port=80
-
- # for test
- com.sfac.name=eternity
- com.sfac.age=18
- com.sfac.desc=${com.sfac.name}----${com.sfac.age}
- com.sfac.random=${random.uuid}
- @Controller
- public class TestController {
-
- @Value("${com.sfac.name}")
- private String name;
-
- @Value("${com.sfac.age}")
- private int age;
-
- @Value("${com.sfac.desc}")
- private String desc;
-
- @Value("${com.sfac.random}")
- private String random;
-
- /**
- * localhost
- * /test/config
- * get
- * @return
- */
- @GetMapping(value = "/test/config")
- @ResponseBody
- public String configTest(){
- StringBuffer sb = new StringBuffer();
- sb.append(name).append("---")
- .append(age).append("---")
- .append(desc).append("---")
- .append(random).append("---").append("");
- return sb.toString();
- }
- }
接下来测试,启动项目访问接口:http://127.0.0.1/test/config
- # for test
- org.sfac.name=eternity1
- org.sfac.age=19
- org.sfac.desc=${com.sfac.name}----${com.sfac.age}
- org.sfac.random=${random.uuid}
- @Component
- @PropertySource(value = "classpath:config/applicationTest.properties")
-
- //这时的classpath是指在target的地方的路径
-
- public class ApplicationTest {
- @Value("${org.sfac.name}")
- private String name;
-
- @Value("${org.sfac.age}")
- private int age;
-
- @Value("${org.sfac.desc}")
- private String desc;
-
- @Value("${org.sfac.random}")
- private String random;
-
- public String getName() {
- return name;
- }
- 生成他们的set与get方法自己生成,此处省略
-
- }
- @Controller
- public class TestController {
-
- //注入ApplicationTest这个bean
-
- @Autowired
- private ApplicationTest applicationTest;
-
-
-
- /**
- * 方法的描述:/test/helloworld
- * 参数列表: get
- * 返回值说明: string
- * @return String
- */
- @GetMapping(value = "/test/helloworld")
- @ResponseBody
- public String HelloWorld(){
- return "Hello World";
- }
-
- /**
- * localhost
- * /test/config
- * get
- * @return
- */
- @GetMapping(value = "/test/config")
- @ResponseBody
- public String configTest(){
- StringBuffer sb = new StringBuffer();
- sb.append(
- applicationTest.getName()).append("---")
- .append(applicationTest.getAge()).append("---")
- .append(applicationTest.getDesc()).append("---")
- .append(applicationTest.getRandom());
- return sb.toString();
- }
启动项目访问接口:http://127.0.0.1/test/config
- "1.0" encoding="UTF-8"?>
-
- <configuration debug="false" scan="true" scanPeriod="30 seconds">
-
-
- <property name="env" value="dev"/>
- <property name="project" value="java_spring_boot"/>
- <property name="root" value="/var/log"/>
- <property name="fileSize" value="50MB"/>
- <property name="maxHistory" value="100"/>
- <timestamp key="dateTime" datePattern="yyyy-MM-dd HH:mm:ss"/>
- <property name="pattern" value="%d{${dateTime}} %-5level %logger{36} -- %msg%n"/>
-
-
- <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
- <encoder charset="utf-8">
- <pattern>${pattern}pattern>
- encoder>
- appender>
-
-
- <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <encoder charset="utf-8">
- <pattern>${pattern}pattern>
- encoder>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>${root}/${project}_${env}_%d.%i.logfileNamePattern>
- <maxHistory>${maxHistory}maxHistory>
- <timeBasedFileNamingAndTriggeringPolicy
- class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
- <maxFileSize>${fileSize}maxFileSize>
- timeBasedFileNamingAndTriggeringPolicy>
- rollingPolicy>
- appender>
-
- <Logger name="org.springframework" level="INFO" additivity="false">
- <appender-ref ref="console"/>
- <appender-ref ref="file"/>
- Logger>
-
- <root level="DEBUG">
- <appender-ref ref="console"/>
- <appender-ref ref="file"/>
- root>
- configuration>
- #for log
- logging.config=classpath:config/logback.xml
- @Controller
- public class TestController {
-
- private final static Logger LOGGER = LoggerFactory.getLogger(TestController.class);
-
- // LOGGER 的构造方法参数是 Class,是根据类的结构来进行区分日志,所以一个类只要一个 LOGGER,故 static
- // final 表示一种编程习惯,表示该类的 LOGGER 只是记录该类的信息,否则日志会无法提供可以令人信服的记录
- // final 不可变,读取速度快
- // static 静态,只创建一次,节省空间
-
-
- @RequestMapping(value = "/test/log")
- @ResponseBody
- public String logTest(){
- LOGGER.trace("This is trace loger");
- LOGGER.debug("This is debug loger");
- LOGGER.info("This is info loger");
- LOGGER.warn("This is warn loger");
- LOGGER.error("This is error loger");
-
- return "Log Test!";
- }
- }
YAML(YAML Ain`t Markup Language) ,一种数据序列号格式
优点:
YAML文件的扩展名:
#配置端口号 server: port: 82 # 配置日志 logging: level: root:info #数组数据 likes: - music - geme - run
这种方式是框架内部使用多
如果在自动装配时出现警告,加入一下坐标到pom.xml文件中
- #设置启动的环境
- spring:
- profiles:
- active: div
-
- ---
- #开发
- spring:
- profiles: dev
- server:
- port: 80
- #开发
- spring:
- config:
- activate:
- on-profile: dev
- server:
- port: 80
打包前先去clean一下。要注意备份配置文件。
带参数启动springBoot
maven中和springBoot中的配置环境谁起作用,启动jar包的话,执行package的指令后,maven的profile起主导作用,springBoot 的profile是打包时的工具
maven为主,springBoot为辅。
简介:在实际开发过程中,每次修改代码就得重启项目,对于一些大型应用来说,需要花费大量的时间成本,在 Java 开发领域,热部署一直是一个难以解决的问题,目前的 Java 虚拟机只能实现方法体的修改热部署,对于整个类的结构修改,仍然需要重启虚拟机,我们采用 Devtools 工具包完成热部署,操作简单,每次变更代码自动重启项目;
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-devtoolsartifactId>
- dependency>
- dev tools
- #热部署生效
- spring.devtools.restart.enabled=true
- #设置重启的目录
- spring.devtools.restart.additional-paths=src/main/java
自建证书、创建配置类、配置连接器、并将连接器注入容器中
静态资源配置
是将本地的静态文件映射给系统的一个路径
1.在全局配置中配置
- #for port
- server.port=443
- server.http.port=80
-
- #for ssl 认证
- server.ssl.key-store=classpath:.keystore
- server.ssl.key-store-password=123456
2.访问资源
- https://127.0.0.1:80/test/log
- https://127.0.0.1:443/test/log
- 出现不安全的提示,就表示测试成功
keytool -genkey -alias tomcat -keyalg RSA 创建别名为 tomcat 的一条证书,指定使用 RSA 算法, 生成文件 C:\Users\XXX\.keystore; 如果该目录已经有了 .keystore,创建不成功,删除后再次创建;
keytool -genkey -alias tomcat -keyalg RSA
- server.ssl.key-store=classpath:.keystore
- server.ssl.key-store-password=123456
- server.port=443
- server.http.port=80
- @Configuration
- @AutoConfigureAfter({WebMvcAutoConfiguration.class})
- public class WebMvcConfig {
- @Value("${server.http.port}")
- private int httpPort;
-
-
- @Bean
- public Connector connector(){
- Connector connector = new Connector();
- connector.setPort(httpPort);
- connector.setScheme("http");
- return connector;
- }
-
- @Bean
- public ServletWebServerFactory servletWebServerFactory(){
- TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
- factory.addAdditionalTomcatConnectors(connector());
- return factory;
- }
- }
访问路径: 127.0.0.1/springboot_static_repo/2.png
上传图片----写道绝对路径地址---的那会url的路径地址(/static/1.jpg)--通过映射路径地址和文件相对路径拼接。/static/** + 1.jpg
1.映射路径地址前缀 /static/
2.映射路径 /static/**
3.Windows系统本地绝对路径地址
4.Linux系统本地绝对路径地址
- #for static resource
- spring.resource.path=/static/
- spring.resource.pathPattern=/static/**
- spring.resource.window.path=D:/repository/springboot_static_repo/
- spring.resource.linux.path=/static/
- @Component
- public class ResourceConfigBean {
- @Value("${spring.resource.path}")
- private String resourcepath;
-
- @Value("${spring.resource.pathPattern}")
- private String resourcepathPattern;
-
- @Value("${spring.resource.window.path}")
- private String localPathForWin;
-
- @Value("${spring.resource.linux.path}")
- private String localPathForLin;
-
- set和get方法
- }
- @Configuration
- @AutoConfigureAfter({WebMvcAutoConfiguration.class})
- public class WebMvcConfig implements WebMvcConfigurer {
-
-
- @Autowired
- private ResourceConfigBean resourceConfigBean;
-
-
- @Override
- public void addResourceHandlers(ResourceHandlerRegistry registry) {
- //将本地的文件夹映射给系统一个相对的路径
- // 提供了一个注册器,注册一个文件夹为系统的一个路径,把本地的路径映射给系统的一个相对路径
- String osname = System.getProperty("os.name");
- if (osname.toLowerCase().startsWith("win")){
- registry.addResourceHandler(resourceConfigBean.getResourcepathPattern())
- .addResourceLocations(ResourceUtils.FILE_URL_PREFIX+resourceConfigBean.getLocalPathForWin());
-
- }else {
- registry.addResourceHandler(resourceConfigBean.getResourcepathPattern())
- .addResourceLocations(ResourceUtils.FILE_URL_PREFIX+resourceConfigBean.getLocalPathForLin());
- }
- }
- }
首先知道同源和跨域是什么?
同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。它是一个安全策略。所有支持JavaScript的浏览器都会使用这个策略
满足同源的三个条件:
所谓同源是指,域名、协议、端口相同。
跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
注意:跨域限制访问,其实是浏览器的限制
1.页面:访问不同源的东西
2.后端:在配置类中去实现接口的方法,设置所有的源
- @Override
- public void addCorsMappings(CorsRegistry registry) {
- registry.addMapping("/**")
- .allowedOrigins("*")
- .allowedOriginPatterns("*")
- .allowedMethods("*")
- .maxAge(3600);
- }
我会继续更新,有需要完整版笔记的猿猿可以在点击下面的地址在语雀app中去获取哟:
语雀:
https://www.yuque.com/docs/share/10a4736b-ac41-41d3-961a-273c4cb6c6c7?# 《springBoot阶段学习》密码:ggc4