赞
踩
我们将学习如何快速的创建一个Spring Boot应用,并且实现一个简单的Http请求处理。通过这个例子对Spring Boot有一个初步的了解,并体验其结构简单、开发快速的特性。
我的环境准备:
开发工具:
Maven是一个项目管理工具,可以对Java项目进行自动化的构建和依赖管理。
Spring Initializr (springboot.io)
项目结构分析:
通过上面步骤完成了基础项目的创建。就会自动生成以下文件。
1、程序的主启动类
2、一个 application.properties 配置文件
3、一个 测试类
4、一个 pom.xml
运行:
java -jar demo-0.0.1-SNAPSHOT.jar
1.在pom.xml配置文件中添加dev-tools依赖。
使用optional=true表示依赖不会传递,即该项目依赖devtools;其他项目如
果引入此项目生成的JAR包,则不会包含devtools
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
重新加载pom.xml
2.在application.propertiest中配置devtools。
在spring\src\main\resources\application.properties
#热部署生放
spring.devtools.restart.enabled=true
#设置重启目录
spring.devtools.restart.additional-paths=src/main/java
#设置classpath目录下WEB-INF文件夹内容修改不重启
spring.devtools.restart.exclude=static/**
3.
如果使用了Eclipse,那么在修改完代码并保存之后,项目将自动编译并触发重启,而如果使用了Intelli)DEA,还需要配置项目自动编译。
打开SettingsI页面,在左边的菜单栏依次找到Build,Execution,Deployment-Compile,Build project automatically
按Ctrl+Shift-+Alt+/快捷键调出Maintenance页面,单击Registry,勾选compiler..automake.allow.when.app.running复选框。
做完这两步配置之后,若开发者再次在Intelli)IDEA中修改代码,则项目会自动重启。
21版本的idea没有这个选项要去settings里找到 Advansed Settings勾选Allow auto-make那个选项就可以了
在demo目录新建一个软件包,新建一个hello.java
- package com.example.demo.hello;
-
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- @RestController
- public class hello {
-
- // http://localhost:8080/hello
- @RequestMapping("/hello")
- public String hello() {
- StringBuffer s = new StringBuffer();
- for (int i = 0; i < 100; i++) {
- s.append(i+"<br>");
-
- }
- return s.toString();
- }
- }
运行demo类,打开localhost:8080访问
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring Boot提供了@Controller和@RestController两种注解来标识此类负责接收和处理HTTP请求。
如果请求的是页面和数据,使用@Controller注解即可;如果只是请求数据,则可以使用@RestController注解。
因为采用前后端分离,通常不使用
示例中返回了hello页面和name的数据,在前端页面中可以通过${name}参数获取后台返回的数据并显示。
@Controlleri通常与Thymeleaf模板引擎结合使用。
- @Controller
- public class HelloController{
- aRequestMapping("/hello")
- public String index(ModelMap map){
- map.addAttribute(attributeName:"name",attributeValue:"zhangsan");
- return "hello";
- }}
-
- 返回hello文本
默认情况下,@RestControllery注解会将返回的对象数据转换为SON格式。
- @Restcontroller
- public class HelloController{
- @RequestMapping("/user")
- public dser getUser(){
- User user new User();
- user.setUsername("zhangsan");
- user.setPassword("123");
- return user;
- }}
HTTP请求Method有GET、POST、PUT、DELETE等方式。HTTP支持的全部Method
@RequestMapping注解提供了method参数指定请求的Method类型,包括RequestMethod.GET、RequestMethod.POST、RequestMethod.DELETE、RequestMethod.PUT等值,分别对应HTTP请求的Method
- @RequestMapping(value = "/hello2",method = RequestMethod.GET)
- 等价 @GetMapping("/hello2")
- public String hello2() {
- return "hello2";
- }
Methodl匹配也可以使用@GetMapping、@PostMapping等注解代替。
名称要保持一致
- @GetMapping("/get")
- public String get(String a, String b) {
- return "get"+a+b;
- }
-
- http://localhost:8080/get?a=1
- get1null
- http://localhost:8080/get?a=1&b=2
- get12
网站(参数)映射
- @GetMapping("/get1")
- public String get1(@RequestParam(value = "sname") String name) {
- return "get"+name;
- }
- 默认:必须的
- http://localhost:8080/get1?sname=1
- get1
- http://localhost:8080/get1?name=17
- Whitelabel Error Page
-
- 设置可选
- @GetMapping("/get1")
- public String get1(@RequestParam(value = "sname",required = false) String name) {
- return "get"+name;
- }
- 再访问
- getnull
POST请求
- @PostMapping("/post1")
- public String post1() {
- return "post1";
- }
- @PostMapping("/post2")
- public String post2(String s1,String s2) {
- return "post1"+s1+s2;
- }
可以访问,不带数据,放在网页也可以放在body里:http://localhost:8080/post2?s1=a2&s2=222
属性的名称前后端一致,使用类接收
- @PostMapping("/post3")
- public String post3(Uesr uesr) {
- return uesr.toString();
- }
-
- package com.example.demo.hello;
-
- public class Uesr {
- String name;
- int age;
- ......
- }
接收json数据,@RequestBody,类的名称需要和json数据的名称一致,类型也需要一致
- @PostMapping("/post4")
- public String post4(@RequestBody Uesr uesr) {
- return uesr.toString();
- }
-
- 发送 {
- "name":"'s1'",
- "age":222
- }
通配符
- @GetMapping("test/**")
- public String test(){
- return "通配符请求";
- }
- http://localhost:8080/test/afds
- 接收单个字符(单词)
- @GetMapping("test/*")
- public String test(){
- return "通配符请求";
- }
- http://localhost:8080/test/afds 不可以
- http://localhost:8080/test 可以
使用lDEA创建Spring Boot项目,会默认创建出classpath:/static/目录,静态资源一般放在这个目录下即可。(如果前后端分离,static一般不存放东西)
如果默认的静态资源过滤策略不能满足开发需求,也可以自定义静态资源过滤策略。
在application.properties中直接定义过滤规侧和静态资源位置:
spring.mvc.static-path-pattern=/static/**
spring.web.resources.static-locations=classpath:/static/
过滤规则为/static,/*,静态资源位置为classpath:/static/
图片放在static\images,通过localhost:8080/images/v2.jpg访问
设置网站前缀:(application.properties)
spring.mvc.static-path-pattern=/i/**
访问:localhost:8080/i/images/v2.jpg
自定义静态文件目录
spring.web.resources.static-locations=classpath:/css
表单的enctype属性规定在发送到服务器之前应该如何对表单数据进行编码。
当表单的enctype:="application/x-www-form-urlencoded"(默认)时,form表单中的数据格式为:key=value&key=value
当表单的enctype="multipart/form-data"时,其传输数据形式如下
Spring Boot.工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。
要更改这个默认值需要在配置文件(如application.properties)中加入两个配置
- spring.servlet.multipart.max-request-size=100MB
- spring.servlet.multipart.max-file-size=100MB
当表单的enctype="multipart/form-data"时,可以使用MultipartFile获取上传的文件数据,再通过transferTo方法将其写入到磁盘中
- @PostMapping("/upload")
- public String up(String name, MultipartFile photo, HttpServletRequest request) {
- System.out.println(name);
- // 获取名称
- // System.out.println(photo.getName());
- // 获取文件名
- System.out.println(photo.getOriginalFilename());
- // 获取文件名
- String path=request.getServletContext().getRealPath("/upload/");
- System.out.println(path);
- System.out.println(request.getServletContext());
-
- return "上传成功:"+name;
- }
- s1
- photo
- QQ图片.jpg
- C:\Users\xxx\upload\
- org.apache.catalina.core.ApplicationContextFacade@7628b901
-
- public void savefile(String path, MultipartFile photo) throws IOException {
- File dir = new File(path);
- // 判断存储的目录是否存在,如果不存在则创建
- if(!dir.exists()){
- dir.mkdirs();
- // 创建目录
- }
- File file = new File(path + photo.getOriginalFilename());
- photo.transferTo(file);
spring.web.resources.static-locations=/upload/
设置网站资源目录
通过:localhost:8080/i/QQ.jpg 访问
拦截器定义
/*
在请求处理之前进行调用(Controller方法调用之前)
*/
- package com.example.demo.interceptor;
- public class login implements HandlerInterceptor {
-
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- System.out.println("判断");
-
- return true;
- }}
拦截器注册
addPathPatterns方法定义拦截的地址
excludePathPatterns定义排除某些地址不被拦截
添加的一个拦截器没有addPathPattern任何一个url则默认拦截所有请求
如果没有excludePathPatterns任何一个请求,则默认不放过任何一个请求。
- package com.example.demo.config;
-
- @Configuration
- public class webconfig implements WebMvcConfigurer {
-
- @Override
- public void addInterceptors(InterceptorRegistry registry){
- // registry.addInterceptor(new login()); //全部拦截
- registry.addInterceptor(new login()).addPathPatterns("/user/**");
- }
- }
RESTful是目前流行的互联网软件服务架构设计风格。
REST(Representational State Transfer,表述性状态转移)一词是由RoyThomas Fielding在2000年的博士论文中提出的,它定义了互联网软件服务的架构原则,如果一个架构符合REST原则,则称之为RESTfu架构。
REST并不是一个标准,它更像一组客户端和服务端交互时的架构理念和设计原则,基于这种架构理念和设计原则的Veb API更加简洁,更有层次。
每一个UR代表一种资源
客户端使用GET、POST、PUT、DELETE四种表示操作方式的动词对服务端资源进行操作:GET用于获取资源,POST用于新建资源(也可以用于更新资源)PUT用于更新资源,DELETE用于删除资源。
通过操作资源的表现形式来实现服务端请求操作。
资源的表现形式是SON或者HTML。
客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都包含必需的信息。
符合RESTful规范的Web API需要具备如下两个关键特性:
安全性:安全的方法被期望不会产生任何副作用,当我们使用GET操作获取资源时,不会引起资源本身的改变,也不会引起服务器状态的改变。
幂等性:幂等的方法保证了重复进行一个请求和一次请求的效果相同(并不是指响应总是相同的,而是指服务器上资源的状态从第一次请求后就不再改变了),在数学上幂等性是指N次变换和一次变换相同。
HTTP提供了POST、GET、PUT、DELETE等操作类型对某个Web资源进行Create、Read、Update和Delete操作。
一个HTTP请求除了利用URI标志目标资源之外,还需要通过HTTP Method指定针对该资源的操作类型,一些常见的HTTP方法及其在RESTfu风格下的使用:
HTTP状态码就是服务向用户返回的状态码和提示信息,客户端的每一次请求,服务都必须给出回应,回应包括HTTP状态码和数据两部分。
HTTP定义了40个标准状态码,可用于传达客户端请求的结果。状态码分为以下5个类别:
1xx:信息,通信传输协议级信息
2xx:成功,表示客户端的请求已成功接受
3xx:重定向,表示客户端必须执行一些其他操作才能完成其请求
4xx:客户端错误,此类错误状态码指向客户端
5xx:服务器错误,服务器负责这写错误状态码
在RESTful架构中,每个网址代表一种资源,所以URI中建议不要包含动词,只包含名词即可,而且所用的名词往往与数据库的表格名对应。
用户管理模块AP示例:
- package com.example.demo.hello;
-
- import org.springframework.web.bind.annotation.*;
-
- @RestController
- public class restapi {
- @GetMapping("/uesr/{id}")
- public String getuesrid(@PathVariable int id) {
- return "添加用户:" + id;
- }
-
- @PostMapping("/user")
- public String save(Uesr user) {
- return "添加用户";
- }
-
- @PutMapping("/user")
- public String update(Uesr user) {
- return "更新用户";
- }
-
- @DeleteMapping("/user/{id}")
- public String deleteById(@PathVariable int id) {
- System.out.println(id);
- return "根据ID删除用户";
- }
-
- }
Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTfulJ风格的Web服务,是非常流行的API表达工具。
Swagger能够自动生成完善的RESTful API文档,,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。
在Spring Boot项目中集成Swaggerl同样非常简单,只需在项目中引入springfox-swagger2和springfox-swagger--ui依赖即可。
注意事项
Spring Boot2.6.X后与Swagger有版本冲突问题,需要在application.propertiest中加入以下配置:
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
- <dependency>
- <groupId>io.springfox</groupId>
- <artifactId>springfox-swagger2</artifactId>
- <version>3.0.0</version>
- </dependency>
- <dependency>
- <groupId>io.springfox</groupId>
- <artifactId>springfox-swagger-ui</artifactId>
- <version>3.0.0</version>
- </dependency>
- <dependency>
- <groupId>org.springdoc</groupId>
- <artifactId>springdoc-openapi-ui</artifactId>
- <version>1.6.4</version>
- </dependency>
-
- 访问http://127.0.0.1:8080/swagger-ui
启动项目访问http://127.0.0.1:8080/swagger-ui.html,即可打开自动生成的可视化测试页面
在Swagger2添加注释
常用注解
Swagger提供了一系列注解来描述接口信息,包括接口说明、请求方法、请求
参数、返回信息等
ORM(Object Relational Mapping,对象关系映射)是为了解决面向对象与关系数据库存在的互不匹配现象的一种技术。
ORM通过使用描述对象和数据库之间映射的元数据将程序中的对象自动持久化到关系数据库中。
ORM框架的本质是简化编程中操作数据库的编码。
MyBatis-Plus介绍
MyBatis,是一款优秀的数据持久层ORM框架,被广泛地应用于应用系统。
MyBatis能够非常灵活地实现动态SQL,可以使用XML或注解来配置和映射原生信息,能够轻松地将ava的POO(Plain Ordinary Java Object,普通的Java对象)与数据库中的表和字段进行映射关联。
MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上做了增强,简化了开发。
添加依赖
- <!-- MyBatisPlus依赖-->
-
- <dependency>
- <groupId>com.baomidou</groupId>
- <artifactId>mybatis-plus-boot-starter</artifactId>
- <version>3.4.2</version>
-
- </dependency>
-
- <!-- mysql 依赖 -->
-
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.47</version>
-
- </dependency>
-
- <!-- 数据连接池 druid -->
-
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>druid-spring-boot-starter</artifactId>
- <version>1.1.20</version>
- </dependency>
全局配置
配置数据库相关信息
- spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
- spring.datasource.driver-class-name=com.mysql.jdbc.Driver
- spring.datasource.url=jdbc:mysql://localhost:3306/test1?useSSL=false
- spring.datasource.username=root
- spring.datasource.password=root
- mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
添加@MapperScan 注解
- @SpringBootApplication
- @MapperScan("com.xx.mapper")
- public class MybatisplusDemoApplication {
- public static void main(string[] args) {
- SpringApplication.run(MybatisplusDemoApplication.class, args);
-
- }}
数据库操作:mapper包下
在DemoApplication新建@MapperScan("com.example.demo.mapper")
entity(实体)
自动转化json
- @GetMapping("/student")
- public List querystudent() {
- List<student> list = studentmapper1.find();
- System.out.println(list);
- return list;
- }
- 增加:
- studentmapper:
- @Insert("insert into student value(null,#{name},#{xuehao},#{shuxue},#{yingyu},#{suanfa},#{caozuo})")
- public int insert(student student1);
-
- @PostMapping("/student")
- public int querystudent(student student1) {
- int r=studentmapper1.insert(student1);
- System.out.println(student1);
- return r;
- }
简化mapper,类的名字和表的名字一致
- @Mapper
- public interface studentmapper extends BaseMapper<student> {
- //查询所有用户
- // @Select("select * from student")
- // public List<student> find();
- //
- // @Insert("insert into student value(null,#{name},#{xuehao},#{shuxue},#{yingyu},#{suanfa},#{caozuo})")
- // public int insert(student student1);
- 注意数据库的名称一定和类名相同
- }
find需要修改,insert还可以用
- // List<student> list = studentmapper1.find();
- List<student> list = studentmapper1.selectList(null);//条件
当类名与表名不一致,修改:
@TableName("student1")
设置主键自增,post插入时可以不加id的值
@TableId(type = IdType.AUTO)
实现复杂关系映射,可以使用@Results注解,@Result注解,@One注解,@Many注解组合完成复杂关系的配置。
编写配置文件
7.MybatisPlus多表查询及分页查询_哔哩哔哩_bilibili
Vue(读音/vju:/,类似于view)是一套用于构建用户界面的渐进式框架。
Vue.js提供了MVM数据绑定和一个可组合的组件系统,具有简单、灵活的APl。
MVVM模式
MVVM是Model-View-ViewModel的缩写,它是一种基于前端开发的架构模式,其核心是提供对View和ViewModel的双向数据绑定。
Vue提供了MVVM风格的双向数据绑定,核心是MVVM中的VM,也就是ViewModel,ViewModel负责连接View和Model,保证视图和数据的一致性。
<script src="https://unpkg.com/vue@next"></script>
在页面中声明一个将要被vue所控制的DOM区域,既MVVM中的View
- <div id="app">
- {{ message }}
- </div>
创建vm 实例对象(vue 实例对象)
- const hello = {
- //指定数据源,既MVVM中的Mode1
- data: function()
- {
- return {
- message: 'Hello Vue!'
- }}
- {
- const app =Vue.createApp(hello)
- app.mount('#app')//指定当前vue实例要控制页面的哪个区域
- 字符串模板:
- <p>{{url1}}</p>
- 指令,html渲染:
- <p v-html="url1"></p>
-
- <a href="baidu.com">百度</a>
- 百度
属性绑定指令
- <a :href="url1">链接</a>
- <input type="text" :placeholder="tishi"><br>
- <img :src="url1" :style="{width:w}">
-
- return {
- url1:"https://random-picture.vercel.app/api",
- tishi:"随机图片",
- w:"500px",
- }
使用JavaScript表达式
- <div id="app">
- <p >{{number +10 }}</p>
- <p >{{ok ? 1 : 0 }}</p>
- <p >{{message.split('').reverse().join('、') }}</p>
- <p :id="'list'+id" ></p>
- <p>{{user.id}}</p>
-
- number:1,
- ok:1,
- message:"1234",
- id:3,
- user:{
- id:1,
事件绑定渲染
- <p >number:{{number}}</p>
- <button v-on:click="add">+10</button>
- <button @click="add">+10</button>
- <button @click="number+=1">+1</button>
-
- data() {
- return {
- number:1,
- }
- },
- methods:{
- add(){
- this.number+=10;
- }
- }
条件渲染:
- <div id="app">
- <button @click="flag=!flag">点击</button>
- <p v-if="flag">显示</p>
- <p v-show="flag">显示</p>
- </div>
- flag:true,
-
- <p v-if="num>0.5">随机数>0.5</p>
- <p v-else>随机数《0.5</p>
- <p>{{num}}</p>
- <p v-if="dengji=='A'">A</p>
- <p v-else-if="dengji=='B'">B</p>
- flag:true,
- num:Math.random(),
- dengji:"A",
列表循环
- <div id="app">
- 元素+索引
- <ul>
- <li v-for="(user,index) in userlist">
- 索引{{index}},name={{user.name}}
- </li>
- </ul>
- 元素
- <ul>
- <li v-for="user in userlist">
- name={{user.name}}
- </li>
- </ul>
- </div>
-
- userlist:[{id: 1, name: 11},{id: 2, name: 22},{id: 3, name: 33}]
key,保证列表唯一
- <div id="app">
- <input type="text" v-model="name"><button @click="add">添加</button>
- <ul>
- <li v-for="(user,index) in userlist">
- <input type="checkbox">索引{{index}},name={{user.name}}
- </li>
- </ul>
- </div>
- <script>
- Vue.createApp({
- data() {
- return {
- userlist:[{id: 1, name: 11},{id: 2, name: 22},{id: 3, name: 33}],
- newid:4,
- name:"",
- }
- },
- methods: {
- add(){
- this.userlist.push({id: this.newid, name: this.name})
- name=""
- }
- }
- }).mount('#app')
- </script>
NPM简介
NPM(Node Package Manager)是一个NodeJS包管理和分发工具.
NPM以其优秀的依赖管理机制和庞大的用户群体,目前已经发展成为整个S领域的依赖管理工具
NPM最常见的用法就是用于安装和更新依赖。要使用NPM,首先要安装Node工具。
NodeJS安装
Node,js是一个基于Chrome Va8引擎的avaScript运行时环境。
Node中包含了NPM包管理工具。
下载地址:https://nodejs.org/zh-cn/
NPM使用
Vue CLI使用
Vue CLI是Vue官方提供的构建工具,通常称为脚手架。
用于快速搭建一个带有热重载(在代码修改后不必刷新页面即可呈现修改后的效果)及构建生产版本等功能的单页面应用。
Vue CLI基于webpack构建,也可以通过项目内的配置文件进行配置。
安装:npm install-g@vue/cli
组件的构成
Vue中规定组件的后缀名是.vue
每个.vue组件都由3部分构成,分别是
template,组件的模板结构,可以包含HTML标签及其他的组件
script,组件的JavaScript代码
style,组件的样式
- <template>
- <app1></app1>
- </template>
-
- <script>
- import app1 from './components/test/app1'
-
- export default {
- name: 'App',
- components: {
- app1,
- }
- }
- </script>
组件间的传值
组件可以由内部的Data提供数据,也可以由父组件通过prop的方式传值。
兄弟组件之间可以通过Vuex等统一数据源提供数据共享。
常用工具
https://start.springboot.io/
参考资料
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。