熱門框架學習筆記-創(chuàng)新互聯(lián)

1-Spring框架 1. Spring框架
  1. Spring框架優(yōu)勢:簡化開發(fā)、框架整合;
  2. Spring架構(gòu)圖
    在這里插入圖片描述
  3. Spring的學習內(nèi)容:Spring的IOC/DI、Spring的AOP、AOP的具體應(yīng)用與事務(wù)管理、IOC/DI的具體應(yīng)用與整合Mybatis。
  4. IOC:控制反轉(zhuǎn);IOC容器;Bean;DI依賴注入。
2. IOC相關(guān)內(nèi)容
  1. bean的基礎(chǔ)配置
  1. bean的實例化:
    • bean的創(chuàng)建:構(gòu)造方法
    • Spring的IOC實例化對象的三種方式
      • 構(gòu)造方法(常用)
      • 靜態(tài)工廠(了解)
      • 實例工廠(了解)
        • FactoryBean(實用)
  2. bean的生命周期
3. DI相關(guān)內(nèi)容 3.1 setter注入:
  1. 對于引用數(shù)據(jù)類型:
  1. 對于簡單數(shù)據(jù)類型:
3.2 構(gòu)造器注入
  1. 引用數(shù)據(jù)類型
  1. 簡單數(shù)據(jù)類型
3.3 自動配置
  1. 標簽刪除;
  2. 標簽中添加 autowire 屬性。
  3. 分類:按照類型注入、按照名稱注入
3.4 集合注入

標簽內(nèi)部寫arraylist、setmap、props標簽。

創(chuàng)新互聯(lián)公司成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站制作、成都網(wǎng)站設(shè)計網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元臨湘做網(wǎng)站,已為上家服務(wù),為臨湘各地企業(yè)和個人服務(wù),聯(lián)系電話:028-869222204. IOC/DI配置管理第三方bean 4.1 數(shù)據(jù)源對象管理

管理第三方bean步驟:

  1. 添加依賴;
  2. 配置第三方 bean,通過 setter 注入為第三方 bean 注入必要的參數(shù);
  3. 從 IOC 容器獲取對應(yīng)的 bean 對象使用。
4.2 加載 properties 文件
  1. 開啟 context 命名空間:
    在這里插入圖片描述
  2. 加載 properties 配置文件
  1. 在applicationContext.xml引入properties配置文件中的值
${key}
5. 核心容器
  1. 容器創(chuàng)建的兩種方式
    • ClassPathXmlApplicationContext[掌握]
    • FileSystemXmlApplicationContext[知道即可]
  2. 獲取 Bean 的三種方式
    • getBean(“名稱”):需要類型轉(zhuǎn)換
    • getBean(“名稱”,類型.class):多了一個參數(shù)
    • getBean(類型.class):容器中不能有多個該類的bean對象
  3. 容器類層次結(jié)構(gòu):最頂層的父接口 BeanFactory
  4. BeanFactory:
    • 使用BeanFactory創(chuàng)建的容器是延遲加載
    • 使用ApplicationContext創(chuàng)建的容器是立即加載
    • 具體BeanFactory如何創(chuàng)建只需要了解即可。
  5. bean 相關(guān):
    在這里插入圖片描述
  6. 依賴注入相關(guān)
    在這里插入圖片描述
6. IOC/DI 注解開發(fā) 6.1 純注解開發(fā)模式
  1. 創(chuàng)建配置類 SpringConfig;
  2. 在配置類上添加@Configuration注解,將其標識為一個配置類,替換applicationContext.xml;
  3. 在配置類上添加包掃描注解@ComponentScan替換
@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {}

在這里插入圖片描述

6.2 注解開發(fā)bean作用范圍與生命周期管理
  1. @Scope:設(shè)置該類創(chuàng)建對象的作用范圍,可用于設(shè)置創(chuàng)建出的bean是否為單例對象
  2. @PostConstruct:設(shè)置該方法為初始化方法
  3. @PreDestroy:設(shè)置該方法為銷毀方法
6.3 注解開發(fā)依賴注入

注解開發(fā)只提供了自動裝配的注解實現(xiàn)。

  1. @Autowired:為引用類型屬性設(shè)置值,自動裝配;
  2. @Qualifier:為引用類型屬性指定注入的beanId,即可以在多個實現(xiàn)類中指定注入Bean的 Id;
  3. @Value:為 基本數(shù)據(jù)類型 或 字符串類型 屬性設(shè)置值;
  4. @PropertySource:加載properties文件中的屬性值,屬性值可以使用@Value("${key}")注入。
