Java Web 开发从入门到实践课件 第12章 - Maven和Spring Boot框架_第1页
Java Web 开发从入门到实践课件 第12章 - Maven和Spring Boot框架_第2页
Java Web 开发从入门到实践课件 第12章 - Maven和Spring Boot框架_第3页
Java Web 开发从入门到实践课件 第12章 - Maven和Spring Boot框架_第4页
Java Web 开发从入门到实践课件 第12章 - Maven和Spring Boot框架_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaWeb开发从入门到实践JavaWebDevelopmentFromIntroductiontoPracticeMaven和SpringBoot框架Chap12提纲Maven和SpringBoot框架本章介绍了Maven项目管理工具用于自动化构建和依赖管理,SpringBoot简化了Spring应用的开发与配置,并通过IoC/DI和AOP机制提供了灵活的依赖管理和功能增强,帮助开发者高效构建现代Java应用。12.1Maven项目管理工具12.2SpringBoot入门12.3SpringBoot应用12.4Spring之IoC/DI12.5Spring之AOP12.6本章小结12.1Maven项目管理工具12.1.1Maven简介12.1.2IDEA集成Maven12.1.3使用IDEA创建第一个Maven项目12.1.4依赖管理12.1.1Maven简介Maven是一个项目管理和构建工具,将项目开发和管理过程抽象成一个项目对象模型(POM)。(1)方便的依赖管理。(2)统一的项目结构。(3)标准的项目构建流程。仓库是Maven工具的一个重要的概念。仓库用于存储资源和管理各种jar包。根据资源、jar包存储位置可以分为以下三种仓库。(1)本地仓库:资源、jar包存储在本机的仓库。(2)远程仓库(私服):一般由公司团队搭建的私有仓库。(3)中央仓库。中央仓库是一个公共的、可访问的Maven仓库,它包含大量的依赖库,仓库地址为“/”。简介12.1.1Maven简介(1)下载好Maven工具后进行解压(2)配置本地仓库。修改Maven中conf目录下的settings.xml文件,将文件中的localRepository修改为本机仓库位置安装Maven<localRepository>D:\ProgramFiles(x86)\apache-maven-3.8.4\repository</localRepository>(3)配置远程仓库(阿里云私服)修改Maven中conf目录下settings.xml文件的<mirrors>标签,添加子标签<mirrors> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyunmaven</name> <url>/nexus/content/groups/public</url> </mirror></mirrors>12.1.1Maven简介(4)配置环境变量。在控制面板中,可以通过右击此电脑选择“属性→高级系统设置→环境变量”来配置环境变量。图

12-1

配置环境变量12.1.1Maven简介(5)测试安装结果图

12-2测试Maven安装结果打开“命令提示符”窗口,输入“mvn-v”12.1.2IDEA集成Maven在实际开发中,一般将Maven整合到IDEA中使用,IDEA集成Maven的具体步骤如下(1)首次打开IDEA工具,进入欢迎页面(非首次打开,点击“File→CloseProject”进入欢迎页面),选中“Customize”,点击“Allsettings”进入设置界面,如图12-3所示。图

12-3

欢迎页面12.1.2IDEA集成Maven(2)设置Maven安装目录、settings.xml文件目录和本地仓库目录图

12-4配置Maven12.1.2IDEA集成Maven(3)设置JRE图

12-5设置JRE12.1.2IDEA集成Maven(4)设置JavaCompiler图

12-6设置JavaCompiler12.1.3使用IDEA创建第一个Maven项目创建Maven项目在欢迎界面,点击“NewProject”,设置项目名称、保存路径、JDK,Language选中“Java”,Buildsystem选中“Maven”,设置坐标信息图

12-7创建Maven项目Maven坐标主要由以下三部分组成。(1)GroupId:定义当前Maven项目隶属的组织名称,通常是公司域名的倒序。(2)ArtifactId:定义当前Maven项目名称。(3)Version:版本号。版本号也可以创建好项目后进行修改,在pom.xml文件中修改。12.1.3使用IDEA创建第一个Maven项目创建Maven项目,目录结构如图12-8所示。图

12-8创建Maven项目12.1.3使用IDEA创建第一个Maven项目项目坐标<groupId>com.swxy</groupId><artifactId>maven-project01</artifactId><version>1.0-SNAPSHOT</version>12.1.3使用IDEA创建第一个Maven项目导入其他Maven项目在Maven项目中通过会访问其它的Maven项目,可以通过导入的方式引入其他项目。引入其他Maven项目有以下二种方式。(1)选择右侧Maven面板,点击“+”号,如图12-9所示。在弹出窗口中选中对应项目的pom.xml文件,双击即可,如图12-10所示。图

