Nginx
Nginx是一个Web服务器
在Nginx安装目录下,包含一下文件目录结构:
Nginx
└───conf
└───contrib
└───docs
└───html
└───logs
└───temp
│ nginx.exe
conf:服务器配置
html:存放前端网页静态资源,index.html为入口文件
nginx.exe:启动服务器,Nginx服务器默认占用80端口。如果想切换端口,去 conf/nginx.conf 文件中的 http 里面的 server 中的listen切换,把80改成其他端口号
maven
maven是一个项目管理工具,可以对Java项目进行构建、依赖管理等
在Nginx安装目录下,包含一下文件目录结构:
maven
└───bin
└───boot
└───conf
└───lib
│ LICENSE
│ NOTICE
│ README.txt
bin:存放可执行文件
conf:存放maven的配置文件
lib:存放maven依赖的jar包
安装
配置本地仓库:修改 conf/settings.xml 中的 <localRepository>
为一个指定目录,在maven安装目录下建一个store目录,当做仓库,并配置这个目录的绝对地址。在<mirrors>
中写入一下配置:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
把bin目录加入环境变量
配置
创建项目
在一个空项目中,创建maven模块,填写模块名称,坐标信息
坐标信息就是由GroupId(组织名)、ArtifactId(模块名)、Version(版本号)组成
它是资源的唯一标识,通过该坐标可以唯一定位资源位置。
使用坐标定义项目或引入项目中需要的依赖
如果在项目中需要第三方依赖,依赖在pom.xml中写,例:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
依赖
依赖管理
一个项目默认会依赖传递,如果A依赖B,B依赖C,那么A间接依赖C
排除依赖:主动断开依赖的资源,被排除的资源不需要指定版本
<dependency>
<groupId>com.eb</groupId>
<artifactId>projectB</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.eb</groupId>
<artifactId>projectC</artifactId>
</exclusion>
</exclusions>
</dependency>
这时,A项目就不会依赖com.eb的projectC项目或jar等
依赖范围
在dependency中写<scope></scope>
设置它的作用范围
作用范围:
- 主程序范围内有效(main文件夹中)
- 测试程序范围内有效(test文件夹中)
- 是否参与打包(package指令范围内)
scope值 | 主程序 | 测试程序 | 打包(运行) |
---|---|---|---|
compile(默认) | Y | Y | Y |
test | N | Y | N |
provided | Y | Y | N |
reuntime | N | Y | Y |
生命周期
Maven的声明周期就是为了对所有的maven项目构建过程进行抽象和统一。
maven有三类阶段:clean、default、site
每类阶段中有很多小的阶段,阶段是有顺序的,后面的阶段依赖于前面的依赖
有几个重要的阶段:
- clean:移除上一次构建生成的文件
- compile:编译项目源代码成字节码文件
- test:使用合适的单元测试框架运行测试
- package:将编译后的文件打包(jar、war等)
- install:安装项目到本地仓库
因为后面的阶段依赖于前面的依赖,如果test阶段执行,那么clean和compile都会执行
还可以在命令行中执行,mvn test
、mvn package
在idea中可以选择跳过指定模式
maven的这些声明周期都是抽象的概念,并不执行具体的插件,具体的事情由绑定的插件来做,因为maven是插件执行框架,所有的工作都由插件做
Web后端开发
Spring框架
Spring是一个开源框架的家族
创建一个简单的SpringBoot项目,然后在src/main/java/
包中写一个类,给这个类加上@RestController
注解,给里面的方法加上@RequestMapping("请求地址")
,请求地址
是站点绝对路径,访问请求地址
的时候,springboot会调用这个方法。
注解 | 含义 |
---|---|
@RequestMapping("地址") |
指定请求地址 |
SpringMVC是Spring框架中的web开发模块,用于简化原始servelt的开发 |
SpringMVC中包含接收请求、响应数据、拦截器、全局异常处理
Spring framework中还包含IOC、DI、AOP、事务处理
SSM就是SpringMVC+Spring framework+Mybatis
请求和响应
简单参数
一、通过HttpServletRequest
的对象手动getParameter()
获取数据
@RestController
public class RequestController {
@RequestMapping("/test")
public String test(HttpServletRequest request) {
System.out.println("name: " + request.getParameter("name") + "age: " + request.getParameter("age"));
return "success";
}
}
二、根据传递的参数写方法参数
@RequestMapping("/test")
public String test(String name, Integer age) {
System.out.println("name: " + name + "age: " + age);
return "success";
}
@RequestParam
注解可以限制必须传递的参数,他的required
属性默认为true,例:
@RequestMapping("/test")
public String test(@RequestParam(name = "name") String name, Integer age) {
System.out.println("name: " + name + "age: " + age);
return "success";
}
@RequestParam(defaultValue = "1")
可以规定默认值为1
这时,"name"
属性就是必须要传递的参数,不传递会请求失败
实体参数
根据传递参数自动组装成一个指定类的对象
Student类中有name和age属性:
@RequestMapping("/test")
public String test(Student s) {
System.out.println("name: " + s.getName() + "age: " + s.getAge());
return "success";
}
如果涉及多个类,传递的时候键要用.
分割,例:
User
中有个属性是Address
类型的,Address
类型又有两个属性,那么传递参数的时候要:
....../name=Tom&age=18&address.province=bj&city=bj
,这里address.province
就是多个类型的传递方式
规则:请求参数名与形参对象属性名相同,即可直接通过POJO接收
数组集合参数
请求参数名与形参数组名称相同请求参数为多个,定义数组类型即可接收参数
....../hobby=game&hobby=java
这里有两个hobby参数,可以用数组接收
@RequestMapping("/test")
public String test(String[] hobby) {
for (String s : hobby) {
System.out.println(s);
}
return "success";
}
用集合接收需要@RequestParam
注解绑定参数关系
@RequestMapping("/test")
public String test(@RequestParam List<String> hobby) {
for (String s : hobby) {
System.out.println(s);
}
return "success";
}
日期参数
通过注解@DateTimeFormat(pattern="yyyy")
,例:
传参:time=1978-10-28 10:28:05
@RequestMapping("/test")
public String test(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime time) {
System.out.println(time);
return "success";
}
JSON参数
JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要@RequestBody
标识
例:
{
"name": "Tom",
"address": {
"province": "bj",
"city": "bj"
}
}
public class User {
private String name;
private Address address;
}
public class Address {
private String province;
private String city;
}
所以可以这样接收:
@RequestMapping("/test")
public String test(@RequestBody User user) {
System.out.println(user);
return "success";
}
路径参数
通过URL直接传递参数,使用{...}
来标识该路径参数,需要使用@PathVariable
注解
@RequestMapping("/test/{id}")
public String test(@PathVariable Integer id) {
System.out.println(id);
return "success";
}
可以写多个路径参数:
@RequestMapping("/test/{id}/{num}")
public String test(@PathVariable Integer id, @PathVariable Integer num) {
System.out.println(id);
System.out.println(num);
return "success";
}
响应数据
在方法名或直接在类前面加@RestController
,相当于加了@ResponseBody
和@Controller
注解
这个类里面的方法都是功能接口,@RequestMapping
中的是接口路径
功能接口的返回值可以是一个String
或一个JavaBean类、集合。如果是JavaBean类,就返回一个JSON格式的键值对对象,如果是集合,就返回一个JSON格式的数组
响应结构格式不统一会给开发带来不便。
建议返回一个Result
类:
public class Result {
private Integer code