7. IOC/DI注解開發(fā)管理第三方bean 7.1 注解開發(fā)管理第三方bean步驟
  1. 定義外部配置類管理第三方bean
  2. 定義獲取第三方bean的方法,并通過@Bean注解將方法的返回值制作為Spring管理的一個bean對象
  3. @Bean:設(shè)置該方法的返回值作為spring管理的bean
  4. 在Spring配置類中使用@Import({JdbcConfig.class})引入第三方bean
  5. @Import:導入配置類
7.2 注解開發(fā)實現(xiàn)為第三方bean注入資源
  1. 簡單數(shù)據(jù)類型:在類中提供屬性,用@Value注解引入值,在第三方bean的方法中傳遞參數(shù)進去即可;
  2. 引用數(shù)據(jù)類型:讓 Spring 掃描管理到需要的bean,為第三方bean定義方法設(shè)置形參即可,容器會根據(jù)類型自動裝配對象。
7.3 注解開發(fā)與配置文件開發(fā)對比

在這里插入圖片描述

8. Spring整合 8.1 Spring整合Mybatis

要整合的內(nèi)容:
第一件事是:Spring要管理MyBatis中的SqlSessionFactory
第二件事是:Spring要管理Mapper接口的掃描

整合步驟:

  1. 項目中導入整合需要的jar包:spring-jdbc、mybatis-spring
  2. 創(chuàng)建Spring的主配置類
  3. 創(chuàng)建數(shù)據(jù)源的配置類 JdbcConfig ,配置 DruidDataSource
  4. 主配置類中讀properties并引入數(shù)據(jù)源配置類
  5. 創(chuàng)建Mybatis配置類并配置SqlSessionFactory,類里面定義兩個Bean,一個用于產(chǎn)生SqlSessionFactory對象;一個返回MapperScannerConfigurer對象,用來處理原始配置文件中的mappers相關(guān)配置,加載數(shù)據(jù)層的Mapper接口類
    • SqlSessionFactoryBean封裝SqlSessionFactory需要的環(huán)境信息
      在這里插入圖片描述
    • MapperScannerConfigurer加載Dao接口,創(chuàng)建代理對象保存到IOC容器中
      在這里插入圖片描述
  6. 主配置類中引入Mybatis配置類
  7. 編寫運行類運行
8.2 Spring整合Junit
  1. 引入依賴:junit、spring-test
  2. 在test\java下創(chuàng)建一個測試類,添加兩個注解:
    • 設(shè)置類運行器:@RunWith(SpringJUnit4ClassRunner.class)
    • 設(shè)置Spring環(huán)境對應(yīng)的配置類:@ContextConfiguration(classes = {SpringConfig.class}) //加載配置類
      類里面自動裝配注入 service bean,正常寫 @Test 運行測試即可。
9. AOP 9.1 AOP 實現(xiàn)步驟
  1. 添加依賴:spring-contextaspectjweaver
  2. 定義接口與實現(xiàn)類、Spring的配置類、App運行類
  3. 定義通知類和通知
  4. 定義切入點
@Pointcut("execution(void com.itheima.dao.BookDao.update())")
private void pt(){}
  1. 制作切面:通知方法上添加注解@Before("pt()")
  2. 將通知類配給容器并標識其為切面類@Component、@Aspect
  3. 開啟注解格式AOP功能:在Spring配置類上添加注解@EnableAspectJAutoProxy
  4. 運行程序
9.2 AOP 的核心概念
  1. 概念:AOP(Aspect Oriented Programming)面向切面編程,一種編程范式
  2. 作用:在不驚動原始設(shè)計的基礎(chǔ)上為方法進行功能增強
  3. 核心概念:
    • 代理(Proxy):SpringAOP的核心本質(zhì)是采用代理模式實現(xiàn)的
    • 連接點(JoinPoint):在SpringAOP中,理解為任意方法的執(zhí)行
    • 切入點(Pointcut):匹配連接點的式子,也是具有共性功能的方法描述
    • 通知(Advice):若干個方法的共性功能,在切入點處執(zhí)行,最終體現(xiàn)為一個方法
    • 切面(Aspect):描述通知與切入點的對應(yīng)關(guān)系
    • 目標對象(Target):被代理的原始對象稱為目標對象
9.3 切入點表達式
  1. 切入點表達式標準格式:動作關(guān)鍵字(訪問修飾符 返回值 包名.類/接口名.方法名(參數(shù))異常名)
execution(* com.itheima.service.*Service.*(..))
  1. 切入點表達式描述通配符:
    • 作用:用于快速描述,范圍描述
    • *:匹配任意符號(常用)
    • … :匹配多個連續(xù)的任意符號(常用)
    • +:匹配子類類型