12-9导入Maven项目图

12-10选中pom.xml文件12.1.3使用IDEA创建第一个Maven项目(2)选择“File→ProjectStructure→Modules→点击‘+’号→ImportModule”,选中待导入项目的pom.xml文件即可图

12-11选中pom.xml文件12.1.4依赖管理依赖配置依赖是指当前项目运行所需要的jar包。一个项目可以引入多个依赖。例如,Maven项目中引入logback依赖<dependencies>

<dependency>

<groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId>

<version>1.4.14</version>

</dependency>

</dependencies>12.1.4依赖管理添加依赖后,点击右上角的“load

maven

changes”图标,引入最新加入的坐标,如图12-12所示。图

12-12加载Maven12.1.4依赖管理依赖传递依赖具有传递性,包括直接依赖和间接依赖。(1)直接依赖:在当前项目中通过依赖配置建立的依赖关系。(2)间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源。排除依赖排除依赖指主动断开依赖的资源,被排除的资源无需指定版本。

12.1.4依赖管理案例:排除依赖创建项目“maven-project01”和“maven-project02”,项目“maven-project01”引入单元测试依赖和“maven-project02”依赖,观察依赖关系,接着排除依赖后再观察依赖关系。(1)创建Maven项目“maven-project02”,在项目中添加单元测试依赖<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.13.2</version>

</dependency>

</dependencies>12.1.4依赖管理(2)在Maven项目“maven-project01”中引入“maven-project02”依赖,并移除junit依赖<dependencies> ... <dependency> <groupId>com.swxy</groupId> <artifactId>maven-project02</artifactId> <version>1.0-SNAPSHOT</version> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions> </dependency></dependencies>12.1.4依赖管理上述代码中,在添加“<exclusions>”标签前,项目“maven-project01”间接依赖“junit”,如图12-13所示。添加“<exclusions>”标签后,项目不能间接依赖“junit”,如图12-14所示。图

12-13未排除junit依赖图

12-14已排除junit依赖12.1.4依赖管理在项目“maven-project01”的pom.xml文件中,右击“Diagrams->ShowDiagram...”,如图12-15所示。项目“maven-project01”(未排除“maven-project02”依赖)的依赖关系如图12-16所示。图

12-16依赖关系12.1.4依赖管理依赖范围默认情况下,Maven项目依赖的jar包可以在任何地方可以使用。也可以通过<scope>标签设置其作用范围,作用范围有以下三种。(1)主程序范围有效。项目main文件夹内有效。(2)测试程序范围有效。项目test文件夹内有效。(3)是否参与打包运行。package指令范围内有效。设置测试程序范围有<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.13.2</version>

<scope>test</scope></dependency>12.1.4依赖管理表

12-1

依赖包的scope取值及其作用范围scope取值主程序测试程序是否参与打包compile(默认)是是是test-是-provided是是-runtime-是是12.1.4依赖管理生命周期Maven生命周期是对构建过程的一种抽象,它包括清理、编译、测试、打包等一系列构建步骤。Maven中有以下三套相互独立的生命周期。(1)clean:清理工作。包含pre-clean、clean和post-clean三个阶段。(2)default:核心工作,例如,编译、测试、打包、安装等。(3)site:生成报告、发布站点等。常用的五个生命周期阶段(1)clean:移除上一次构建生成的文件。(2)compile:编译项目源代码。(3)test:使用合适的单元测试框架运行测试编译后的源代码。(4)package:将编译后的文件打包,如:jar、war等。(5)install:安装项目到本地仓库,以作为本地其他项目中的依赖项。12.1.4依赖管理执行指定生命周期的方法:在IDEA工具右侧的Maven工具栏,双击生命周期对应的阶段图

12-17执行生命周期的打包阶段12.2SpringBoot入门12.2.1SpringBoot框架12.2.2SpringBoot快速入门12.2.1SpringBoot框架Spring是一个开源的控制反转(InversionofControl,IoC)和面向切面(AOP)的容器框架。SpringBoot是一个开源的Java框架,旨在简化Spring应用程序的创建和部署过程,SpringBoot基于Spring开发,不是为了取代Spring,而是为了让人们更容易的使用Spring。12.2.2SpringBoot快速入门案例:SpringBoot工程的搭建(1)创建SpringBoot工程,并勾选web开发相关依赖,JDK选中17,Java选中17,如图12-18所示。点击“Next”按钮,进入下一个界面,SpringBoot选中3.1.7,如图12-19所示。图

