Spring Boot入門教程挪圾,帶你快速學會使用springboot

動力節(jié)點王鶴老師的SpringBoot入門教程寥假,通俗易懂芙代,是基于SpringBoot2.4版本講解旭旭。

從細節(jié)入手央勒,每個事例先講解pom.xml中的重要依賴不见,其次application配置文件,最后是代碼實現(xiàn)崔步。讓你知其所以稳吮,逐步讓掌握SpringBoot框架的自動配置,starter起步依賴等特性井濒。

視頻資源

https://www.bilibili.com/video/BV1XQ4y1m7ex

SpringBoot

第一章 JavaConfig

  1. 為什么要使用 Spring Boot

    因為Spring灶似, SpringMVC 需要使用的大量的配置文件 (xml文件)

    還需要配置各種對象,把使用的對象放入到spring容器中才能使用對象

    需要了解其他框架配置規(guī)則瑞你。

  2. SpringBoot 就相當于 不需要配置文件的Spring+SpringMVC酪惭。 常用的框架和第三方庫都已經(jīng)配置好了。

    拿來就可以使用了者甲。

  3. 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ù)际歼。

步驟:

  1. 在resources目錄下,創(chuàng)建properties文件姑蓝, 使用k=v的格式提供數(shù)據(jù)
  2. 在PropertyResource 指定properties文件的位置
  3. 使用@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)的地址

https://start.springboot.io

[外鏈圖片轉(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>
  1. 如果需要使用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>

  1. 創(chuàng)建一個存放jsp的目錄,一般叫做webapp

    index.jsp

  1. 需要在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)自定義攔截器:

  1. 創(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對象冀痕。

使用步驟:

  1. 創(chuàng)建Servlet類。 創(chuàng)建類繼承HttpServlet
  2. 注冊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();

    }
}
  1. 注冊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)整跟伏。 常常在過濾器中處理字符編碼

在框架中使用過濾器:

  1. 創(chuàng)建自定義過濾器類
  2. 注冊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 注冊過濾器受扳。 配置他的屬性。

第一種方式:

使用步驟:

  1. 配置字符集過濾器

    @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;
        }
    }
    
  2. 修改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

使用步驟:

  1. mybatis起步依賴 : 完成mybatis對象自動配置仅乓, 對象放在容器中

  2. pom.xml 指定把src/main/java目錄中的xml文件包含到classpath中

  3. 創(chuàng)建實體類Student

  4. 創(chuàng)建Dao接口 StudentDao , 創(chuàng)建一個查詢學生的方法

  5. 創(chuàng)建Dao接口對應的Mapper文件赖舟, xml文件, 寫sql語句

  6. 創(chuàng)建Service層對象夸楣, 創(chuàng)建StudentService接口和他的實現(xiàn)類宾抓。 去dao對象的方法。完成數(shù)據(jù)庫的操作

  7. 創(chuàng)建Controller對象豫喧,訪問Service石洗。

  8. 寫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
  1. 在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動作操作資源。
  1. 注解

@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
  1. 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)步驟:

  1. application.properties(yml) : 開啟使用 HiddenHttpMethodFilter 過濾器
  2. 在請求頁面中鲫售,包含 _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>
  1. 創(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;

  1. 注冊學生

    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);
  1. 使用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>
  1. 指定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 表達式

  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>
  1. 選擇變量表達式( 星號變量表達式)

    語法: *{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>
    
  2. 鏈接表達式

    語法: @{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

  1. 內(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>
    
  1. 內(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)置對象

文檔地址:https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#web-context-namespaces-for-requestsession-attributes-etc.

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功能碍论。
    
    
    
    
    


    


?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市柄慰,隨后出現(xiàn)的幾起案子鳍悠,更是在濱河造成了極大的恐慌,老刑警劉巖坐搔,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藏研,死亡現(xiàn)場離奇詭異,居然都是意外死亡概行,警方通過查閱死者的電腦和手機蠢挡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凳忙,“玉大人袒哥,你說我怎么就攤上這事∠裕” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵瞎抛,是天一觀的道長艺演。 經(jīng)常有香客問我,道長桐臊,這世上最難降的妖魔是什么胎撤? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮断凶,結(jié)果婚禮上伤提,老公的妹妹穿的比我還像新娘。我一直安慰自己认烁,他們只是感情好肿男,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著却嗡,像睡著了一般舶沛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窗价,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天如庭,我揣著相機與錄音,去河邊找鬼撼港。 笑死坪它,一個胖子當著我的面吹牛骤竹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播往毡,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼蒙揣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卖擅?” 一聲冷哼從身側(cè)響起鸣奔,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惩阶,沒想到半個月后挎狸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡断楷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年锨匆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冬筒。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡恐锣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舞痰,到底是詐尸還是另有隱情土榴,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布响牛,位于F島的核電站玷禽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏呀打。R本人自食惡果不足惜矢赁,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贬丛。 院中可真熱鬧撩银,春花似錦、人聲如沸豺憔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焕阿。三九已至咪啡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間暮屡,已是汗流浹背撤摸。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人准夷。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓钥飞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親衫嵌。 傳聞我的和親對象是個殘疾皇子读宙,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容