9.4 五種通知類型
- 前置通知
- 后置通知
- 環(huán)繞通知(重點)
- 返回后通知
- 拋出異常后通知
9.5 通知中獲取參數(shù)
  1. 獲取切入點方法的參數(shù),所有的通知類型都可以獲取參數(shù)
    • JoinPoint:適用于前置、后置、返回后、拋出異常后通知
    • ProceedingJoinPoint:適用于環(huán)繞通知
  2. 獲取切入點方法返回值,前置和拋出異常后通知是沒有返回值,后置通知可有可無,所以不做研究
    • 返回后通知
    • 環(huán)繞通知
  3. 獲取切入點方法運行異常信息,前置和返回后通知是不會有,后置通知可有可無,所以不做研究
    • 拋出異常后通知
    • 環(huán)繞通知
9.6 知識點
  1. AOP 配置
    • @EnableAspectJAutoProxy:配置類定義上方,開啟注解格式AOP功能
    • @Aspect:切面類定義上方,設(shè)置當前類為AOP切面類
    • @Pointcut:切入點方法定義上方,設(shè)置切入點方法
    • @Before:通知方法定義上方,設(shè)置當前通知方法與切入點之間的綁定關(guān)系,當前通知方法在原始切入點方法前運行
  2. 通知類型總結(jié)
    • @Before
    • @After:通知方法定義上方,設(shè)置當前通知方法與切入點之間的綁定關(guān)系,當前通知方法在原始切入點方法后運行
    • @AfterReturning:通知方法定義上方,設(shè)置當前通知方法與切入點之間綁定關(guān)系,當前通知方法在原始切入點方法正常執(zhí)行完畢后執(zhí)行
    • @AfterThrowing:通知方法定義上方,設(shè)置當前通知方法與切入點之間綁定關(guān)系,當前通知方法在原始切入點方法運行拋出異常后執(zhí)行
    • @Around:通知方法定義上方,設(shè)置當前通知方法與切入點之間的綁定關(guān)系,當前通知方法在原始切入點方法前后運行,對原始方法的調(diào)用通過pjp.proceed();實現(xiàn)
10. AOP 事務(wù)管理 10.1 事務(wù)管理步驟
  1. 在需要被事務(wù)管理的方法上添加注解@Transactional,可以寫在接口類上、接口方法上、實現(xiàn)類上和實現(xiàn)類方法上,建議寫在實現(xiàn)類或?qū)崿F(xiàn)類的方法上
  2. 在JdbcConfig類中配置事務(wù)管理器,配置第三方 bean :DataSourceTransactionManager
  3. 開啟事務(wù)注解:在SpringConfig的配置類中開啟@EnableTransactionManagement
  4. 運行測試
  5. 知識點:
    • @EnableTransactionManagement:配置類定義上方,設(shè)置當前Spring環(huán)境中開啟注解式事務(wù)支持;
    • @Transactional:業(yè)務(wù)層接口上方、業(yè)務(wù)層實現(xiàn)類上方、業(yè)務(wù)方法上方,為當前業(yè)務(wù)層方法添加事務(wù)(如果設(shè)置在類或接口上方則類或接口中所有方法均添加事務(wù))
10.2 Spring事務(wù)角色

在這里插入圖片描述

  • 事務(wù)管理員:發(fā)起事務(wù)方,在Spring中通常指代業(yè)務(wù)層開啟事務(wù)的方法
  • 事務(wù)協(xié)調(diào)員:加入事務(wù)方,在Spring中通常指代數(shù)據(jù)層方法,也可以是業(yè)務(wù)層方法
10.3 Spring事務(wù)屬性
  1. 事務(wù)配置,作為屬性在@Transactional注解的參數(shù)上進行設(shè)置
    在這里插入圖片描述
  2. 事務(wù)傳播行為:轉(zhuǎn)賬業(yè)務(wù)追加日志案例
    • 創(chuàng)建日志表
    • 添加LogDao接口
    • 添加LogService接口與實現(xiàn)類,實現(xiàn)類方法配置@Transactional
    • 在轉(zhuǎn)賬的業(yè)務(wù)中添加記錄日志
    • 結(jié)果運行:正常運行時,日志表中日志記錄成功;出現(xiàn)異常時,日志表未添加數(shù)據(jù)——日志的記錄與轉(zhuǎn)賬操作隸屬同一個事務(wù),同成功同失敗
      在這里插入圖片描述
    • 需要效果:無論轉(zhuǎn)賬操作是否成功,日志必須保留
    • 事務(wù)傳播行為:事務(wù)協(xié)調(diào)員對事務(wù)管理員所攜帶事務(wù)的處理態(tài)度。
    • 解決:修改logService改變事務(wù)的傳播行為,在記錄日志的業(yè)務(wù)方法上設(shè)置事務(wù)屬性:傳播行為設(shè)置為當前操作需要新事務(wù)
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void log(String out,String in,Double money ) {logDao.log("轉(zhuǎn)賬操作由"+out+"到"+in+",金額:"+money);
}
2-SpringMVC 1. SpringMVC概述與入門案例 1.1 SpringMVC
  1. SpringMVC是一種基于Java實現(xiàn)MVC模型的輕量級Web框架
  2. 優(yōu)點
    • 使用簡單、開發(fā)便捷(相比于Servlet)
    • 靈活性強
  3. 負責功能
    • controller如何接收請求和數(shù)據(jù)
    • 如何將請求和數(shù)據(jù)轉(zhuǎn)發(fā)給業(yè)務(wù)層
    • 如何將響應(yīng)數(shù)據(jù)轉(zhuǎn)換成json發(fā)回到前端
