-
Java EE企业级框架:SpringBoot+MyBatisPlus(用spring boot开发web应用)
-
web前端核心框架:Vue+ElementUI(可以实现前后端分离开发)
-
公共云部署:前后端项目集成打包与部署
web技术基础
市面上的软件主要分为两种:
BS(Browser/Sever,浏览器/服务器架构模式)更火!
因此,Browser/Server模式开始流行,简称BS架构, B/S架构的主要特点是分散性高、维护方便、开发简单、共享性高、总拥有成本低。
CS(Client/Server,客户端/服务器架构模式)
C/S架构主要特点是交互性强,具有安全访问模式,网络流量低,响应速度快。
客户端负责绝大数的事情。因为客户端负责大多数业务逻辑和UI演示,所以也被称为胖客户端 ,C/S结构的软件需要针对不同的操作系统开发不同版本的软件。
随着互联网的兴起,CS架构不适合Web,最大的原因是Web应用程序的修改和升级非常迅速,而CS架构需要每个客户端逐个升级桌面App。
BS架构的原理
在BS架构下,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web页面,并把Web页面展示给用户即可。
后端开发指:web服务器开发+数据库服务器开发
maven
maven是一个项目管理工具,可以对Java项目进行自动化依赖管理和自动化的构建。
maven的功能
-
项目构建:帮我们自动下载依赖(pom.xml[核心的配置文件]),提供标准的、跨平台的自动化构建项目的方式
-
依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突
-
统一开发结果:提供标准的,统一的项目开发结构(Java代码放Java目录,测试放test目录,webapp放web的项目)
maven仓库
运行maven项目时,maven所需要的任何构件都是从本地仓库获取,如果本地仓库没有的话,它会尝试从远程仓库下载构件至本地仓库
springboot介绍(需要有Java基础)
-
Spring Boot是由Pivotal团队提供的基于Spring的全新框架,旨在简化Spring应用(有很多个pom文件)的初始搭建和开发过程。
-
Spring Boot是所有基于Spring开发项目的起点
-
Spring Boot就是尽可能地简化应用开发的门槛,让应用开发、测试、部署变得更加简单。
1. springboot特点:
-
遵循“约定优于配置”的原则,只需要很少的配置或使用默认的配置。
-
能够使用内嵌的Tomcat、Jetty服务器,不需要部署war文件;(具有内嵌的服务器)
-
提供定制化的启动器Starters,简化Maven配置,,不用写这么多依赖配置,开箱即用。
-
纯Java配置,没有代码生成,也不需要XML配置。
-
提供了生产级的服务监控方案,如安全监控、应用监控、健康检测等。
2. 创建项目————填写项目信息
-
Group:填入公司域名
-
Artifact:项目名称
package com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController//接受客户端信息并返回信息 public class HelloController { //http://www.baidu.com/s/xx //本机域名:http://localhost:8080/hello @GetMapping("/hello") public String hello() { return "Hello World!"; } } //控制器
3. 开发项目的热部署(修改代码,自动重启项目编译)
减少重启时间
-
在实际的项目开发调试过程中会频繁地修改后台类文件,导致需要重新编译重新启动,整个过程非常麻烦,影响开发效率
-
Spring Boot提供了spring-boot-devtools组件,使得无须手动重启SpringBoot应用即可重新编译、启动项目,大大缩短编译启动的时间。
-
devtools会监听classpath下的文件变动,触发Restart类加载器重新加载该类从而实现类文件和属性文件的热部署。
-
并不是所有的更改都需要重启应用(如静态资源、视图模板),可以通过设置spring.devtools.restart.exclude属性来指定一些文件或目录的修改不用重启应用
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional>> </dependency>
server.port=8080 spring.devtools.restart.enabled=true spring.devtools.restart.additional-paths=src/main/java
开发环境热部署
-
如果使用了Eclipse,那么在修改完代码并保存之后,项目将自动编译并触发重启,而如果使用了IntelliJIDEA,还需要配置项目自动编译。
-
打开Settings页面,在左边的菜单栏依次找到Build,Execution,Deployment→Compile,勾选Build project automatically按Ctrl+Shift+Alt+/快捷键调出Maintenance页面,单击Registry,勾选compiler.automake.allow.when.app.running复选框。
-
做完这两步配置之后,若开发者再次在IntelliJIDEA中修改代码,则项目会自动重启。
web入门
-
Spring Boot将传统Web开发的mvc、json、tomcat等框架整合,提供了spring-boot-starter-web组件,简化了Web应用配置。
-
创建SpringBoot项目勾选Spring Web选项后,会自动将spring-boot-starter-web组件加入到项目中。 spring-boot-starter-web启动器主要包括web、webmvc、ison、tomcat等基础依赖组件,作用是提供Web开发场景所需的所有底层依赖。
-
webmvc为Web开发的基础框架,json为JSON数据解析组件,tomcat为自带的容器依赖。
//启动器 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
1. 控制器
mvc的设计模式
view(视图)显示数据 html的页面
Model(封装、储存数据)
Controller(负责协调和控制)接受用户请求
-
Spring Boot提供了@Controller和@RestController两种注解来标识此类负责接收和处理HTTP请求。(用于创建控制器)
-
如果请求的是页面和数据,使用@Controller注解即可;如果只是请求数据则可以使用@RestController注解。
@Controller
-
示例中返回了hello页面和name的数据,在前端页面中可以通过${name}参数获取后台返回的数据并显示。
-
@Controller通常与Thymeleaf模板引擎结合使用。
@Controllerpublic class Hellocontroller { @RequestMapping("/hello") public String index(ModelMap map){ map.addAttribute( attributeName: "name", attributeValue: "zhangsan"); return "hello";//返回页面 } }
@RestController
-
默认情况下,@RestController注解会将返回的对象数据转换为JSON格式。
@RestController public class Hellocontroller { @RequestMapping(©~"/user") public User getUser(){ User user =new User(); user.setUsername("zhangsan"); user.setPassword("123"); return user; } }
2.路由映射(控制器接受前端请求)
-
@RequestMapping注解主要负责URL的路由映射。它可以添加在Controller类或者具体的方法上。
-
如果添加在Controller类上,则这个Controller中的所有路由映射都将会加上此映射规则,如果添加在方法上,则只对当前方法生效。
@RequestMapping
注解包含很多属性参数来定义HTTP的请求映射规则,常用的属性参数如下:
-
value:请求URL的路径,支持URL模板、正则表达式 (配置路径)
-
method: HTTP请求方法、规定前端请求方式
-
consumes:请求的媒体类型(Content-Type),如application/json
-
produces: 响应的媒体类型params,headers: 请求的参数及请求头的值
-
@RequestMapping的value属性用于匹配URL映射,value支持简单表达式@RequestMapping("/user")
-
@RequestMapping支持使用通配符匹配URL,用于统一映射某些URL规则类似的请求:
@RequestMapping("/getJson/*.json"), 当在浏览器中请求/getJson/a.json或者/qetJson/b.json时都会匹配到后台的Json方法
-
@RequestMapping的通配符匹配非常简单实用,支持 “*” “**“ ”?“等通配符
-
符号 * 匹配任意字符(单词),符号 ** 匹配任意路径,符号“?”匹配单个字符。
-
有通配符的优先级低于没有通配符的,比如/user/add.json比/user/*.json优先匹配。
-
有 ** 通配符的优先级低于有 * 通配符的。
-
Method匹配
-
HTTP请求Method有GET、POST、PUT、DELETE等方式。HTTP支持的全部Method
-
@RequestMapping注解提供了method参数指定请求的Method类型,包括RequestMethod.GET、RequestMethod.POST、RequestMethod.DELETE、RequestMethod.PUT等值,分别对应HTTP请求的Method
@RequestMapping(value = "/getData",method = RequestMethod.GET) public string getData(){ return "hello"; }
-
Method匹配也可以使用@GetMapping、@PostMapping等注解代替.
两种方式:
@RequestMapping(value = "/hello",method = RequestMethod.GET) @GetMapping("/hello")
3. 参数传递
-
@RequestParam将请求参数绑定到控制器的方法参数上,接收的参数来自HTTP请求体或请求url的QueryString,当请求的参数名称与Controler的业务方法参数名称一致时,@RequestParam可以省略
-
@PathVaraible:用来处理动态的URL,URL的值可以作为控制器中处理方法的参数
-
@RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据比如:
application/json
、application/xml
等类型的数据
例子:
public class HelloController { //http://www.baidu.com/s/xx //本机域名:http://localhost:8080/hello //@GetMapping("/hello") //http://localhost:8080/hello?nickname=Aloogy&phone=123 @RequestMapping(value = "/hello",method = RequestMethod.GET) public String hello(String nickname,String phone) { System.out.println(phone); return "你好"+nickname +"世界"; } }
4. apipost测试
@RequestMapping(value = "/postTest2", method = RequestMethod.POST) public String postTest2(String username,String password) { System.out.println("username:" + username); System.out.println("password:" + password); return "Post请求"; }
5. 控制类代码(controller):
package com.example.demo.controller; import com.example.demo.demos.web.User; import org.springframework.web.bind.annotation.*; @RestController public class ParamsController { @RequestMapping(value = "/getTest1", method = RequestMethod.GET) public String getTest1() { return "Get请求"; } @RequestMapping(value = "/getTest2", method = RequestMethod.GET) //http://localhost:8080/getTest2?nickname=zhangsan&phone=123456 public String getTest2(String nickname, String phone) { System.out.println("nickname:" + nickname); System.out.println("phone:" + phone); return "Get请求"; } @RequestMapping(value = "/getTest3", method = RequestMethod.GET) //http://localhost:8080/getTest2?nickname=zhangsan&phone=123456 //@RequestParam参数映射 public String getTest3(@RequestParam(value = "nickname", required = false) String nickname) { System.out.println("nickname:" + nickname); return "Get请求"; } @RequestMapping(value = "/postTest1", method = RequestMethod.POST) public String postTest1() { return "Post请求"; } @RequestMapping(value = "/postTest2", method = RequestMethod.POST) public String postTest2(String username,String password) { System.out.println("username:" + username); System.out.println("password:" + password); return "Post请求"; } @RequestMapping(value = "/postTest3", method = RequestMethod.POST) public String postTest2(User user) { System.out.println(user); return "Post请求"; } @RequestMapping(value = "/postTest4", method = RequestMethod.POST) public String postTest4(@RequestBody User user){ System.out.println(user); return "Post请求"; } }
6. 实体类代码(entity)
package com.example.demo.entity; //封装到实体类 //把接收的参数放这里 //属性的名称要一致 public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
7. 通配符请求
@GetMapping("/test/**") public String test(){ return "通配符请求"; }