12-18

创建SpringBoot项目图

12-19

选中SpringBootWeb起步依赖12.2.2SpringBoot快速入门案例:SpringBoot工程的搭建(2)定义HelloController类,添加方法,并添加注解,项目目录结构和代码如图12-20所示。图

12-20

项目目录结构12.3SpringBoot应用12.3.1SpringBoot请求参数12.3.2SpringBoot响应12.3.1SpringBoot请求参数接收请求参数可以采用原始方式和SpringBoot方式。原始方式是使用HttpServletRequest对象获取参数,代码量较多,使用不方便;SpringBoot方式可以获取多种类型的请求参数,例如,简单参数、实体参数等,该方式更加简单和灵活。原始方式@RequestMapping("/simpleParam")

publicStringsimpleParam(HttpServletRequestrequest){

Stringname=request.getParameter("name");Stringage=request.getParameter("age");

return"success";}12.3.1SpringBoot请求参数SpringBoot方式SpringBoot方式接收的请求参数分为简单参数、实体参数、数组参数、集合参数、日期参数、JSON参数和路径参数。

(1)简单参数@RequestMapping("/simpleParam")

publicStringsimpleParam(Stringname,Integerage){

System.out.println(name+":"+age);

return"success";

}如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射@RequestMapping("/simpleParam")

publicStringsimpleParam(@RequestParam(name="name")StringuserName,Integerage){

System.out.println(userName+":"+age);

return"success";

}12.3.1SpringBoot请求参数

(2)实体参数@RequestMapping("/simplePojo")publicStringsimplePojo(Useruser){ System.out.println(user); return"success";}简单实体对象:请求参数名与形参对象属性名相同,定义POJO接收即可复杂实体对象:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数,请求参数名为vince和address.citypublicclassUser{

privateStringname;

privateintage;

privateAddressaddress;}publicclassAddress{

privateStringprovince;

privateStringcity;}12.3.1SpringBoot请求参数

(3)数组参数@RequestMapping("/arrayParam")publicStringarrayParam(String[]hobby){ System.out.println(Arrays.toString(hobby)); return"success";}

(4)集合参数@RequestMapping("/arrayParam")publicStringarrayParam(@RequestParamList<String>hobby){ System.out.println(hobby); return"success";}

(4)日期参数@RequestMapping("/dateParam")publicStringdateParam(@DateTimeFormat(pattern="yyyy-MM-ddHH:mm:ss")LocalDateTimecreateTime){ System.out.println(createTime); return"success";}12.3.1SpringBoot请求参数

(6)JSON参数@RequestMapping("/jsonParam")publicStringjsonParam(@RequestBodyUseruser){ System.out.println(user); return"success";}JSON数据键名与形参对象属性名相同,定义

POJO类型形参即可接收参数,需要使用@RequestBody标识图

12-21

Postman发送JSON数据12.3.1SpringBoot请求参数

(7)路径参数@RequestMapping("/user/{id}/{name}")publicStringurlParam(@PathVariableintid,@PathVariableStringname){ System.out.println(id+":"+name); return"success";}通过请求URL直接传递参数,需要使用@PathVariable获取路径参数12.3.2SpringBoot响应在SpringBoot应用中,通常使用@ResponseBody注解将方法的返回值作为response的body部分,将返回的对象通过适当的转换器转换为指定的格式之后,直接将数据写入到输出流中。@ResponseBody注解等价于通过response对象输出指定格式的数据。@ResponseBody注解的使用@ResponseBody分为方法注解和类注解,位于Controller方法或类上,是将方法返回值直接响应,如果返回值类型是实体对象或集合,将会转换为JSON格式响应。通常使用@RestController注解。@RestController包含@Controller和@ResponseBody二个注解。控制层Controller方法返回类型可以是字符串、对象、集合等,返回类型不统一,不便管理和难以维护。可以统一响应结果来解决这个问题。所有的控制层方法统一返回Result类型。12.3.2SpringBoot响应publicclassResult{

privateIntegercode;

//响应码:1成功,0失败

privateStringmsg;

//提示信息

privateObjectdata;

//返回的数据publicstaticResultsuccess(Objectdata){

returnnewResult(1,"success",data);

}publicstaticResultsuccess(){

returnnewResult(1,"success",null);

}