1.2 入門案例流程
  1. 創(chuàng)建 Maven 項目,不使用骨架,設(shè)置打包方式為 war 包——定義為 web 項目
  2. 補全目錄結(jié)構(gòu)
  3. 導入jar包:javax.servlet-api、spring-webmvc、tomcat7-maven-plugin插件
  4. 創(chuàng)建配置類SpringMvcConfig,添加注解:
@Configuration
@ComponentScan("com.itheima.controller")
  1. 創(chuàng)建Controller類,添加@Controller注解,定義方法添加@RequestMapping("/save")注解設(shè)置當前控制器方法請求訪問路徑,添加注解@ResponseBody設(shè)置返回數(shù)據(jù)為json
  2. 使用配置類替換web.xml:將web.xml刪除,換成ServletContainersInitConfig
public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{@Override
    protected Class[] getRootConfigClasses() {return new Class[]{};
    }

    @Override
    protected Class[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {return new String[]{"/"};
    }
}
  1. 配置Tomcat環(huán)境
  2. 啟動運行項目
1.3 bean加載控制 – 如何讓Spring和SpringMVC分開加載各自的內(nèi)容
  1. Spring加載的bean設(shè)定掃描范圍為精準范圍,例如service包、dao包等
  2. Spring加載的bean設(shè)定掃描范圍為com.itheima,排除掉controller包中的bean
@Configuration
@ComponentScan(value="com.itheima",
excludeFilters=@ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
) p
ublic class SpringConfig {}
  1. 方式三:不區(qū)分Spring與SpringMVC的環(huán)境,加載到同一個環(huán)境中[了解即可]
1.4 知識點
  1. @Controller:SpringMVC控制器類定義上方,設(shè)定SpringMVC的核心控制器bean;
  2. @RequestMapping:SpringMVC控制器類或方法定義上方,設(shè)置當前控制器方法請求訪問路徑;
  3. @ResponseBody:SpringMVC控制器類或方法定義上方,設(shè)置當前控制器方法響應(yīng)內(nèi)容為當前返回值,無需解析
  4. @ComponentScan:類定義上方,設(shè)置spring配置類掃描路徑,用于加載使用注解格式定義的bean;excludeFilters:排除掃描路徑中加載的bean,需要指定類別(type)和具體項(classes)、includeFilters:加載指定的bean,需要指定類別(type)和具體項(classes)
1.5 PostMan 工具的使用 2. 請求與響應(yīng) 2.1 請求參數(shù)
  1. 設(shè)置請求映射路徑:當有多個 Controller 時,可能具有相同的方法名,此時可以通過在 Controller 類上面添加@@RequestMapping("/book")、@RequestMapping("/user")進行區(qū)分
  2. GET請求中文亂碼:修改pom.xml中 tomcat 插件配置來解決GET請求中文亂碼問題
  3. POST請求中文亂碼:在 ServletContainersInitConfig 中配置過濾器
@Override
protected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();
	filter.setEncoding("UTF-8");
	return new Filter[]{filter};
}
2.2 五種類型參數(shù)傳遞
  1. 普通參數(shù):
    • 地址參數(shù)名與形參變量名相同:定義形參即可接收參數(shù)
    • 形參與地址參數(shù)名不一致:寫上@RequestParam注解
  2. POJO數(shù)據(jù)類型:請求參數(shù)與形參對象中的屬性對應(yīng)即可完成參數(shù)傳遞
  3. 嵌套POJO類型參數(shù):請求參數(shù)名與形參對象屬性名相同,按照對象層次結(jié)構(gòu)關(guān)系即可接收嵌套POJO屬性參數(shù)
  4. 數(shù)組類型參數(shù):同名請求參數(shù)可以直接映射到對應(yīng)名稱的形參數(shù)組對象中
  5. 集合類型參數(shù):同名請求參數(shù)可以使用@RequestParam注解映射到對應(yīng)名稱的集合對象中作為數(shù)據(jù)
  6. 知識點@RequestParam:SpringMVC控制器方法形參定義前面,綁定請求參數(shù)與處理器方法形參間的關(guān)系
