day3-4后端Web开发

Maven

是apach旗下的一个开源项目,是一款用于管理和构建java项目的工具。

  • 依赖管理(方便快捷的管理项目依赖的资源jar包,避免版本冲突)、
  • 统一的项目结构(提供标准、统一的项目结构)、
  • 项目构建(跨平台的自动化项目构建方式)

1、解压

2、配置本地仓库:修改conf/settings.xml中的<localRepository>为一个指定目录

3、配置阿里云私服:修改conf/settings.xml中的<mirrors>标签,为其添加如下子标签:

<mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>

4、配置环境变量,MAVEN_HOME为解压目录,并将其bin目录加入PATH环境变量中。

在Idea中配置Maven环境(全局):

setttings->Build,Execution,Deployment->Build Tools->Maven:

设置Maven home path和User Settings file、Local repository

setttings->Build,Execution,Deployment->Build Tools->Maven->Runner中的JRE

setttings->Build,Execution,Deployment->Compiler->Java Compliler中的project bytecode version

Idea创建Maven项目

Maven坐标:

Maven中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置,使用坐标来定义项目或引入项目中需要的依赖。

坐标主要组成:

  • groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
  • artifactId:定义当前Maven项目名称(通常是模块名称,例如order-service、goods-service)
  • version:定义当前项目版本号

依赖配置:指当前项目运行所需要的jar包,一个项目中可以引入多个依赖。

  1. 在pom.xml中编写<dependencies>标签
  2. 在<dependencies>标签中使用<dependency>引入标签
  3. 定义坐标的groupId,artifactId、version
  4. 点击刷新按钮,引入最新加入的坐标

mvn仓库链接:https://mvnrepository.com/

注意:如果引入的依赖,在本地仓库不存在,将会连接远程仓库/中央仓库,然后下载依赖;如果不知道依赖的坐标信息,可以到上述连接中搜索。

依赖传递:

依赖具有传递性。

直接依赖:在当前项目中通过依赖配置建立的依赖关系。

间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源。

排除依赖:指主动断开依赖的资源,被排除的资源无需指定版本。<exclusions>

依赖范围:

依赖的jar包,默认情况下,可以在任何地方使用,可以通过<scope>设置其作用范围。

作用范围:

  • 主程序范围有效(main文件夹范围内)
  • 测试程序范围有效(test文件夹范围内)
  • 是否参与打包运行(package指令范围内)
scope值主程序测试程序打包(运行)范例
compile(默认)YYYlog4j
test-Y-junit
providedYY-servlet-api
runtime-YYjbdc驱动

生命周期:

Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一。

Maven中有3套相互独立的生命周期:

  • clean清理工作

clean:移除上一次构建生成的文件

  • default核心工作,如:编译、测试、打包、安装、部署等

compile:编译项目源代码

test:使用合适的单元测试框架运行测试(junit)

package:将编译后的文件打包,如jar、war等

install:安装项目到本地仓库

  • site生成报告、发布站点

注意:在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行。

执行指定生命周期:

在Idea中,右侧的maven工具栏,选择对应的生命周期,双击执行;

或者在命令行中,通过命令执行:mvn clean/compile/test

Maven高级

分模块设计与开发:

创建maven模块tlias-pojo,存放实体类;创建maven模块tlias-utils,存放相关工具类;

方便项目的管理维护、扩展,也方便模块间的相互协调,资源共享。

继承与聚合:

继承:子工程可以继承父工程中的配置信息,常见于依赖关系的继承。作用:简化依赖配置、统一管理依赖。

注意:

  • 在子工程中,配置了继承关系之后,坐标中的groupId是可以省略的,因为会自动继承父工程的;
  • relativePath指定父工程的pom文件的相对位置(如果不指定,将从本地仓库/远程仓库查找该工程);
  • 如果父子工程都配置了同一个依赖的不同版本,以子工程的为准;

<dependencyManagement>与<dependencies>的区别是什么?

  • <dependencies>是直接依赖,在父工程配置了依赖,子工程会直接继承下来;
  • <dependencyManagement>是统一管理依赖版本,不会直接依赖,还需要在子工程中引入所需依赖(无需指定版本);

聚合:将多个模块组织成一个整体,同时进行项目的构建。

聚合工程:一个不具有业务功能的“空”工程(有且仅有一个pom文件)。

作用:快速构建项目(无需根据依赖关系手动构建,直接在聚合工程上构建即可)。

私服:

SpringBoot Web

SpringBoot简化了Spring的开发,帮助快速的构建应用程序、简化开发、提高效率。

入门:

1、创建springboot工程,并勾选web开发相关依赖。

创建module时,选择Spring Initializr,type选择Maven,dependencies选择Spring Web.

2、定义HelloController类,添加方法hello,并添加注解。

b454bb3412434c049673a28a875a2444.png

3、运行测试。

Error:(3, 47) java: 程序包org.springframework.web.bind.annotation不存在

解决:勾选将IDE运行操作委托给Maven

f09d1783e55c441c94af5f1838248b12.png

起步依赖:

spring-boot-starter-web、spring-boot-starter-test

内嵌Tomcat服务器:

基于Springboot开发的web应用程序,内置了tomcat服务器,当启动类运行时,会自动启动内嵌的tomcat服务器。

HTTP协议:

规定了浏览器和服务器之间数据传输的规则;默认端口号为80;

特点:

1.基于TCP协议:面向连接,安全

2.基于请求-响应模型的:一次请求对应一次响应

3.HTTP协议是无状态的协议:对于事务处理没有记忆能力,每次请求-响应都是独立的。

缺点:多次请求间不能共享数据。

优点:速度快。

请求数据格式:

请求行:(请求方式 资源路径 协议)