publicstaticResulterror(Stringmsg){

returnnewResult(0,msg,null);

}//省略构造方法、getter/setter等方法}Result实体类12.3.2SpringBoot响应案例:获取员工数据,返回统一响应结果。准备emp.xml文件<emps>

<emp> <id>1</id>

<name>Charles</name>

<age>30</age>

<image>images/1.png</image>

<gender>1</gender><!--1:男,0:女

-->

<job>1</job><!--1:专任教师2:辅导员3:其它

-->

</emp>

<emp> <id>2</id><name>Fiona</name><age>38</age>

<image>images/4.png</image>

<gender>0</gender><job>3</job>

</emp></emps>12.3.2SpringBoot响应在pom.xml文件中引入dom4j的依赖,用于解析XML文件<dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.3</version></dependency>创建用于解析XML的工具类XMLParserUtils、对应的实体类Emp,文件emp.xml放在resources目录下publicclassXmlParserUtils{publicstatic<T>List<T>parse(Stringfile,Class<T>targetClass){ ArrayList<T>list=newArrayList<T>();//封装解析出来的数据 try{ SAXReadersaxReader=newSAXReader();//获取一个解析器对象 //利用解析器把xml文件加载到内存中,并返回一个文档对象 Documentdocument=saxReader.read(newFile(file)); ElementrootElement=document.getRootElement();//获取根标签List<Element>elements=rootElement.elements("emp");//通过根标签来获取user标签12.3.2SpringBoot响应 for(Elementelement:elements){//遍历集合,得到每一个user标签 Stringid=element.element("id").getText();//id属性 Stringname=element.element("name").getText();//name属性 Stringage=element.element("age").getText();//age属性 Stringimage=element.element("image").getText();//image属性 Stringgender=element.element("gender").getText();//gender属性 Stringjob=element.element("job").getText();//job属性 Constructor<T>constructor=targetClass.getDeclaredConstructor(Integer.class,String.class,Integer.class,String.class,String.class,String.class);//组装数据 constructor.setAccessible(true); Tobject=constructor.newInstance(Integer.parseInt(id),name,Integer.parseInt(age),image,gender,job); list.add(object); } }catch(Exceptione){ e.printStackTrace(); } returnlist;}}12.3.2SpringBoot响应publicclassEmp{ privateIntegerid; privateStringname; privateIntegerage; privateStringimage; privateStringgender; privateStringjob;}Emp.java(4)编写Controller程序,处理请求,响应数据@RestController

publicclassEmpController{

@RequestMapping("/listEmp")

publicResultlist(){

//1、加载emp.xml

Stringfile=this.getClass().getClassLoader().getResource("emp.xml").getFile();

List<Emp>empList=XmlParserUtils.parse(file,Emp.class);

12.3.2SpringBoot响应//2、对员工信息中的性别、职位字段进行处理

empList.stream().forEach(emp->{

Stringgender=emp.getGender();

if("1".equals(gender)){

emp.setGender("男");

}elseif("0".equals(gender)){

emp.setGender("女");

}

Stringjob=emp.getJob();

if("1".equals(job)){

emp.setJob("专任教师");

}elseif("2".equals(job)){

emp.setJob("辅导员");

}elseif("3".equals(job)){

emp.setJob("其它");

}

});

returnResult.success(empList);

//3、组装数据并返回

}

}12.3.2SpringBoot响应<linkrel="stylesheet"href="element-ui/index.css"> <scriptsrc="./js/vue.js"></script> <scriptsrc="./element-ui/index.js"></script> <scriptsrc="./js/axios-0.18.0.js"></script> <body> <h1align="center">员工信息列表展示</h1> <divid="app"> <el-table:data="tableData"style="width:100%"stripeborder><el-table-columnprop="id"label="编号"align="center"min-width="20%"></el-table-column>

//省略姓名、年龄、图像、性别和职位

</el-table> </div> </body>

(5)使用VSCode创建Vue项目,执行打包命令“npmrunbuild”,将生成的dist目录下的文件拷贝到IDEA工程目录resources的static目录下emp.html12.3.2SpringBoot响应 <style> .el-table.warning-row{ background:oldlace; } .el-table.success-row{ background:#f0f9eb; } </style> <script> newVue({ el:"#app", data(){

return{

tableData:[]

} },

12.3.2SpringBoot响应 mounted(){

axios.get('/listEmp').then(res=>{

if(res.data.code){

this.tableData=res.data.data;

}

});

}, methods:{ } }); </script>12.3.2SpringBoot响应图