2.3 JSON數(shù)據(jù)傳輸參數(shù)
  1. SpringMVC接收JSON數(shù)據(jù)的實現(xiàn)步驟為:
    • 導入jackson包,SpringMVC默認使用的是jackson來處理json的轉(zhuǎn)換
    • 使用PostMan發(fā)送JSON數(shù)據(jù):JSON普通數(shù)組、JSON對象數(shù)據(jù)、JSON對象數(shù)組
    • 開啟SpringMVC注解驅(qū)動,在配置類上添加@EnableWebMvc注解
    • Controller方法的參數(shù)前添加@RequestBody注解
  2. 知識點:
    • @EnableWebMvc:SpringMVC配置類定義上方,開啟SpringMVC多項輔助功能
    • @RequestBody:SpringMVC控制器方法形參定義前面,將請求中請求體所包含的數(shù)據(jù)傳遞給請求參數(shù)——用于接收 json 數(shù)據(jù)
    • @RequestParam:用于接收url地址傳參,表單傳參
2.4 日期類型參數(shù)傳遞
  1. @DateTimeFormat:SpringMVC控制器方法形參前面,設(shè)定日期時間型數(shù)據(jù)格式
  2. 參數(shù)傳遞內(nèi)部原理:SpringMVC 做了類型轉(zhuǎn)換,SpringMVC中提供了很多類型轉(zhuǎn)換接口和實現(xiàn)類。
2.5 響應(yīng)
  1. 響應(yīng)頁面(了解):將頁面名稱返回回去,方法返回類型為 String,此處不能添加@ResponseBody,如果加了該注解,會直接將頁面名稱 page.jsp 當字符串返回前端
  2. 返回文本數(shù)據(jù)(了解):添加@ResponseBody注解,文本數(shù)據(jù)return回去即可
  3. 響應(yīng) json 數(shù)據(jù):依賴@ResponseBody注解和@EnableWebMvc注解,將實體類對象或集合對象 return 即可
  4. @ResponseBody:SpringMVC控制器方法定義上方和控制類上,設(shè)置當前控制器返回值作為響應(yīng)體,寫在類上,該類的所有方法都有該注解功能。方法上有@ReponseBody注解后
    • 方法的返回值為字符串,會將其作為文本內(nèi)容直接響應(yīng)給前端
    • 方法的返回值為對象,會將對象轉(zhuǎn)換成JSON響應(yīng)給前端
3. Rest風格 3.1 REST簡介

按照REST風格訪問資源時使用行為動作區(qū)分對資源進行了何種操作

  • http://localhost/users 查詢?nèi)坑脩粜畔?GET(查詢)
  • http://localhost/users/1 查詢指定用戶信息 GET(查詢)
  • http://localhost/users 添加用戶信息 POST(新增/保存)
  • http://localhost/users 修改用戶信息 PUT(修改/更新)
  • http://localhost/users/1 刪除用戶信息 DELETE(刪除)

按照不同的請求方式代表不同的操作類型:

  • 發(fā)送GET請求是用來做查詢
  • 發(fā)送POST請求是用來做新增
  • 發(fā)送PUT請求是用來做修改
  • 發(fā)送DELETE請求是用來做刪除
3.1 RESTful快速開發(fā)
  1. @RequestMapping提到類上面,用來定義所有方法共同的訪問路徑/books、/user
  2. 使用@GetMapping@PostMapping@PutMapping@DeleteMapping設(shè)置當前控制器方法請求訪問路徑與請求動作
  3. 使用@RestController注解替換@Controller@ResponseBody注解寫在 Controller 類上方
  4. 使用@PathVariable解決方法形參的名稱和路徑{}中的值不一致問題與多個參數(shù)的區(qū)分問題
  5. 知識點:
    • @PathVariable:SpringMVC控制器方法形參定義前面,綁定路徑參數(shù)與處理器方法形參間的關(guān)系,要求路徑參數(shù)名與形參名一一對應(yīng)
    • @RestController:基于SpringMVC的RESTful開發(fā)控制器類定義上方,設(shè)置當前控制器類為RESTful風格,等同于@Controller@ResponseBody兩個注解組合功能
    • @GetMapping @PostMapping @PutMapping @DeleteMapping:基于SpringMVC的RESTful開發(fā)控制器方法定義上方,設(shè)置當前控制器方法請求訪問路徑與請求動作,每種對應(yīng)一個請求動作,例如@GetMapping對應(yīng)GET請求
