動力節(jié)點王鶴老師的SpringBoot入門教程寥假,通俗易懂芙代,是基于SpringBoot2.4版本講解旭旭。
從細節(jié)入手央勒,每個事例先講解pom.xml中的重要依賴不见,其次application配置文件,最后是代碼實現(xiàn)崔步。讓你知其所以稳吮,逐步讓掌握SpringBoot框架的自動配置,starter起步依賴等特性井濒。
視頻資源
https://www.bilibili.com/video/BV1XQ4y1m7ex
SpringBoot
第一章 JavaConfig
-
為什么要使用 Spring Boot
因為Spring灶似, SpringMVC 需要使用的大量的配置文件 (xml文件)
還需要配置各種對象,把使用的對象放入到spring容器中才能使用對象
需要了解其他框架配置規(guī)則瑞你。
-
SpringBoot 就相當于 不需要配置文件的Spring+SpringMVC酪惭。 常用的框架和第三方庫都已經(jīng)配置好了。
拿來就可以使用了者甲。
SpringBoot開發(fā)效率高春感,使用方便多了
1.1 JavaConfig
JavaConfig: 使用java類作為xml配置文件的替代, 是配置spring容器的純java的方式虏缸。 在這個java類這可以創(chuàng)建java對象鲫懒,把對象放入spring容器中(注入到容器),
使用兩個注解:
1)@Configuration : 放在一個類的上面刽辙,表示這個類是作為配置文件使用的窥岩。
2)@Bean:聲明對象,把對象注入到容器中宰缤。
例子:
package com.bjpowernode.config;
import com.bjpowernode.vo.Student;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Configuration:表示當前類是作為配置文件使用的颂翼。 就是用來配置容器的
* 位置:在類的上面
*
* SpringConfig這個類就相當于beans.xml
*/
@Configuration
public class SpringConfig {
/**
* 創(chuàng)建方法晃洒,方法的返回值是對象。 在方法的上面加入@Bean
* 方法的返回值對象就注入到容器中朦乏。
*
* @Bean: 把對象注入到spring容器中锥累。 作用相當于<bean>
*
* 位置:方法的上面
*
* 說明:@Bean,不指定對象的名稱,默認是方法名是 id
*
*/
@Bean
public Student createStudent(){
Student s1 = new Student();
s1.setName("張三");
s1.setAge(26);
s1.setSex("男");
return s1;
}
/***
* 指定對象在容器中的名稱(指定<bean>的id屬性)
* @Bean的name屬性集歇,指定對象的名稱(id)
*/
@Bean(name = "lisiStudent")
public Student makeStudent(){
Student s2 = new Student();
s2.setName("李四");
s2.setAge(22);
s2.setSex("男");
return s2;
}
}
1.2 @ImporResource
@ImportResource 作用導入其他的xml配置文件桶略, 等于 在xml
<import resources="其他配置文件"/>
例如:
@Configuration
@ImportResource(value ={ "classpath:applicationContext.xml","classpath:beans.xml"})
public class SpringConfig {
}
1.3 @PropertyResource
@PropertyResource: 讀取properties屬性配置文件。 使用屬性配置文件可以實現(xiàn)外部化配置 诲宇,
在程序代碼之外提供數(shù)據(jù)际歼。
步驟:
- 在resources目錄下,創(chuàng)建properties文件姑蓝, 使用k=v的格式提供數(shù)據(jù)
- 在PropertyResource 指定properties文件的位置
- 使用@Value(value="${key}")
@Configuration
@ImportResource(value ={ "classpath:applicationContext.xml","classpath:beans.xml"})
@PropertySource(value = "classpath:config.properties")
@ComponentScan(basePackages = "com.bjpowernode.vo")
public class SpringConfig {
}
第二 章 Spring Boot
2.1 介紹
SpringBoot是Spring中的一個成員鹅心, 可以簡化Spring,SpringMVC的使用纺荧。 他的核心還是IOC容器旭愧。
特點:
-
Create stand-alone Spring applications
創(chuàng)建spring應用
-
Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)
內(nèi)嵌的tomcat, jetty 宙暇, Undertow
-
Provide opinionated 'starter' dependencies to simplify your build configuration
提供了starter起步依賴输枯,簡化應用的配置。
比如使用MyBatis框架 占贫, 需要在Spring項目中桃熄,配置MyBatis的對象 SqlSessionFactory , Dao的代理對象
在SpringBoot項目中型奥,在pom.xml里面, 加入一個 mybatis-spring-boot-starter依賴
-
Automatically configure Spring and 3rd party libraries whenever possible
盡可能去配置spring和第三方庫瞳收。叫做自動配置(就是把spring中的,第三方庫中的對象都創(chuàng)建好厢汹,放到容器中螟深, 開發(fā)人員可以直接使用)
-
Provide production-ready features such as metrics, health checks, and externalized configuration
提供了健康檢查, 統(tǒng)計烫葬,外部化配置
-
Absolutely no code generation and no requirement for XML configuration
不用生成代碼界弧, 不用使用xml,做配置
2.2 創(chuàng)建Spring Boot項目
2.2.1 第一種方式厘灼, 使用Spring提供的初始化器夹纫, 就是向?qū)?chuàng)建SpringBoot應用
使用的地址: https://start.spring.io
SpringBoot項目的結(jié)構(gòu):
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-dRfOaTEk-1645599534519)(D:\course\25-SpringBoot\筆記\images\image-20210115152427829.png)]
2.2.1 使用國內(nèi)的地址
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IN52drB7-1645599534520)(D:\course\25-SpringBoot\筆記\images\image-20210115155556662.png)]
2.3 注解的使用
@SpringBootApplication
符合注解:由
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
1.@SpringBootConfiguration
@Configuration
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}
說明:使用了@SpringBootConfiguration注解標注的類,可以作為配置文件使用的设凹,
可以使用Bean聲明對象舰讹,注入到容器
2.@EnableAutoConfiguration
啟用自動配置, 把java對象配置好闪朱,注入到spring容器中月匣。例如可以把mybatis的對象創(chuàng)建好钻洒,放入到容器中
3.@ComponentScan
@ComponentScan 掃描器,找到注解锄开,根據(jù)注解的功能創(chuàng)建對象素标,給屬性賦值等等。
默認掃描的包: @ComponentScan所在的類所在的包和子包萍悴。
2.4 SpringBoot的配置文件
配置文件名稱: application
擴展名有: properties( k=v) ; yml ( k: v)
使用application.properties, application.yml
例1:application.properties設置 端口和上下文
#設置端口號
server.port=8082
#設置訪問應用上下文路徑头遭, contextpath
server.servlet.context-path=/myboot
例2: application.yml
server:
port: 8083
servlet:
context-path: /myboot2
2.5 多環(huán)境配置
有開發(fā)環(huán)境, 測試環(huán)境癣诱, 上線的環(huán)境计维。
每個環(huán)境有不同的配置信息, 例如端口撕予, 上下文件鲫惶, 數(shù)據(jù)庫url,用戶名实抡,密碼等等
使用多環(huán)境配置文件欠母,可以方便的切換不同的配置。
使用方式: 創(chuàng)建多個配置文件吆寨, 名稱規(guī)則: application-環(huán)境名稱.properties(yml)
創(chuàng)建開發(fā)環(huán)境的配置文件: application-dev.properties( application-dev.yml )
創(chuàng)建測試者使用的配置: application-test.properties
2.6 @ConfigurationProperties
@ConfigurationProperties: 把配置文件的數(shù)據(jù)映射為java對象赏淌。
屬性:prefix 配置文件中的某些key的開頭的內(nèi)容。
@Component
@ConfigurationProperties(prefix = "school")
public class SchoolInfo {
private String name;
private String website;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWebsite() {
return website;
}
public void setWebsite(String website) {
this.website = website;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "SchoolInfo{" +
"name='" + name + '\'' +
", website='" + website + '\'' +
", address='" + address + '\'' +
'}';
}
}
application.properties
#配置端口號
server.port=8082
#context-path
server.servlet.context-path=/myboot
#自定義key=value
school.name=動力節(jié)點
school.website=www.bjpowernode.com
school.address=北京的大興區(qū)
site=www.bjpowernode.com
2.7 使用jsp
SpringBoot不推薦使用jsp 鸟废,而是使用模板技術代替jsp
使用jsp需要配置:
1) 加入一個處理jsp的依賴猜敢。 負責編譯jsp文件
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
- 如果需要使用servlet, jsp盒延,jstl的功能
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
-
創(chuàng)建一個存放jsp的目錄,一般叫做webapp
index.jsp
- 需要在pom.xml指定jsp文件編譯后的存放目錄鼠冕。
META-INF/resources
5)創(chuàng)建Controller添寺, 訪問jsp
6)在application.propertis文件中配置視圖解析器
2.8 使用容器
你想通過代碼,從容器中獲取對象懈费。
通過SpringApplication.run(Application.class, args); 返回值獲取容器计露。
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
return run(new Class[]{primarySource}, args);
}
ConfigurableApplicationContext : 接口,是ApplicationContext的子接口
public interface ConfigurableApplicationContext extends ApplicationContext
2.9 ComnandLineRunner 接口 憎乙, ApplcationRunner接口
這兩個接口都 有一個run方法票罐。 執(zhí)行時間在容器對象創(chuàng)建好后, 自動執(zhí)行run()方法泞边。
可以完成自定義的在容器對象創(chuàng)建好的一些操作该押。
@FunctionalInterface
public interface CommandLineRunner {
void run(String... args) throws Exception;
}
@FunctionalInterface
public interface ApplicationRunner {
void run(ApplicationArguments args) throws Exception;
}
第三章 Web組件
講三個內(nèi)容: 攔截器, Servlet 阵谚,F(xiàn)ilter
3.1 攔截器
攔截器是SpringMVC中一種對象蚕礼,能攔截器對Controller的請求烟具。
攔截器框架中有系統(tǒng)的攔截器, 還可以自定義攔截器奠蹬。 實現(xiàn)對請求預先處理朝聋。
實現(xiàn)自定義攔截器:
-
創(chuàng)建類實現(xiàn)SpringMVC框架的HandlerInterceptor接口
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
2.需在SpringMVC的配置文件中,聲明攔截器
```xml
<mvc:interceptors>
<mvc:interceptor>
<mvc:path="url" />
<bean class="攔截器類全限定名稱"/>
</mvc:interceptor>
</mvc:interceptors>
SpringBoot中注冊攔截器:
@Configuration
public class MyAppConfig implements WebMvcConfigurer {
//添加攔截器對象囤躁, 注入到容器中
@Override
public void addInterceptors(InterceptorRegistry registry) {
//創(chuàng)建攔截器對象
HandlerInterceptor interceptor = new LoginInterceptor();
//指定攔截的請求uri地址
String path []= {"/user/**"};
//指定不攔截的地址
String excludePath [] = {"/user/login"};
registry.addInterceptor(interceptor)
.addPathPatterns(path)
.excludePathPatterns(excludePath);
}
}
3.2 Servlet
在SpringBoot框架中使用Servlet對象冀痕。
使用步驟:
- 創(chuàng)建Servlet類。 創(chuàng)建類繼承HttpServlet
- 注冊Servlet 狸演,讓框架能找到Servlet
例子:
1.創(chuàng)建自定義Servlet
//創(chuàng)建Servlet類
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//使用HttpServletResponse輸出數(shù)據(jù)金度,應答結(jié)果
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("===執(zhí)行的是Servlet==");
out.flush();
out.close();
}
}
- 注冊Servlet
@Configuration
public class WebApplictionConfig {
//定義方法, 注冊Servlet對象
@Bean
public ServletRegistrationBean servletRegistrationBean(){
//public ServletRegistrationBean(T servlet, String... urlMappings)
//第一個參數(shù)是 Servlet對象严沥, 第二個是url地址
//ServletRegistrationBean bean =
//new ServletRegistrationBean( new MyServlet(),"/myservlet");
ServletRegistrationBean bean = new ServletRegistrationBean();
bean.setServlet( new MyServlet());
bean.addUrlMappings("/login","/test"); // <url-pattern>
return bean;
}
}
3.3 過濾器Filter
Filter是Servlet規(guī)范中的過濾器猜极,可以處理請求, 對請求的參數(shù)消玄, 屬性進行調(diào)整跟伏。 常常在過濾器中處理字符編碼
在框架中使用過濾器:
- 創(chuàng)建自定義過濾器類
- 注冊Filter過濾器對象
例子:
// 自定義過濾器
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("執(zhí)行了MyFilter,doFilter ");
filterChain.doFilter(servletRequest,servletResponse);
}
}
注冊Filter
@Configuration
public class WebApplicationConfig {
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter( new MyFilter());
bean.addUrlPatterns("/user/*");
return bean;
}
}
3.4 字符集過濾器
CharacterEncodingFilter : 解決post請求中亂碼的問題
在SpringMVC框架翩瓜, 在web.xml 注冊過濾器受扳。 配置他的屬性。
第一種方式:
使用步驟:
-
配置字符集過濾器
@Configuration public class WebSystemConfig { //注冊Servlet @Bean public ServletRegistrationBean servletRegistrationBean(){ MyServlet myServlet = new MyServlet(); ServletRegistrationBean reg = new ServletRegistrationBean(myServlet,"/myservlet"); return reg; } //注冊Filter @Bean public FilterRegistrationBean filterRegistrationBean(){ FilterRegistrationBean reg = new FilterRegistrationBean(); //使用框架中的過濾器類 CharacterEncodingFilter filter = new CharacterEncodingFilter(); //指定使用的編碼方式 filter.setEncoding("utf-8"); //指定request 兔跌, response都使用encoding的值 filter.setForceEncoding(true); reg.setFilter(filter); //指定 過濾的url地址 reg.addUrlPatterns("/*"); return reg; } }
修改application.properties文件勘高, 讓自定義的過濾器起作用
#SpringBoot中默認已經(jīng)配置了CharacterEncodingFilter。 編碼默認ISO-8859-1
#設置enabled=false 作用是關閉系統(tǒng)中配置好的過濾器坟桅, 使用自定義的CharacterEncodingFilter
server.servlet.encoding.enabled=false
第二種方式
修改application.properties文件
server.port=9001
server.servlet.context-path=/myboot
#讓系統(tǒng)的CharacterEncdoingFilter生效
server.servlet.encoding.enabled=true
#指定使用的編碼方式
server.servlet.encoding.charset=utf-8
#強制request华望,response都使用charset屬性的值
server.servlet.encoding.force=true
第四章 ORM 操作 MySQL
使用MyBatis框架操作數(shù)據(jù), 在SpringBoot框架集成MyBatis
使用步驟:
mybatis起步依賴 : 完成mybatis對象自動配置仅乓, 對象放在容器中
pom.xml 指定把src/main/java目錄中的xml文件包含到classpath中
創(chuàng)建實體類Student
創(chuàng)建Dao接口 StudentDao , 創(chuàng)建一個查詢學生的方法
創(chuàng)建Dao接口對應的Mapper文件赖舟, xml文件, 寫sql語句
創(chuàng)建Service層對象夸楣, 創(chuàng)建StudentService接口和他的實現(xiàn)類宾抓。 去dao對象的方法。完成數(shù)據(jù)庫的操作
創(chuàng)建Controller對象豫喧,訪問Service石洗。
-
寫application.properties文件
配置數(shù)據(jù)庫的連接信息。
第一種方式 : @Mapper
@Mapper:放在dao接口的上面紧显, 每個接口都需要使用這個注解讲衫。
/**
* @Mapper:告訴MyBatis這是dao接口,創(chuàng)建此接口的代理對象鸟妙。
* 位置:在類的上面
*/
@Mapper
public interface StudentDao {
Student selectById(@Param("stuId") Integer id);
}
第二種方式 @MapperScan
/**
* @MapperScan: 找到Dao接口和Mapper文件
* basePackages:Dao接口所在的包名
*/
@SpringBootApplication
@MapperScan(basePackages = {"com.bjpowernode.dao","com.bjpowernode.mapper"})
public class Application {
}
第三種方式: Mapper文件和Dao接口分開管理
現(xiàn)在把Mapper文件放在resources目錄下
1)在resources目錄中創(chuàng)建子目錄 (自定義的) 焦人, 例如mapper
2)把mapper文件放到 mapper目錄中
3)在application.properties文件中挥吵,指定mapper文件的目錄
#指定mapper文件的位置
mybatis.mapper-locations=classpath:mapper/*.xml
#指定mybatis的日志
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
- 在pom.xml中指定 把resources目錄中的文件 , 編譯到目標目錄中
<!--resources插件-->
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
第四個 事務
Spring框架中的事務:
1) 管理事務的對象: 事務管理器(接口花椭, 接口有很多的實現(xiàn)類)
例如:使用Jdbc或mybatis訪問數(shù)據(jù)庫忽匈,使用的事務管理器:DataSourceTransactionManager
2 ) 聲明式事務: 在xml配置文件或者使用注解說明事務控制的內(nèi)容
控制事務: 隔離級別,傳播行為矿辽, 超時時間
3)事務處理方式:
1) Spring框架中的@Transactional
2) aspectj框架可以在xml配置文件中丹允,聲明事務控制的內(nèi)容
SpringBoot中使用事務: 上面的兩種方式都可以。
1)在業(yè)務方法的上面加入@Transactional , 加入注解后袋倔,方法有事務功能了雕蔽。
2)明確的在 主啟動類的上面 ,加入@EnableTransactionManager
例子:
/**
* @Transactional: 表示方法的有事務支持
* 默認:使用庫的隔離級別宾娜, REQUIRED 傳播行為批狐; 超時時間 -1
* 拋出運行時異常,回滾事務
*/
@Transactional
@Override
public int addStudent(Student student) {
System.out.println("業(yè)務方法addStudent");
int rows = studentDao.insert(student);
System.out.println("執(zhí)行sql語句");
//拋出一個運行時異常前塔, 目的是回滾事務
//int m = 10 / 0 ;
return rows;
}
第五章 接口架構(gòu)風格 —RESTful
接口: API(Application Programming Interface嚣艇,應用程序接口)是一些預先定義的接口(如函數(shù)、HTTP接口)华弓,或指軟件系統(tǒng)不同組成部分銜接的約定食零。 用來提供應用程序與開發(fā)人員基于某軟件或硬件得以訪問的一組例程,而又無需訪問源碼寂屏,或理解內(nèi)部工作機制的細節(jié)贰谣。
接口(API): 可以指訪問servlet, controller的url迁霎, 調(diào)用其他程序的 函數(shù)
架構(gòu)風格: api組織方式(樣子)
就是一個傳統(tǒng)的: http://localhost:9002/mytrans/addStudent?name=lisi&age=26
在地址上提供了 訪問的資源名稱addStudent, 在其后使用了get方式傳遞參數(shù)吱抚。
5.1 REST
RESTful架構(gòu)風格
1)REST : (英文: Representational State Transfer , 中文: 表現(xiàn)層狀態(tài)轉(zhuǎn)移)。
REST:是一種接口的架構(gòu)風格和設計的理念欧引,不是標準频伤。
優(yōu)點: 更簡潔,更有層次
表現(xiàn)層狀態(tài)轉(zhuǎn)移:
表現(xiàn)層就是視圖層芝此, 顯示資源的, 通過視圖頁面因痛,jsp等等顯示操作資源的結(jié)果婚苹。
狀態(tài): 資源變化
轉(zhuǎn)移: 資源可以變化的。 資源能創(chuàng)建鸵膏,new狀態(tài)膊升, 資源創(chuàng)建后可以查詢資源, 能看到資源的內(nèi)容谭企,
這個資源內(nèi)容 廓译,可以被修改评肆, 修改后資源 和之前的不一樣。
2)REST中的要素:
用REST表示資源和對資源的操作非区。 在互聯(lián)網(wǎng)中瓜挽,表示一個資源或者一個操作。
資源使用url表示的征绸, 在互聯(lián)網(wǎng)久橙, 使用的圖片,視頻管怠, 文本淆衷,網(wǎng)頁等等都是資源。
資源是用名詞表示渤弛。
對資源:
查詢資源: 看祝拯,通過url找到資源。
創(chuàng)建資源: 添加資源
更新資源:更新資源 她肯,編輯
刪除資源: 去除
資源使用url表示佳头,通過名詞表示資源。
在url中辕宏,使用名詞表示資源畜晰, 以及訪問資源的信息, 在url中,使用“ / " 分隔對資源的信息
http://localhost:8080/myboot/student/1001
使用http中的動作(請求方式)瑞筐, 表示對資源的操作(CURD)
GET: 查詢資源 -- sql select
處理單個資源: 用他的單數(shù)方式
http://localhost:8080/myboot/student/1001
http://localhost:8080/myboot/student/1001/1
處理多個資源:使用復數(shù)形式
http://localhost:8080/myboot/students/1001/1002
POST: 創(chuàng)建資源 -- sql insert
http://localhost:8080/myboot/student
在post請求中傳遞數(shù)據(jù)
<form action="http://localhost:8080/myboot/student" method="post">
姓名:<input type="text" name="name" />
年齡:<input type="text" name="age" />
</form>
PUT: 更新資源 -- sql update
<form action="http://localhost:8080/myboot/student/1" method="post">
姓名:<input type="text" name="name" />
年齡:<input type="text" name="age" />
<input type="hidden" name="_method" value="PUT" />
</form>
DELETE: 刪除資源 -- sql delete
```xml
<a href="http://localhost:8080/myboot/student/1">刪除1的數(shù)據(jù)</a>
```
需要的分頁凄鼻, 排序等參數(shù),依然放在 url的后面聚假, 例如
http://localhost:8080/myboot/students?page=1&pageSize=20
`
3) 一句話說明REST:
使用url表示資源 块蚌,使用http動作操作資源。
- 注解
@PathVariable : 從url中獲取數(shù)據(jù)
@GetMapping: 支持的get請求方式膘格, 等同于 @RequestMapping( method=RequestMethod.GET)
@PostMapping: 支持post請求方式 峭范,等同于 @RequestMapping( method=RequestMethod.POST)
@PutMapping: 支持put請求方式, 等同于 @RequestMapping( method=RequestMethod.PUT)
@DeleteMapping: 支持delete請求方式瘪贱, 等同于 @RequestMapping( method=RequestMethod.DELETE)
@RestController: 符合注解纱控, 是@Controller 和@ResponseBody組合。
在類的上面使用@RestController 菜秦, 表示當前類者的所有方法都加入了 @ResponseBody
-
Postman : 測試工具
使用Postman : 可以測試 get 甜害,post , put 球昨,delete 等請求
5.2 在頁面中或者ajax中尔店,支持put,delete請求
在SpringMVC中 有一個過濾器, 支持post請求轉(zhuǎn)為put ,delete
過濾器: org.springframework.web.filter.HiddenHttpMethodFilter
作用: 把請求中的post請求轉(zhuǎn)為 put 嚣州, delete
實現(xiàn)步驟:
- application.properties(yml) : 開啟使用 HiddenHttpMethodFilter 過濾器
- 在請求頁面中鲫售,包含 _method參數(shù), 他的值是 put该肴, delete 情竹, 發(fā)起這個請求使用的post方式
第六章 Redis
Redis : 一個NoSQL數(shù)據(jù)庫, 常用作 緩存使用 (cache)
Redis的數(shù)據(jù)類型: string , hash ,set ,zset , list
Redis是一個中間件: 是一個獨立的服務器沙庐。
java中著名的客戶端: Jedis 鲤妥, lettuce , Redisson
Spring,SpringBoot中有 一個RedisTemplate(StringRedisTemplate) 拱雏,處理和redis交互
6.1 配置Windows版本的redis
Redis-x64-3.2.100.rar 解壓縮到一個 非中文 的目錄
redis-server.exe:服務端棉安, 啟動后,不要關閉
redis-cli.exe:客戶端铸抑, 訪問redis中的數(shù)據(jù)
redisclient-win32.x86_64.2.0.jar : Redis圖形界面客戶端
執(zhí)行方式: 在這個文件所在的目錄贡耽, 執(zhí)行 java -jar redisclient-win32.x86_64.2.0.jar
RedisTemplate 使用的 lettuce 客戶端庫
<!--redis起步依賴: 直接在項目中使用RedisTemplate(StringRedisTemplate)-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
data-redis使用的 lettuce 客戶端庫
在程序中使用RedisTemplate類的方法 操作redis數(shù)據(jù), 實際就是調(diào)用的lettuce 客戶端的中的方法
6.2 對比 StringRedisTemplate 和 RedisTemplate
StringRedisTemplate : 把k鹊汛,v 都是作為String處理蒲赂, 使用的是String的序列化 , 可讀性好
RedisTemplate : 把k刁憋,v 經(jīng)過了序列化存到redis滥嘴。 k,v 是序列化的內(nèi)容至耻, 不能直接識別.
默認使用的jdk序列化若皱, 可以修改為前提的序列化
序列化:把對象轉(zhuǎn)化為可傳輸?shù)淖止?jié)序列過程稱為序列化。
反序列化:把字節(jié)序列還原為對象的過程稱為反序列化尘颓。
為什么需要序列化
序列化最終的目的是為了對象可以跨平臺存儲走触,和進行網(wǎng)絡傳輸。而我們進行跨平臺存儲和網(wǎng)絡傳輸?shù)姆绞骄褪荌O疤苹,而我們的IO支持的數(shù)據(jù)格式就是字節(jié)數(shù)組互广。我們必須在把對象轉(zhuǎn)成字節(jié)數(shù)組的時候就制定一種規(guī)則(序列化),那么我們從IO流里面讀出數(shù)據(jù)的時候再以這種規(guī)則把對象還原回來(反序列化)卧土。
什么情況下需要序列化
通過上面我想你已經(jīng)知道了凡是需要進行“跨平臺存儲”和”網(wǎng)絡傳輸”的數(shù)據(jù)惫皱,都需要進行序列化。
本質(zhì)上存儲和網(wǎng)絡傳輸 都需要經(jīng)過 把一個對象狀態(tài)保存成一種跨平臺識別的字節(jié)格式尤莺,然后其他的平臺才可以通過字節(jié)信息解析還原對象信息逸吵。
序列化的方式
序列化只是一種拆裝組裝對象的規(guī)則,那么這種規(guī)則肯定也可能有多種多樣缝裁,比如現(xiàn)在常見的序列化方式有:
JDK(不支持跨語言)、JSON、XML捷绑、Hessian韩脑、Kryo(不支持跨語言)、Thrift粹污、Protofbuff段多、
Student( name=zs, age=20) ---- { "name":"zs", "age":20 }
java的序列化: 把java對象轉(zhuǎn)為byte[], 二進制數(shù)據(jù)
json序列化:json序列化功能將對象轉(zhuǎn)換為 JSON 格式或從 JSON 格式轉(zhuǎn)換對象。例如把一個Student對象轉(zhuǎn)換為JSON字符串{"name":"李四", "age":29} )壮吩,反序列化(將JSON字符串 {"name":"李四", "age":29} 轉(zhuǎn)換為Student對象)
設置key或者value的序列化方式
// 使用RedisTemplate 进苍,在存取值之前,設置序列化
// 設置 key 使用String的序列化
redisTemplate.setKeySerializer( new StringRedisSerializer());
// 設置 value 的序列化
redisTemplate.setValueSerializer( new StringRedisSerializer());
redisTemplate.opsForValue().set(k,v);
第七章 SpringBoot集成Dubbo
7.1 看 SpringBoot繼承Dubbo的文檔
https://github.com/apache/dubbo-spring-boot-project/blob/master/README_CN.md
7.2 公共項目
獨立的maven項目: 定義了接口和數(shù)據(jù)類
public class Student implements Serializable {
private static final long serialVersionUID = 1901229007746699151L;
private Integer id;
private String name;
private Integer age;
}
public interface StudentService {
Student queryStudent(Integer id);
}
7.3 提供者
創(chuàng)建SpringBoot項目
1) pom.xml
<dependencies>
<!--加入公共項目的gav-->
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>022-interface-api</artifactId>
<version>1.0.0</version>
</dependency>
<!--dubbo依賴-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<!--zookeeper依賴-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.8</version>
<type>pom</type>
<exclusions>
<!-- 排除log4j依賴 -->
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
2)實現(xiàn)接口
/**
* 使用dubbo中的注解暴露服務
* @Component 可以不用加
*/
@DubboService(interfaceClass = StudentService.class,version = "1.0",timeout = 5000)
public class StudentServiceImpl implements StudentService {
@Override
public Student queryStudent(Integer id) {
Student student = new Student();
if( 1001 == id){
student.setId(1001);
student.setName("------1001-張三");
student.setAge(20);
} else if(1002 == id){
student.setId(1002);
student.setName("#######1002-李四");
student.setAge(22);
}
return student;
}
}
3)application.properties
#配置服務名稱 dubbo:application name="名稱"
spring.application.name=studentservice-provider
#配置掃描的包鸭叙, 掃描的@DubboService
dubbo.scan.base-packages=com.bjpowernode.service
#配置dubbo協(xié)議
#dubbo.protocol.name=dubbo
#dubbo.protocol.port=20881
#注冊中心
dubbo.registry.address=zookeeper://localhost:2181
4)在啟動類的上面
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
7.4消費者
創(chuàng)建SpringBoot項目
1) pom.xml
<dependencies>
<!--加入公共項目的gav-->
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>022-interface-api</artifactId>
<version>1.0.0</version>
</dependency>
<!--dubbo依賴-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<!--zookeeper依賴-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.8</version>
<type>pom</type>
<exclusions>
<!-- 排除log4j依賴 -->
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
- 創(chuàng)建了Controller 或者 Service都可以
@RestController
public class DubboController {
/**
* 引用遠程服務觉啊, 把創(chuàng)建好的代理對象,注入給studentService
*/
//@DubboReference(interfaceClass = StudentService.class,version = "1.0")
/**
* 沒有使用interfaceClass沈贝,默認的就是 引用類型的 數(shù)據(jù)類型
*/
@DubboReference(version = "1.0")
private StudentService studentService;
@GetMapping("/query")
public String queryStudent(Integer id){
Student student = studentService.queryStudent(id);
return "調(diào)用遠程接口杠人,獲取對象:"+student;
}
}
3)application.properties
#指定服務名稱
spring.application.name=consumer-application
#指定注冊中心
dubbo.registry.address=zookeeper://localhost:2181
7.5 練習
使用的技術: SpringBoot ,Dubbo, Redis, MyBatis
Student表:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wjofTbqS-1645599534521)(D:\course\25-SpringBoot\筆記\images\image-20210119150418295.png)]
CREATE TABLE student
(
id
int(11) NOT NULL AUTO_INCREMENT,
name
varchar(255) COLLATE utf8_bin DEFAULT NULL,
phone
varchar(11) COLLATE utf8_bin DEFAULT NULL,
age
int(11) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
-
注冊學生
phone必須唯一, 如果已經(jīng)存在了手機號宋下, 注冊失敗的嗡善。
int addStudent(Student student); 返回值:int 1: 注冊成功 2 : 手機號已經(jīng)存在
name至少兩個字符,
age 必須 大于 0
2) 查詢學生学歧,根據(jù)id查詢惭蹂,此學生。
先到redis查詢學生肛真, 如果redis沒有此學生税弃,從數(shù)據(jù)庫查詢, 把查詢到的學生放入到redis伺帘。
后面再次查詢這個學生應該從redis就能獲取到昭躺。
Student queryStudent(Integer id);
-
使用Dubbo框架, addStudent, queryStudent 是有服務提供者實現(xiàn)的伪嫁。
消費者可以是一個Controller 领炫, 調(diào)用提供者的兩個方法。 實現(xiàn)注冊和查詢张咳。
4)頁面使用html和ajax帝洪,jquery。
在html頁面中提供 form 注冊學生脚猾, 提供文本框輸入id葱峡,進行查詢。
注冊和查詢都使用ajax技術龙助。
html砰奕,jquery.js都放到resources/static目錄中
第八章 打包
8.1 打包war
1.創(chuàng)建了一個jsp應用
2.修改pom.xml
1)指定打包后的文件名稱
<build>
<!--打包后的文件名稱-->
<finalName>myboot</finalName>
</build>
2)指定jsp編譯目錄
<!--resources插件, 把jsp編譯到指定的目錄-->
<resources>
<resource>
<directory>src/main/webapp</directory>
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/*.*</include>
</includes>
</resource>
<!--使用了mybatis ,而且mapper文件放在src/main/java目錄-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!--把src/main/resources下面的所有文件军援,都包含到classes目錄-->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
3)執(zhí)行打包是war
<!--打包類型-->
<packaging>war</packaging>
4)主啟動類繼承SpringBootServletInitializer
/**
* SpringBootServletInitializer: 繼承這個類仅淑, 才能使用獨立tomcat服務器
*/
@SpringBootApplication
public class JspApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(JspApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(JspApplication.class);
}
}
5)部署war
把war放到tomcat等服務器的發(fā)布目錄中。 tomcat為例胸哥, myboot.war放到tomcat/webapps目錄涯竟。
8.2 打包為jar
1.創(chuàng)建了一個包含了jsp的項目
2.修改pom.xml
1) 指定打包后的文件名稱
<build>
<!--打包后的文件名稱-->
<finalName>myboot</finalName>
</build>
- 指定springboot-maven-plugin版本
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--打包jar, 有jsp文件時空厌,必須指定maven-plugin插件的版本是 1.4.2.RELEASE-->
<version>1.4.2.RELEASE</version>
</plugin>
</plugins>
3)最后執(zhí)行 maven clean package
在target目錄中庐船,生成jar 文件, 例子是myboot.jar
執(zhí)行獨立的springboot項目 在cmd中 java -jar myboot.jar
第九章 Thymeleaf 模板引擎
Thymeleaf: 是使用java開發(fā)的模板技術嘲更, 在服務器端運行筐钟。 把處理后的數(shù)據(jù)發(fā)送給瀏覽器。
模板是作視圖層工作的哮内。 顯示數(shù)據(jù)的盗棵。 Thymeleaf是基于Html語言。 Thymleaf語法是應用在
html標簽中 北发。 SpringBoot框架集成Thymealeaf, 使用Thymeleaf代替jsp纹因。
Thymeleaf 的官方網(wǎng)站:http://www.thymeleaf.org
Thymeleaf 官方手冊:https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html
9.1 表達式
-
標準變量表達式
語法: ${key}
作用: 獲取key對于的文本數(shù)據(jù), key 是request作用域中的key 琳拨, 使用request.setAttribute(), model.addAttribute()
在頁面中的 html標簽中瞭恰, 使用 th:text="${key}"
<div style="margin-left: 400px">
<h3>標準變量表達式: ${key}</h3>
<p th:text="${site}">key不存在</p>
<br/>
<p>獲取SysUser對象 屬性值</p>
<p th:text="${myuser.id}">id</p>
<p th:text="${myuser.name}">姓名</p>
<p th:text="${myuser.sex}">姓名:m男</p>
<p th:text="${myuser.age}">年齡</p>
<p th:text="${myuser.getName()}">獲取姓名使用getXXX</p>
</div>
-
選擇變量表達式( 星號變量表達式)
語法: *{key}
作用: 獲取這個key對應的數(shù)據(jù), *{key}需要和th:object 這個屬性一起使用狱庇。
目的是簡單獲取對象的屬性值惊畏。
<p>使用 *{} 獲取SysUser的屬性值</p> <div th:object="${myuser}"> <p th:text="*{id}"></p> <p th:text="*{name}"></p> <p th:text="*{sex}"></p> <p th:text="*{age}"></p> </div> <p>使用*{}完成的表示 對象的屬性值</p> <p th:text="*{myuser.name}" ></p>
-
鏈接表達式
語法: @{url}
作用: 表示鏈接, 可以
<script src="..."> , <link href="..."> <a href=".."> ,<form action="..."> <img src="...">
9.2 Thymeleaf屬性
屬性是放在html元素中的密任,就是html元素的屬性颜启,加入了th前綴。 屬性的作用不變浪讳。 加入上th缰盏, 屬性的值由模板引擎處理了。 在屬性可以使用變量表達式
例如:
<form action="/loginServlet" method="post"></form>
<form th:action="/loginServlet" th:method="${methodAttr}"></form>
9.3 each
each循環(huán)淹遵, 可以循環(huán)List口猜,Array
語法:
在一個html標簽中,使用th:each
<div th:each="集合循環(huán)成員,循環(huán)的狀態(tài)變量:${key}">
<p th:text="${集合循環(huán)成員}" ></p>
</div>
集合循環(huán)成員,循環(huán)的狀態(tài)變量:兩個名稱都是自定義的透揣。 “循環(huán)的狀態(tài)變量”這個名稱可以不定義济炎,默認是"集合循環(huán)成員Stat"
each循環(huán)Map
在一個html標簽中,使用th:each
<div th:each="集合循環(huán)成員,循環(huán)的狀態(tài)變量:${key}">
<p th:text="${集合循環(huán)成員.key}" ></p>
<p th:text="${集合循環(huán)成員.value}" ></p>
</div>
集合循環(huán)成員,循環(huán)的狀態(tài)變量:兩個名稱都是自定義的辐真。 “循環(huán)的狀態(tài)變量”這個名稱可以不定義须尚,默認是"集合循環(huán)成員Stat"
key:map集合中的key
value:map集合key對應的value值
9.4 th:if
"th:if" : 判斷語句崖堤, 當條件為true, 顯示html標簽體內(nèi)恨闪, 反之不顯示 沒有else語句
語法:
<div th:if=" 10 > 0 "> 顯示文本內(nèi)容 </div>
還有一個 th:unless 和 th:if相反的行為
語法:
<div th:unless=" 10 < 0 "> 當條件為false顯示標簽體內(nèi)容 </div>
例子:if
<div style="margin-left: 400px">
<h3> if 使用</h3>
<p th:if="${sex=='m'}">性別是男</p>
<p th:if="${isLogin}">已經(jīng)登錄系統(tǒng)</p>
<p th:if="${age > 20}">年齡大于20</p>
<!--""空字符是true-->
<p th:if="${name}">name是“”</p>
<!--null是false-->
<p th:if="${isOld}"> isOld是null</p>
</div>
例子: unless
<div style="margin-left: 400px">
<h3>unless: 判斷條件為false倘感,顯示標簽體內(nèi)容</h3>
<p th:unless="${sex=='f'}">性別是男的</p>
<p th:unless="${isLogin}">登錄系統(tǒng)</p>
<p th:unless="${isOld}"> isOld是null </p>
</div>
9.5 th:switch
th:switch 和 java中的swith一樣的
語法:
<div th:switch="要比對的值">
<p th:case="值1">
結(jié)果1
</p>
<p th:case="值2">
結(jié)果2
</p>
<p th:case="*">
默認結(jié)果
</p>
以上的case只有一個語句執(zhí)行
</div>
9.6 th:inline
-
內(nèi)聯(lián)text: 在html標簽外,獲取表達式的值
語法:
<p>顯示姓名是:[[${key}]]</p> <div style="margin-left: 400px"> <h3>內(nèi)聯(lián) text, 使用內(nèi)聯(lián)表達式顯示變量的值</h3> <div th:inline="text"> <p>我是[[${name}]]咙咽,年齡是[[${age}]]</p> 我是<span th:text="${name}"></span>,年齡是<span th:text="${age}"></span> </div> <div> <p>使用內(nèi)聯(lián)text</p> <p>我是[[${name}]],性別是[[${sex}]]</p> </div> </div>
- 內(nèi)聯(lián)javascript
例子:
<script type="text/javascript" th:inline="javascript">
var myname = [[${name}]];
var myage = [[${age}]];
//alert("獲取的模板中數(shù)據(jù) "+ myname + ","+myage)
function fun(){
alert("單擊事件,獲取數(shù)據(jù) "+ myname + ","+ [[${sex}]])
}
</script>
9.7 字面量
例子:
<div style="margin-left: 400px">
<h3>文本字面量: 使用單引號括起來的字符串</h3>
<p th:text="'我是'+${name}+',我所在的城市'+${city}">數(shù)據(jù)顯示</p>
<h3>數(shù)字字面量</h3>
<p th:if="${20>5}"> 20大于 5</p>
<h3>boolean字面量</h3>
<p th:if="${isLogin == true}">用戶已經(jīng)登錄系統(tǒng)</p>
<h3>null字面量</h3>
<p th:if="${myuser != null}">有myuser數(shù)據(jù)</p>
</div>
9.8 字符串連接
連接字符串有兩種語法
1) 語法使用 單引號括起來字符串 淤年, 使用 + 連接其他的 字符串或者表達式
<p th:text="'我是'+${name}+',我所在的城市'+${city}">數(shù)據(jù)顯示</p>
2)語法:使用雙豎線钧敞, |字符串和表達式|
<p th:text="|我是${name},我所在城市${city|">
顯示數(shù)據(jù)
</p>
例子:
<div style="margin-left: 400px">
<h3>字符串連接方式1:使用單引號括起來的字符串</h3>
<p th:text="'我是'+${name}+',我所在的城市'+${city}">數(shù)據(jù)顯示</p>
<br/>
<br/>
<h3>字符串連接方式2:|字符串和表達式|</h3>
<p th:text="|我是${name},所在城市${city},其他人${myuser.name}|"></p>
</div>
9.9 運算符
算術運 算: + , - - , * , / , %
關系比較 : > , < , >= , <= ( gt , lt , ge , le )
相等判斷: == , != ( eq , ne )
<div style="margin-left: 400px">
<h3>使用運算符</h3>
<p th:text="${age > 10}">年齡大于 10 </p>
<p th:text="${ 20 + 30 }">顯示運算結(jié)果</p>
<p th:if="${myuser == null}">myuser是null</p>
<p th:if="${myuser eq null}">myuser是null</p>
<p th:if="${myuser ne null}">myuser不是null</p>
<p th:text="${isLogin == true ? '用戶已經(jīng)登錄' : '用戶需要登錄'}"></p>
<p th:text="${isLogin == true ? ( age > 10 ? '用戶是大于10的' : '用戶年齡比較小') : '用戶需要登錄'}"></p>
</div>
三元運算符:
表達式 ? true的結(jié)果 : false的結(jié)果
三元運算符可以嵌套
9.10 內(nèi)置對象
request 表示 HttpServletRequest
session 表示 HttpSession對象
session 表示Map對象的麸粮, 是#session的簡單表示方式溉苛, 用來獲取session中指定的key的值
#session.getAttribute("loginname") == session.loginname
這些是內(nèi)置對象,可以在模板文件中直接使用弄诲。
例子:
<div style="margin-left: 350px">
<h3>內(nèi)置對象#request,#session愚战,session的使用</h3>
<p>獲取作用域中的數(shù)據(jù)</p>
<p th:text="${#request.getAttribute('requestData')}"></p>
<p th:text="${#session.getAttribute('sessionData')}"></p>
<p th:text="${session.loginname}"></p>
<br/>
<br/>
<h3>使用內(nèi)置對象的方法</h3>
getRequestURL=<span th:text="${#request.getRequestURL()}"></span><br/>
getRequestURI=<span th:text="${#request.getRequestURI()}"></span><br/>
getQueryString=<span th:text="${#request.getQueryString()}"></span><br/>
getContextPath=<span th:text="${#request.getContextPath()}"></span><br/>
getServerName=<span th:text="${#request.getServerName()}"></span><br/>
getServerPort=<span th:text="${#request.getServerPort()}"></span><br/>
</div>
9.11 內(nèi)置工具類
內(nèi)置工具類型: Thymeleaf自己的一些類,提供對string齐遵, date 寂玲,集合的一些處理方法
dates: 處理日器的工具類
numbers:處理數(shù)字的
lists: 處理list集合的
<div style="margin-left: 350px">
<h3>日期類對象 #dates</h3>
<p th:text="${#dates.format(mydate )}"></p>
<p th:text="${#dates.format(mydate,'yyyy-MM-dd')}"></p>
<p th:text="${#dates.format(mydate,'yyyy-MM-dd HH:mm:ss')}"></p>
<p th:text="${#dates.year(mydate)}"></p>
<p th:text="${#dates.month(mydate)}"></p>
<p th:text="${#dates.monthName(mydate)}"></p>
<p th:text="${#dates.createNow()}"></p>
<br/>
<h3>內(nèi)置工具類#numbers,操作數(shù)字的</h3>
<p th:text="${#numbers.formatCurrency(mynum)}"></p>
<p th:text="${#numbers.formatDecimal(mynum,5,2)}"></p>
<br/>
<h3>內(nèi)置工具類#strings,操作字符串</h3>
<p th:text="${#strings.toUpperCase(mystr)}"></p>
<p th:text="${#strings.indexOf(mystr,'power')}"></p>
<p th:text="${#strings.substring(mystr,2,5)}"></p>
<p th:text="${#strings.substring(mystr,2)}"></p>
<p th:text="${#strings.concat(mystr,'---java開發(fā)的黃埔軍校---')}"></p>
<p th:text="${#strings.length(mystr)}"></p>
<p th:text="${#strings.length('hello')}"></p>
<p th:unless="${#strings.isEmpty(mystr)}"> mystring 不是 空字符串 </p>
<br/>
<h3>內(nèi)置工具類#lists,操作list集合</h3>
<p th:text="${#lists.size(mylist)}"></p>
<p th:if="${#lists.contains(mylist,'a')}">有成員a</p>
<p th:if="!${#lists.isEmpty(mylist)}"> list 集合有多個成員</p>
<br/>
<h3>處理null</h3>
<p th:text="${zoo?.dog?.name}"></p>
</div>
9.12 自定義模板
模板是內(nèi)容復用梗摇, 定義一次拓哟,在其他的模板文件中多次使用。
模板使用:
1.定義模板
2.使用模板
模板定義語法:
th:fragment="模板自定義名稱"
例如:
<div th:fragment="head">
<p>
動力節(jié)點-java開發(fā)
</p>
<p>
www.bjpowernode.com
</p>
</div>
引用模板語法:
1) ~{templatename :: selector}
templatename: 文件名稱
selector: 自定義模板名稱
2)templatename :: selector
templatename: 文件名稱
selector: 自定義模板名稱
對于使用模板:有包含模板(th:include)伶授, 插入模板(th:insert)
第十章 總結(jié)
10.1 注解
Spring + SpringMVC + SpringBoot
創(chuàng)建對象的:
@Controller: 放在類的上面断序,創(chuàng)建控制器對象,注入到容器中
@RestController: 放在類的上面糜烹,創(chuàng)建控制器對象违诗,注入到容器中。
作用:復合注解是@Controller , @ResponseBody, 使用這個注解類的疮蹦,里面的控制器方法的返回值 都是數(shù)據(jù)
@Service : 放在業(yè)務層的實現(xiàn)類上面诸迟,創(chuàng)建service對象,注入到容器
@Repository : 放在dao層的實現(xiàn)類上面挚币,創(chuàng)建dao對象亮蒋,放入到容器。 沒有使用這個注解妆毕,是因為現(xiàn)在使用MyBatis框 架慎玖, dao對象是MyBatis通過代理生成的。 不需要使用@Repository笛粘、 所以沒有使用趁怔。
@Component: 放在類的上面湿硝,創(chuàng)建此類的對象,放入到容器中润努。
賦值的:
@Value : 簡單類型的賦值关斜, 例如 在屬性的上面使用@Value("李四") private String name
還可以使用@Value,獲取配置文件者的數(shù)據(jù)(properties或yml)。
@Value("${server.port}") private Integer port
@Autowired: 引用類型賦值自動注入的铺浇,支持byName, byType. 默認是byType 痢畜。 放在屬性的上面,也可以放在構(gòu)造 方法的上面鳍侣。 推薦是放在構(gòu)造方法的上面
@Qualifer: 給引用類型賦值丁稀,使用byName方式。
@Autowird, @Qualifer都是Spring框架提供的倚聚。
@Resource : 來自jdk中的定義线衫, javax.annotation。 實現(xiàn)引用類型的自動注入惑折, 支持byName, byType.
默認是byName, 如果byName失敗授账, 再使用byType注入。 在屬性上面使用
其他:
@Configuration : 放在類的上面惨驶,表示這是個配置類白热,相當于xml配置文件
@Bean:放在方法的上面, 把方法的返回值對象敞咧,注入到spring容器中棘捣。
@ImportResource : 加載其他的xml配置文件, 把文件中的對象注入到spring容器中
@PropertySource : 讀取其他的properties屬性配置文件
@ComponentScan: 掃描器 休建,指定包名乍恐,掃描注解的
@ResponseBody: 放在方法的上面,表示方法的返回值是數(shù)據(jù)测砂, 不是視圖
@RequestBody : 把請求體中的數(shù)據(jù)茵烈,讀取出來, 轉(zhuǎn)為java對象使用砌些。
@ControllerAdvice: 控制器增強呜投, 放在類的上面, 表示此類提供了方法存璃,可以對controller增強功能仑荐。
@ExceptionHandler : 處理異常的,放在方法的上面
@Transcational : 處理事務的纵东, 放在service實現(xiàn)類的public方法上面粘招, 表示此方法有事務
SpringBoot中使用的注解
@SpringBootApplication : 放在啟動類上面, 包含了@SpringBootConfiguration
@EnableAutoConfiguration偎球, @ComponentScan
MyBatis相關的注解
@Mapper : 放在類的上面 洒扎, 讓MyBatis找到接口辑甜, 創(chuàng)建他的代理對象
@MapperScan :放在主類的上面 , 指定掃描的包袍冷, 把這個包中的所有接口都創(chuàng)建代理對象磷醋。 對象注入到容器中
@Param : 放在dao接口的方法的形參前面, 作為命名參數(shù)使用的胡诗。
Dubbo注解
@DubboService: 在提供者端使用的邓线,暴露服務的, 放在接口的實現(xiàn)類上面
@DubboReference: 在消費者端使用的乃戈, 引用遠程服務褂痰, 放在屬性上面使用。
@EnableDubbo : 放在主類上面症虑, 表示當前引用啟用Dubbo功能。
引用模板語法:
1) ~{templatename :: selector}
templatename: 文件名稱
selector: 自定義模板名稱
2)templatename :: selector
templatename: 文件名稱
selector: 自定義模板名稱
對于使用模板:有包含模板(th:include)归薛, 插入模板(th:insert)
第十章 總結(jié)
10.1 注解
Spring + SpringMVC + SpringBoot
創(chuàng)建對象的:
@Controller: 放在類的上面谍憔,創(chuàng)建控制器對象,注入到容器中
@RestController: 放在類的上面主籍,創(chuàng)建控制器對象习贫,注入到容器中。
作用:復合注解是@Controller , @ResponseBody, 使用這個注解類的千元,里面的控制器方法的返回值 都是數(shù)據(jù)
@Service : 放在業(yè)務層的實現(xiàn)類上面苫昌,創(chuàng)建service對象,注入到容器
@Repository : 放在dao層的實現(xiàn)類上面幸海,創(chuàng)建dao對象祟身,放入到容器。 沒有使用這個注解物独,是因為現(xiàn)在使用MyBatis框 架袜硫, dao對象是MyBatis通過代理生成的。 不需要使用@Repository挡篓、 所以沒有使用婉陷。
@Component: 放在類的上面,創(chuàng)建此類的對象官研,放入到容器中秽澳。
賦值的:
@Value : 簡單類型的賦值, 例如 在屬性的上面使用@Value("李四") private String name
還可以使用@Value,獲取配置文件者的數(shù)據(jù)(properties或yml)戏羽。
@Value("${server.port}") private Integer port
@Autowired: 引用類型賦值自動注入的担神,支持byName, byType. 默認是byType 。 放在屬性的上面蛛壳,也可以放在構(gòu)造 方法的上面杏瞻。 推薦是放在構(gòu)造方法的上面
@Qualifer: 給引用類型賦值所刀,使用byName方式。
@Autowird, @Qualifer都是Spring框架提供的捞挥。
@Resource : 來自jdk中的定義浮创, javax.annotation。 實現(xiàn)引用類型的自動注入砌函, 支持byName, byType.
默認是byName, 如果byName失敗斩披, 再使用byType注入。 在屬性上面使用
其他:
@Configuration : 放在類的上面讹俊,表示這是個配置類垦沉,相當于xml配置文件
@Bean:放在方法的上面, 把方法的返回值對象仍劈,注入到spring容器中厕倍。
@ImportResource : 加載其他的xml配置文件, 把文件中的對象注入到spring容器中
@PropertySource : 讀取其他的properties屬性配置文件
@ComponentScan: 掃描器 贩疙,指定包名讹弯,掃描注解的
@ResponseBody: 放在方法的上面,表示方法的返回值是數(shù)據(jù)这溅, 不是視圖
@RequestBody : 把請求體中的數(shù)據(jù)组民,讀取出來, 轉(zhuǎn)為java對象使用悲靴。
@ControllerAdvice: 控制器增強臭胜, 放在類的上面, 表示此類提供了方法癞尚,可以對controller增強功能耸三。
@ExceptionHandler : 處理異常的,放在方法的上面
@Transcational : 處理事務的否纬, 放在service實現(xiàn)類的public方法上面吕晌, 表示此方法有事務
SpringBoot中使用的注解
@SpringBootApplication : 放在啟動類上面, 包含了@SpringBootConfiguration
@EnableAutoConfiguration临燃, @ComponentScan
MyBatis相關的注解
@Mapper : 放在類的上面 睛驳, 讓MyBatis找到接口, 創(chuàng)建他的代理對象
@MapperScan :放在主類的上面 膜廊, 指定掃描的包乏沸, 把這個包中的所有接口都創(chuàng)建代理對象。 對象注入到容器中
@Param : 放在dao接口的方法的形參前面爪瓜, 作為命名參數(shù)使用的蹬跃。
Dubbo注解
@DubboService: 在提供者端使用的,暴露服務的铆铆, 放在接口的實現(xiàn)類上面
@DubboReference: 在消費者端使用的蝶缀, 引用遠程服務丹喻, 放在屬性上面使用。
@EnableDubbo : 放在主類上面翁都, 表示當前引用啟用Dubbo功能碍论。