12-22

员工信息列表12.4Spring之IoC/DI12.4.1什么是IoC/DI12.4.2分层解耦12.4.1什么是IoC/DI控制反转(InversionOfControl,简称IoC):对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。IoC让开发人员不用关注创建对象,把对象的创建、初始化、销毁等工作交给Spring容器。容器为应用程序提供运行时所依赖的资源,称之为依赖注入(DependencyInjection,简称DI)。依赖注入更加准确地描述了IoC的设计理念,是最流行的IoC实现方式。依赖注入,即组件之间的依赖关系由容器在应用系统运行期来决定,由容器动态地将目标对象注入到应用系统中的组件之中。Bean对象:IoC容器中创建、管理的对象,称之为Bean。12.4.1什么是IoC/DI以下二个步骤可以实现三层解耦。(1)Bean的声明表

12-2注解注解说明位置@Component声明bean的基础注解不属于以下三类时,用此注解@Controller@Component的衍生注解标注在控制器上@Service@Component的衍生注解标注在业务类上@Repository@Component的衍生注解标注在数据访问类上12.4.1什么是IoC/DI(2)Bean的注入@Autowired注解默认是按照类型进行,该注解是Spring框架提供的注解,@Resource默认是按照名称注入,该注解是JDK提供的注解。12.4.2分层解耦本章12.3.2节应用案例,耦合度高而难以拆分,代码复用性低,数据访问、业务逻辑和响应请求代码都放在EmpController类中。

因此需要进行分层解耦,以便于进行分工合作、后期维护和提高软件组件的重用,便于替换某种产品(例如,变更持久层框架)、产品功能的扩展和适用用户需求的不断变化。三层架构的概念控制层(controller):接收前端发送的请求,对请求进行处理,并响应数据。业务逻辑层(service):处理具体的业务逻辑。数据访问层(DataAccessObject,简称DAO):负责数据访问操作,包括数据的增加、删除、修改、查询。12.4.2分层解耦三层架构的应用案例:修改Controller程序,

将程序改成三层架构图

12-23

三层架构的目录结构12.4.2分层解耦软件设计的原则:高内聚(软件中各个功能模块内部的功能联系)低耦合(衡量软件中各个层/模块之间的依赖、关联的程序)EmpDaoImpl.java@Repository

publicclassEmpDaoImplimplementsEmpDao{

@Override

publicList<Emp>empList(){

//加载emp.xml,并解析emp.xml中的数据

Stringfile=this.getClass().getClassLoader().getResource("emp.xml").getFile();

List<Emp>empList=XmlParserUtils.parse(file,Emp.class);

returnempList;

}

}12.4.2分层解耦EmpServiceImpl.java@ServicepublicclassEmpServiceImplimplementsEmpService{ //按照名称注入@Resource(name="empDaoImpl") @Autowired//按照类型注入 EmpDaoempDao; @Override publicList<Emp>empList(){ List<Emp>empList=empDao.empList(); empList.stream().forEach(emp->{ Stringsex=emp.getSex(); if(sex.equals("1")){ emp.setSex("男"); }else{ emp.setSex("女"); }

12.4.2分层解耦 Stringjob=emp.getJob(); if("1".equals(job)){ emp.setJob("专任教师"); }elseif("2".equals(job)){ emp.setJob("辅导员"); }elseif("3".equals(job)){ emp.setJob("其它"); } }); returnempList; }}12.4.2分层解耦EmpController.java@Slf4j@RestControllerpublicclassEmpController{ @Autowired EmpServiceempService; @RequestMapping("/listEmp") publicResultlist(){ //1.调用servlet,获得数据 List<Emp>empList=empService.empList(); //2.组装数据并返回 returnResult.success(empList); }}12.5Spring之AOPAOP(AspectOrientedProgramming,面向切面编程)是在运行期间通过底层的动态代理机制对特定方法植入增强的代码。主要适用于记录操作日志、权限控制、事务管理等场景。主要的优势是代码无侵入、减少重复代码、提高开发效率和维护方便。12.5.1入门案例案例:工程部分功能运行速度较慢,需要统计每一个业务方法来定位耗时较长的业务方法。(1)在pom.xml中导入AOP的依赖<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-aop</artifactId></dependency>12.5.1入门案例(2)编写AOP程序(编写切面类)@Component

@Aspect

@Slf4j

publicclassTimeAspect{

@Around("execution(*co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论