3.2 案例-頁面訪問處理
  1. 問題:靜態(tài)頁面存放在項目的webapp目錄下,訪問pages目錄下的books.html,SpringMVC攔截了靜態(tài)資源,根據(jù)/pages/books.html去controller找對應(yīng)的方法,找不到所以會報404的錯誤。
  2. 解決:在 config 包下定義 SpringMvcSupport 類將靜態(tài)資源進行放行
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {//設(shè)置靜態(tài)資源訪問過濾,當前類需要設(shè)置為配置類,并被掃描加載
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry){//當訪問/pages/????時候,從/pages目錄下查找內(nèi)容
        registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }
}

同時注意讓 SpringMvcConfig 配置類掃描到 config 包中的 SpringMvcSupport 類。

4. SSM 整合

流程:

  1. 創(chuàng)建Maven的web項目,設(shè)置打包方式,補全目錄
  2. 添加 SSM 需要的依賴:
    • spring:spring-jdbcspring-test
    • 數(shù)據(jù)庫:mybatis、mysql-connector-javadruid、mybatis-spring
    • 單元測試:junit
    • servlet:spring-webmvc、javax.servlet-api、jackson-databind
    • tomcat:tomcat7-maven-plugin
  3. 創(chuàng)建項目包結(jié)構(gòu)
    在這里插入圖片描述
  4. 創(chuàng)建SpringConfig配置類
@Configuration
@ComponentScan({"com.itheima.service"})
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class, MyBatisConfig.class})
@EnableTransactionManagement
public class SpringConfig {}
  1. 創(chuàng)建JdbcConfig配置類,包含數(shù)據(jù)庫連接池 bean 和 事務(wù)管理的 bean
public class JdbcConfig {@Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean
    public DataSource dataSource(){DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUrl(url);
        ds.setUsername(username);
        ds.setPassword(password);
        return ds;
    }

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource){DataSourceTransactionManager dstm = new DataSourceTransactionManager();
        dstm.setDataSource(dataSource);
        return dstm;
    }
}
  1. 創(chuàng)建MybatisConfig配置類,包含 SqlSessionFactoryBean 和 mapper映射文件的bean
public class MyBatisConfig {@Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setTypeAliasesPackage("com.itheima.domain");
        return sqlSessionFactoryBean;
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.itheima.dao");
        return mapperScannerConfigurer;
    }
}
  1. 創(chuàng)建jdbc.properties
  2. 創(chuàng)建SpringMVC配置類
@Configuration
@ComponentScan({"com.itheima.controller", "com.itheima.config"})
@EnableWebMvc
public class SpringMvcConfig {}
  1. 創(chuàng)建Web項目入口配置類
// Web 項目入口配置類
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {// 加載 Spring 配置類
    @Override
    protected Class[] getRootConfigClasses() {return new Class[]{SpringConfig.class};
    }

    // 加載 SpringMvc 配置類
    @Override
    protected Class[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};
    }

    // 配置 SpringMVC 請求地址攔截規(guī)則
    @Override
    protected String[] getServletMappings() {return new String[]{"/"};
    }

    // 設(shè)置 post 請求中文亂碼過濾器
    @Override
    protected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("utf-8");
        return new Filter[]{filter};
    }
}
  1. 創(chuàng)建數(shù)據(jù)庫及表并初始化數(shù)據(jù)
  2. 編寫模型類:domain 包下 Book 類
  3. 編寫Dao接口:用注解編寫 sql 語句:增、刪、改、按 id 查詢、查詢所有。查詢會返回查詢的對象或者null,而正常增刪改是沒有返回值的,此時不能判斷到底有沒有增刪改成功:將增刪改的返回值改為 int ,會返回操作影響的行數(shù),當成功操作,返回值 >0 再在 service 層返回 true 表示操作成功;否則返回 false 表示操作失敗。
  4. 編寫Service接口和實現(xiàn)類
  5. 編寫Contorller類,使用 REST 風格
@RestController
@RequestMapping("/books")
public class BookController {@Autowired
    private BookService bookService;

    @PostMapping
    public Result save(@RequestBody Book book){boolean flag = bookService.save(book);
        return new Result(flag ? Code.SAVE_OK : Code.SAVE_ERR, flag);
    }

    @PutMapping
    public Result update(@RequestBody Book book){boolean flag = bookService.update(book);
        return new Result(flag ? Code.UPDATE_OK : Code.UPDATE_ERR, flag);
    }

    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id){boolean flag = bookService.delete(id);
        return new Result(flag ? Code.DELETE_OK : Code.DELETE_ERR, flag);
    }

    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id){Book book = bookService.getById(id);
        Integer code = book != null ? Code.GET_OK : Code.GET_ERR;
        String msg = book != null ? "" : "數(shù)據(jù)查詢失敗,請重試!";
        return new Result(code, book, msg);
    }

    @GetMapping
    public Result getAll(){Listlist = bookService.getAll();
        Integer code = list != null ? Code.GET_OK : Code.GET_ERR;
        String msg = list != null ? "" : "數(shù)據(jù)查詢失敗,請重試!";
        return new Result(code,list,msg);
    }
}
  1. 單元測試 Service 類
  2. PostMan測試各個功能