请求头:格式key:value

请求体:POST请求,存放请求参数

注意:

请求方式- GET:请求参数在请求行中,没有请求体,如:/brand/findAll?name=zhangsan&status=1,GET请求大小是有限制的;

请求方式- POST:请求参数在请求体中,POST请求大小是没有限制的;

响应数据格式:

响应行:(协议 状态码描述)

响应头:格式key:value

响应体:存放响应数据

状态码大全:https://cloud.tencent.com/developerchapter/13553

Web服务器-Tomcat:

Web服务器是一个软件程序,对Http协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发便捷,主要功能是"提供网上信息浏览服务"。

Tomcat是Apache软件基金会一个核心项目,轻量级Web服务器,支持Servlet/JSP少量JavaEE规范。也被称为web容器、Servlet容器。Servlet程序需要依赖于Tomcat才能运行。

请求响应:

  • 请求(HttpServletRequest):获取请求数据
  • 响应(HttpservletResponse):设置响应数据
  • BS架构:浏览器服务器架构
  • CS架构:客户端服务器架构

POSTMAN:

postman是一款功能强大的网页调试与发送网页HTTP请求的chrome插件。类似的还有ApiPost、Apifox。

作用:常用于接口测试

在这里使用了Apipost,注意使用web版可能会受到浏览器的跨域限制,因此需要下载客户端版本。

请求简单参数传递:

简单参数:参数名与形参变量名相同,定义形参即可接收参数;如果请求参数与形参变量不一致,则不会接收参数,但不会报错;

@RequestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递将报错。如果该参数是可选的,可以将required属性设置为false;

/*@RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request){
        //获取请求参数
        String name = request.getParameter("name");
        String ageStr= request.getParameter("age");
        int age = Integer.parseInt(ageStr);
        System.out.println(name+" "+age);
        return "OK!";
  }*/
    //springboot方式
    @RequestMapping("/simpleParam")
    public String simpleParam(String name, Integer age) {
        System.out.println(name + " " + age);
        return "simpleParamOK!";
    }

请求实体参数传递:

需要保证请求的参数名和封装的对象名保持一致。

@RequestMapping("/entityParam")
    public String entityParam(User user){
        System.out.println(user);
        return "entityParamOk!";
    }

请求数组集合参数传递:

数组:请求参数名与形参数名称相同且请求参数为多个,定义数组类型形参即可接收参数。

集合:请求参数名与形参集合名称相同且请求参数为多个,@RequestParam绑定参数关系。

@RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "arrayParamOK!";
    }
@RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "listParamOK!";
    }

请求日期参数传递:

使用@DateTimeFormat注解完成日期参数格式转换。

 @RequestMapping("/dateParam")
    public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDateTime time){
        System.out.println(time);
        return "dateParamOK!";
    }

请求Json参数传递:

JSON数据键名与形参对象属性名相同,定义对象User类型形参即可接收参数,需要使用@RequestBody。

@RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user){
        System.out.println(user);
        return "jsonParamOK!";
    }

请求路径参数传递:

通过请求URL直接传递参数,使用{...}来标识该路径参数,需要使用@PathVariable获取路径参数。

@RequestMapping("/path/{id}")
    public String pathParam(@PathVariable Integer id){
        System.out.println(id);
        return "pathParamOK!";
    }
    //多个路径参数
    @RequestMapping("/path/{id}/{name}")
    public String pathParam2(@PathVariable Integer id,@PathVariable String name){
        System.out.println(id+" : "+name);
        return "2pathParamOK!";
    }

响应数据:

@ResponseBody

  • 类型:方法注解、类注解
  • 位置:Controller方法上/类上
  • 作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为JSON格式响应。
  • 说明:@RestController=@Controller+@ResponseBody;

分层解耦

三层架构:

  • controller控制层:接收前端发送的请求,对请求进行处理,并响应数据。
  • service业务逻辑层:处理具体的业务逻辑。
  • dao数据访问层(Data Access Object持久层):负责数据访问操作,包括数据的增删改查。

内聚:软件中各个功能模块内部的功能联系。

耦合:衡量软件中各个层/模块之间的依赖、关联的程度。

IOC和DI:

IOC:Inversion Of Control控制反转,对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。

DI:Dependency Injection依赖注入,容器为应用程序提供运行时所依赖的资源,称为依赖注入。

Bean对象:IOC容器中创建、管理的对象,称之为bean。


@component将当前类交给IOC容器管理,成为IOC容器中的Bean。

@Autowired运行时,IOC容器会提供该类型的bean对象,并赋值给该变量-依赖注入。

Bean的声明:

注解说明位置
@component声明bean的基础注解不属于以下三类时用此注解
@Controller衍生注解标注在控制器类上
@Service衍生注解标注在业务类上
@Repository衍生注解标注在数据访问类上(由于与mybatis整合,用的少)

注意:声明Bean的时候,可以通过value属性指定名字,如果没有指定,默认为类名首字母小写。

以上四个注解都可以声明Bean,但在SpingBoot集成Web开发中,声明控制器Bean只能用@Controller。

Bean组件扫描:

  • 前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
  • @ComponentScan注解虽然没有显示配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包

Bean注入:

@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,则会报错;

解决方案:

① 在声明bean的前面加上@Primary,表明注入的优先级最高;

② 在注入bean时(即@Autowired)前面加上@Qualifier("beanName"),表明注入的哪个bean;

③ 将@Autowired注解替换为@Resource(name="beanName"),这是按照名称注入的。

注意:

@Autowired和@Resource的区别:

  • @Autowired都是spring框架提供的,@Resource是jdk提供的注解。
  • @Autowired默认是按照类型注入的,而@Resource默认是按照名称注入的。
  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值