5. 統(tǒng)一結(jié)果封裝 5.1 結(jié)果封裝思路
  • 為了封裝返回的結(jié)果數(shù)據(jù):創(chuàng)建結(jié)果模型類,封裝數(shù)據(jù)到data屬性中
  • 為了封裝返回的數(shù)據(jù)是何種操作及是否操作成功:封裝操作結(jié)果到code屬性中
  • 操作失敗后為了封裝返回的錯誤信息:封裝特殊消息到message(msg)屬性中
    在這里插入圖片描述
5.2 實現(xiàn)
  1. 在 controller 包下創(chuàng)建 Result 類:三個屬性、構(gòu)造方法、setter、getter
  2. 在 controller 包下定義返回碼 Code 類:各種操作成功、失敗編碼(自己定義)
  3. 修改Controller類的返回值,讓所有方法的返回值類型都是 Result ,在 return 語句中將封裝好的 Result 對象返回回去
6. 異常處理

目的:出現(xiàn)異常的時候,也會返回一個 Result 標準結(jié)果對象回去,在 msg 屬性中添加異常信息。

6.1 異常分類
  1. 業(yè)務(wù)異常(BusinessException):規(guī)范的用戶行為產(chǎn)生的異常如輸入錯數(shù)據(jù)類型、不規(guī)范的用戶行為操作產(chǎn)生的異常如故意傳遞錯誤的請求數(shù)據(jù)
    • 解決:發(fā)送對應(yīng)消息傳遞給用戶,提醒規(guī)范操作
  2. 系統(tǒng)異常(SystemException):項目運行過程中可預(yù)計但無法避免的異常如系統(tǒng)宕機
    • 解決:發(fā)送固定消息傳遞給用戶,安撫用戶;發(fā)送特定消息給運維人員,提醒維護;記錄日志
  3. 其他異常(Exception):編程人員未預(yù)期到的異常如用到的文件不存在
    • 解決:發(fā)送固定消息傳遞給用戶,安撫用戶;發(fā)送特定消息給編程人員,提醒維護(納入預(yù)期范圍內(nèi));記錄日志
6.2 異常解決方案的實現(xiàn)
  1. 在 exception 包下定義自定義異常類,封裝業(yè)務(wù)異常和系統(tǒng)異常
// 自定義業(yè)務(wù)異常類
public class BusinessException extends RuntimeException{private Integer code;

    public Integer getCode() {return code;
    }

    public void setCode(Integer code) {this.code = code;
    }

    public BusinessException(Integer code, String message){super(message);
        this.code = code;
    }

    public BusinessException(Integer code, String message, Throwable cause){super(message,cause);
        this.code = code;
    }
}
// 自定義系統(tǒng)異常類
public class SystemException extends RuntimeException{private Integer code;

    public Integer getCode() {return code;
    }

    public void setCode(Integer code) {this.code = code;
    }

    public SystemException(Integer code, String message){super(message);
        this.code = code;
    }

    public SystemException(Integer code, String message, Throwable cause){super(message,cause);
        this.code = code;
    }
}
  1. 將其他異常包成自定義異常:即在代碼處理中遇到可以預(yù)測到的異常情況時,拋出我們自定義的異常
    • try{}catch(){}在catch中重新throw我們自定義異常
    • 直接throw自定義異常即可
@Override
    public Book getById(Integer id) {// 模擬業(yè)務(wù)異常,包裝成自定義異常
        if(id == 1){throw new BusinessException(Code.BUSINESS_ERR,"請不要用你的技術(shù)挑戰(zhàn)我的耐性");
        }

        // 模擬系統(tǒng)異常,將可能出現(xiàn)的異常包裝轉(zhuǎn)換成自定義異常
        try {int i = 1 / 0;
        } catch (Exception e){throw new SystemException(Code.SYSTEM_TIMEOUT_ERR,"服務(wù)器訪問超時,請重試!",e);
        }

        return bookDao.getById(id);
    }
  1. 在 controller 包下定義異常處理器類 ProjectExceptionAdvice,在出現(xiàn)異常的時候依然正常返回標準的 Result 對象給前端,同時要確保SpringMvcConfig能夠掃描到異常處理器類
@RestControllerAdvice
public class ProjectExceptionAdvice {// @ExceptionHandler 用于設(shè)置當前處理器類對應(yīng)的異常類型
    @ExceptionHandler(SystemException.class)
    public Result doSystemException(SystemException ex){//其他處理:記錄日志、發(fā)送消息給運維、發(fā)送郵件給開發(fā)人員
        // 接替 controller 返回結(jié)果
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    @ExceptionHandler(BusinessException.class)
    public Result doBusinessException(BusinessException ex){return new Result(ex.getCode(),null,ex.getMessage());
    }

    // 除了自定義的異常處理器,保留對 Exception 類型的異常處理
    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){//其他處理
        return new Result(Code.SYSTEM_UNKNOW_ERR, null, "系統(tǒng)繁忙,請稍后再試");
    }
}
6.3 知識點
  1. 異常處理器:集中的、統(tǒng)一的處理項目中出現(xiàn)的異常
  2. @RestControllerAdvice:Rest風格開發(fā)的控制器增強類定義上方,為Rest風格開發(fā)的控制器類做增強——此注解自帶@ResponseBody注解與@Component注解,具備對應(yīng)的功能
  3. @ExceptionHandler:專用于異常處理的控制器方法上方,設(shè)置指定異常的處理方案,功能等同于控制器方法,出現(xiàn)異常后終止原始控制器執(zhí)行,并轉(zhuǎn)入當前方法執(zhí)行
7. 攔截器 7.1 攔截器概念

在這里插入圖片描述

  1. 攔截器(Interceptor)是一種動態(tài)攔截方法調(diào)用的機制,在SpringMVC中動態(tài)攔截控制器方法的執(zhí)行
  2. 作用:
    • 在指定的方法調(diào)用前后執(zhí)行預(yù)先設(shè)定的代碼
    • 阻止原始方法的執(zhí)行
    • 總結(jié):攔截器就是用來做增強
  3. 攔截器和過濾器:
    • 歸屬不同:Filter屬于Servlet技術(shù),Interceptor屬于SpringMVC技術(shù)
    • 攔截內(nèi)容不同:Filter對所有訪問進行增強,Interceptor僅針對SpringMVC的訪問進行增強
      在這里插入圖片描述
7.2 攔截器開發(fā)
  1. 在 controller 包下添加 interceptor 包,創(chuàng)建攔截器類 ProjectInterceptor,讓類實現(xiàn) HandlerInterceptor 接口,重寫接口中的三個方法;攔截器類要被SpringMVC容器掃描到
@Component
//定義攔截器類,實現(xiàn)HandlerInterceptor接口
//注意當前類必須受Spring容器控制
public class ProjectInterceptor implements HandlerInterceptor {@Override
	//原始方法調(diào)用前執(zhí)行的內(nèi)容
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle...");
		return true;
	}
	 @Override
	//原始方法調(diào)用后執(zhí)行的內(nèi)容
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle...");
	} 
	@Override
	//原始方法調(diào)用完成后執(zhí)行的內(nèi)容
	public void afterCompletion(HttpServletRequest request,	HttpServletResponse response, Object handler, Exception ex) throws Exception
	{System.out.println("afterCompletion...");
	}
}
  1. 配置攔截器類:在 config 包下的 SpringMvcSupport 類中,定義一個 ProjectInterceptor 對象并自動裝配,覆蓋 addInterceptors 方法配置攔截器
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {@Autowired
	private ProjectInterceptor projectInterceptor;
	@Override
	protected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
	} 
	@Override
	protected void addInterceptors(InterceptorRegistry registry) {//配置攔截器
		registry.addInterceptor(projectInterceptor).addPathPatterns("/books");
	}
}
  1. SpringMVC添加SpringMvcSupport包掃描
  2. 修改攔截器攔截規(guī)則,讓 /books 下一級目錄也被包含
@Override
protected void addInterceptors(InterceptorRegistry registry) {//配置攔截器
	registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*" );
}
  1. 簡化SpringMvcSupport的編寫
@Configuration
@ComponentScan({"com.itheima.controller"})
@EnableWebMvc
//實現(xiàn)WebMvcConfigurer接口可以簡化開發(fā),但具有一定的侵入性
public class SpringMvcConfig implements WebMvcConfigurer {@Autowired
	private ProjectInterceptor projectInterceptor;
	@Override
	public void addInterceptors(InterceptorRegistry registry) {//配置多攔截器
		registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*");
	}
}

在這里插入圖片描述

7.3 攔截器參數(shù)
  1. 前置處理方法
  2. 后置處理方法
  3. 完成處理方法
7.4 攔截器鏈配置

在這里插入圖片描述

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

本文題目:熱門框架學習筆記-創(chuàng)新互聯(lián)
鏈接分享:http://bm7419.com/article12/hcjgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、小程序開發(fā)、微信公眾號關(guān)鍵詞優(yōu)化、網(wǎng)頁設(shè)計公司、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)