一、基礎理論
1、產生背景
SSM開發web應用配置複雜,springboot極大地簡化了配置,讓開發人員更多關注與業務邏輯的實現。
2、Springboot特性
A。能夠快速創建基於spring的應用程序。
B。java main方法可啓動內嵌的tomcat服務器來運行springboot程序,不需要部署war包文件。
C。起步依賴簡化maven配置。
D。根據maven依賴自動配置spring、springmvc。
E。完全棄用XML配置,採用註解配置。
3、Springboot四大核心
自動配置:自動配置spring、springmvc。
起步依賴:起簡化maven配置。
Actutor:健康檢查,檢測程序運行狀況,一般用不到。
命令化界面:一般也用不到。
一般只用得到前兩種。
4、springboot零碎知識點
resources目錄下:
static:存放圖片、js、cs等靜態資源。
templates:存放前端模板。
application.properties:springboot核心配置文件。
SpringBootApplication:
springboot項目入口類中的核心註解,沒有該註解,該入口類就是普通的java類。
注意:
springboot項目的所有代碼類必須在入口類同級或下一級的目錄位置。
5、springboot核心配置文件
可以是*.properties文件,也可以是*.yml(*.ymal)文件,都是鍵值對形式
兩個同時存在,以*.properties爲準
*.yml雖然也是鍵值對形式,但是書寫格式還是有不同的,用到的時候百度
配置文件常用做法:
application-dev.properties:開發環境配置文件
application-tes.properties:測試環境配置文件
application-pro.properties:生產環境配置文件
然後在application.properties中設置:
spring.profiles.active=dev //表明當前生效的是開發環境的配置文件
6、自定義配置
A、將自定義配置映射到屬性
aplication.properties中:
#自定義配置,將配置的屬性自動注入到屬性中
name=lily
age=18
代碼中:
@Value("${name}") //自動注入配置文件的中name的值
private String name;
@Value("${age}") //自動注入配置文件的中age的值
private int age;
//獲取自動注入的屬性值,打印在前臺
@RequestMapping(value="intro")
@ResponseBody
public String intro(){
return "I'm "+name+","+age+" years old!!";
}
B、將自定義配置映射到對象
aplication.properties中:
#自定義配置,將配置的對象屬性自動注入到屬性中
school.name=CAUC
school.address=Tianjin
對應配置類:
@Component //將此類交給Spring容器進行管理,方便諸如對象
@ConfigurationProperties(prefix = "school") //本類只讀取配置文件中前綴爲school的屬性
public class School {
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
代碼中:
@Autowired //自動注入對象
private School school;
//獲取自動注入的對象的屬性值,打印在前臺
@RequestMapping(value="intro2")
@ResponseBody
public String intro2(){
return school.getName()+" is a university in "+school.getAddress();
}
7、注意事項
ConfigurationProperties警告:
在使用@ConfigurationProperties註解時,會報一個警告:
Spring Boot Configuration Annotation Processor not Configured。算該警告不影響運行,但看着煩,如何解決??
解決方式,在pom.xml文件中添加如下依賴即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
application.properties中文亂碼問題 :
見圖片A
二、Springboot集成jsp
1、前置設置:
main-->new-->directory-->webapp(創建web資源文件夾)
file-->project structure-->modules-->找到該項目-->web-->將剛剛創建的webapp設置爲web資源文件路徑
具體見圖B
2、添加jsp依賴
<!--引入springboot內嵌tomcat對jsp的解析依賴,不引入不能解析jsp-->
<!--如果要使用jstl\el還需要引入其他的依賴纔行-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
3、指定jsp編譯文件路徑
在<build>標籤中添加:
<!--執行jsp文件編譯路徑-->
<resources>
<resource>
<!--源文件夾-->
<directory>src/main/webapp</directory>
<!--目標文件夾-->
<targetPath>META-INF/resources</targetPath>
<includes>
<!--源文件夾所有內容均要被編譯-->
<include>*.*</include>
</includes>
</resource>
</resources>
4、設置SpringMC的視圖解析器
aplication.properties中:
#配置springmvc的視圖解析器
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp
webapp/show1.jsp文件:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>show1.jsp</title>
</head>
<body>
<H1>${message}</H1>
</body>
webapp/show2.jsp文件:
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>show2.jsp</title>
</head>
<body>
<H1>${message}</H1>
</body>
</html>
代碼中:
/*
視圖解析器
*/
@RequestMapping(value="show1")
public ModelAndView show1(){//ModelAndView可以返回一個jsp頁面,且可用來設置jsp內容
ModelAndView model=new ModelAndView();
model.addObject("message","hello,springboot");
model.setViewName("show1");
return model;
}
@RequestMapping(value="show2")
public String show2(Model model){
model.addAttribute("message","hello2,springboot");
return "show2";
}
三、springboot集成mybatis
1、修改pom.xml文件
<!--集成mybatis,需要添加mysql依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--springboot集成mybatis的起步依賴,版本號自己加-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
2、利用mybatis的逆向工程對單表生成實體bean、映射文件、mapper接口
在項目根目錄新建文件GeneratorMapper.xml,添加如下內容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!--dtd文件報紅沒關係-->
<generatorConfiguration>
<!-- 指定連接數據庫的JDBC驅動包所在位置,指定到你本機的完整路徑 -->
<classPathEntry location="G:\SoftwareInstall\maven\apache-maven-3.3.9\repository\mysql-connector-java-5.1.38.jar"/>
<!-- 配置table表信息內容體,targetRuntime指定採用MyBatis3的版本 -->
<context id="tables" targetRuntime="MyBatis3">
<!-- 抑制生成註釋,由於生成的註釋都是英文的,可以不讓它生成 -->
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- 配置數據庫連接信息 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/d_student"
userId="root"
password="123456">
</jdbcConnection>
<!--三個重要的生成器-->
<!-- 生成model類(實體類),targetPackage指定model類的包名, targetProject指定生成的model放在eclipse的哪個工程下面-->
<javaModelGenerator targetPackage="com.farben.springboot.model" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
<property name="trimStrings" value="false" />
</javaModelGenerator>
<!-- 生成MyBatis的Mapper.xml文件,targetPackage指定mapper.xml文件的包名, targetProject指定生成的mapper.xml放在eclipse的哪個工程下面 -->
<sqlMapGenerator targetPackage="com.farben.springboot.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- 生成MyBatis的Mapper接口類文件,targetPackage指定Mapper接口類的包名, targetProject指定生成的Mapper接口放在eclipse的哪個工程下面 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.farben.springboot.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!--表名和實體類名 -->
<table tableName="t_student"
domainObjectName="Student"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false"/>
</context>
</generatorConfiguration>
在pom.xml文件中添加插件依賴:
<!--mybatis逆向工程需要的插件:自動生成代碼-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<!--配置文件的位置-->
<configurationFile>GeneratorMapper.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
3、配置完成後在maven的plugins中找到mybatis-generator:generate並雙擊,即可生成實體類、映射文件和mapper接口。
見圖3.1
4、生成的實體bean、mapper接口和映射文件
實體bean:
import java.util.Date;
public class Student {
private Integer sid;
private String sname;
private Date sage;
private String ssex;
public Integer getSid() {return sid;}
public void setSid(Integer sid) {this.sid = sid; }
public String getSname() {return sname;}
public void setSname(String sname) {this.sname = sname;}
public Date getSage() {return sage;}
public void setSage(Date sage) {this.sage = sage;}
public String getSsex() { return ssex;}
public void setSsex(String ssex) {this.ssex = ssex;}
}
mapper接口:
public interface StudentMapper {
int deleteByPrimaryKey(Integer sid);
/**
* 傳入對象進行
* 修改和選擇性修改
*
* @param record
* @return
*/
int insert(Student record);
int insertSelective(Student record);
Student selectByPrimaryKey(Integer sid);
/**
* 傳入對象進行
* 更新和選擇性更新
* @param record
* @return
*/
int updateByPrimaryKeySelective(Student record);
int updateByPrimaryKey(Student record);
}
映射文件StudentMapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.farben.springboot.mapper.StudentMapper">
<!--
數據庫與實體類映射關係
resultMap:
1、數據庫字段與實體類屬性不一致,可以轉換
2、查詢結果不對應表時,可以映射出一個結果集(比如多表聯查)
-->
<resultMap id="BaseResultMap" type="com.farben.springboot.model.Student">
<!--
id爲主鍵,result爲主鍵外其他字段
column:數據庫字段
jdbcType:數據庫字段類型,可不寫
property:對應的實體類屬性
注意:如果mysql中字段爲多個單詞,則必須使用“_”連接,這樣生成的實體類字段以駝峯原則命名
-->
<id column="sid" jdbcType="INTEGER" property="sid" />
<result column="sname" jdbcType="VARCHAR" property="sname" />
<result column="sage" jdbcType="DATE" property="sage" />
<result column="ssex" jdbcType="CHAR" property="ssex" />
</resultMap>
<!--公共的sql片段-->
<sql id="Base_Column_List">
sid, sname, sage, ssex
</sql>
<!--
通過主鍵查詢
id:方法名
parameterType:參數類型,可不寫
resultMap:返回值類型
-->
<select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from t_student
where sid = #{sid,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from t_student
where sid = #{sid,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.farben.springboot.model.Student">
insert into t_student (sid, sname, sage,
ssex)
values (#{sid,jdbcType=INTEGER}, #{sname,jdbcType=VARCHAR}, #{sage,jdbcType=DATE},
#{ssex,jdbcType=CHAR})
</insert>
<!--
選擇性插入,可以控制哪些字段有值,哪些沒值
prefix:前綴
suffix:後綴
suffixOverrides:去除多餘逗號
-->
<insert id="insertSelective" parameterType="com.farben.springboot.model.Student">
insert into t_student
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="sid != null">
sid,
</if>
<if test="sname != null">
sname,
</if>
<if test="sage != null">
sage,
</if>
<if test="ssex != null">
ssex,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="sid != null">
#{sid,jdbcType=INTEGER},
</if>
<if test="sname != null">
#{sname,jdbcType=VARCHAR},
</if>
<if test="sage != null">
#{sage,jdbcType=DATE},
</if>
<if test="ssex != null">
#{ssex,jdbcType=CHAR},
</if>
</trim>
</insert>
<!--
選擇性更新,可以控制哪些字段有值,哪些沒值
prefix:前綴
suffix:後綴
suffixOverrides:去除多餘逗號
-->
<update id="updateByPrimaryKeySelective" parameterType="com.farben.springboot.model.Student">
update t_student
<set>
<if test="sname != null">
sname = #{sname,jdbcType=VARCHAR},
</if>
<if test="sage != null">
sage = #{sage,jdbcType=DATE},
</if>
<if test="ssex != null">
ssex = #{ssex,jdbcType=CHAR},
</if>
</set>
where sid = #{sid,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="com.farben.springboot.model.Student">
update t_student
set sname = #{sname,jdbcType=VARCHAR},
sage = #{sage,jdbcType=DATE},
ssex = #{ssex,jdbcType=CHAR}
where sid = #{sid,jdbcType=INTEGER}
</update>
</mapper>
5、注意事項
在java文件夾只能編譯java文件,而mapper包下的mapper映射文件是配置文件,無法編譯!
解決方案一:在pom.xml文件中的<build>標籤的子標籤<resources>標籤中添加:
<!--
java文件下只編譯java文件,無法編譯mapper包下的xml映射文件,這兒將其定義爲資源文件夾就行
-->
<resource>
<directory>src/main/java</directory>
<includes>
<!--
**代表子文件夾
**.*.xml代表子文件夾下的以xml結尾的文件
-->
<include>**/*.xml</include>
</includes>
</resource>
解決方案二:
在項目的resources下新建mapper文件夾並剪切移入所有的映射文件
然後再*.properties中配置:
mybatis.mapper-locations=classpath:mapper/*.xml
兩種方式都很常用
四、SpringBoot集成Mybatis示例
1、pom.xml文件
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.farben.unit</groupId>
<artifactId>springunit</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--springboot web項目起步依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--springboot web項目測試起步依賴,沒什麼用-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--
以下依賴均爲手動添加
-->
<!--解決@ConfigurationProperties註解報警告的依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--引入springboot內嵌tomcat對jsp的解析依賴,不引入不能解析jsp-->
<!--如果要使用jstl\el還需要引入其他的依賴纔行-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!--集成mybatis,需要添加mysql依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--springboot集成mybatis的起步依賴-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
<build>
<resources>
<!--
java文件下只編譯java文件,無法編譯mapper包下的xml映射文件,這兒將其定義爲資源文件夾就行
-->
<resource>
<directory>src/main/java</directory>
<includes>
<!--
**代表子文件夾
**.*.xml代表子文件夾下的以xml結尾的文件
-->
<include>**/*.xml</include>
</includes>
</resource>
<!--執行jsp文件編譯路徑-->
<resource>
<!--源文件夾-->
<directory>src/main/webapp</directory>
<!--目標文件夾-->
<targetPath>META-INF/resources</targetPath>
<includes>
<!--源文件夾所有內容均要被編譯-->
<include>*.*</include>
</includes>
</resource>
</resources>
<plugins>
<!--編譯打包插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--mybatis逆向工程需要的插件:自動生成代碼-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<!--配置文件的位置-->
<configurationFile>GeneratorMapper.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
</project>
2、application.properties文件
#給內置tomcat配置端口
server.port=8090
#設置上下文根,訪問servlet別名前需加/s
server.servlet.context-path=/s
#配置數據庫連接 mysql8的驅動名稱變了,是com.mysql.cj.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/d_student?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
3、GeneratorMapper.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 指定連接數據庫的JDBC驅動包所在位置,指定到你本機的完整路徑 -->
<classPathEntry location="G:\SoftwareInstall\maven\apache-maven-3.3.9\repository\mysql-connector-java-5.1.38.jar"/>
<!-- 配置table表信息內容體,targetRuntime指定採用MyBatis3的版本 -->
<context id="tables" targetRuntime="MyBatis3">
<!-- 抑制生成註釋,由於生成的註釋都是英文的,可以不讓它生成 -->
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- 配置數據庫連接信息 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/d_student"
userId="root"
password="123456">
</jdbcConnection>
<!--三個重要的生成器-->
<!-- 生成model類(實體類),targetPackage指定model類的包名, targetProject指定生成的model放在eclipse的哪個工程下面-->
<javaModelGenerator targetPackage="com.farben.springboot.model" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
<property name="trimStrings" value="false" />
</javaModelGenerator>
<!-- 生成MyBatis的Mapper.xml文件,targetPackage指定mapper.xml文件的包名, targetProject指定生成的mapper.xml放在eclipse的哪個工程下面 -->
<sqlMapGenerator targetPackage="com.farben.springboot.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- 生成MyBatis的Mapper接口類文件,targetPackage指定Mapper接口類的包名, targetProject指定生成的Mapper接口放在eclipse的哪個工程下面 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.farben.springboot.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!--表名和實體類名 -->
<table tableName="t_student"
domainObjectName="Student"
enableCountByExample="false"
enableUpdateByExample="false"
enableDeleteByExample="false"
enableSelectByExample="false"
selectByExampleQueryId="false"/>
</context>
</generatorConfiguration>
4、代碼
控制層Controller
@Controller
public class StudentController {
@Autowired //注入service層對象
private StudentService service;
@RequestMapping(value="stu")
@ResponseBody
public Object getOneStudent(Integer id){
Student student=service.getStudentById(id);
return student;
}
}
業務層service
public interface StudentService {
Student getStudentById(Integer id);
}
@Service //掃描service到spring容器,便於自動注入對象
public class StudentServiceImpl implements StudentService {
@Autowired //自動注入mapper層對象
private StudentMapper mapper;
@Override
public Student getStudentById(Integer id) {
return mapper.selectByPrimaryKey(id);
}
}
model層:自動生成
mapper層:自動生成
只是mapper接口需要添加@Mapper註解即可
如下圖:
@Mapper //掃描mapper接口到spring容器,便於自動注入對象
public interface StudentMapper {
int deleteByPrimaryKey(Integer sid);
int insert(Student record);
int insertSelective(Student record);
Student selectByPrimaryKey(Integer sid);
int updateByPrimaryKeySelective(Student record);
int updateByPrimaryKey(Student record);
}
注意:
mapper層註解卸載接口上,service層註解卸載實現類上。
注意事項:
如果是多表查詢,則必然有多個mapper接口,每個mapper接口都手動添加@Mapper註解,很繁瑣
解決:
所有mapper接口均不需要添加@Mapper註解
改爲在springboot啓動入口程序類上添加:
@MapperScan(basePackages = "com.farben.springboot.mapper")
指定需要掃描的mapper包的具體路徑,此後該mapper包下所有類都可以使用註解@Autowired自動注入對象。
5、補充springboot事務
只需要在Service實現類的增刪改方法上增加一個@Transactional註解即可。
注意:
在springboot2.0版本之前,還需要在入口類上添加@EnableTransactionManagement註解來開啓事務。
示例:
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentMapper mapper;
@Override
@Transactional // 開啓事務並自動提交 10/0失敗,則查詢也會失敗
public Integer updateByid(Student student) {
Integer result=mapper.updateByPrimaryKeySelective(student);
Integer i=10/0;
return result;
}
}
五、SpringBoot集成SpringMVC
1、新建好一個springboot項目,其實就集成好了SpringMVC。
2、SpringMVC自定義視圖解析器,見SpringBoot集成JSP。
3、SpringMVC核心註解
@Controller:
表名該類是控制層,用於處理http請求。
@ResponseBody:
表名該方法返回一個json字符串。
@RestController:
表名該controller類下所有方法都返回一個json字符串。
@RequestMapping:
表名該方法可用來處理GET和post請求。用來給servlet起別名。
@GetMapping:
表名該方法可用來處理GET請求。用來給servlet起別名。
@PostMapping:
表名該方法可用來處理POST請求。用來給servlet起別名。
注意:
從瀏覽器地址欄發的請求都是GET請求,要發post請求可以使用postman客戶端。
還有兩個用得不多的註解:
@DeleteMapping:
表名該方法可用來處理DELETE請求。用來給servlet起別名。
@PutMapping:
表名該方法可用來處理PUT請求。用來給servlet起別名。
六、Springboot實現RESTful
1、RESTful是一種軟件設計風格,一個架構只要符合RESTful原則,責成其爲RESTful架構。
說白了就是在瀏覽器地址欄以路徑的方式傳參。
2、示例
訪問一個接口的HTTP地址:http://localhost:8090/s/stu?id=3
RESTful風格的HTTP地址:http://localhost:8090/s/stu/3
而在Controller層的servlet方法中:
/**
* RESTful
* 原則一:
* 新增用PostMapping,刪除用DeleteMapping,修改用PutMapping,查詢用GetMappring
* 這樣的話如果增刪改都要傳sid和sname參數
* 當都通過http://localhost:8090/s/stu/info/1/趙雷 訪問,可以通過請求方式加以區別
* 當然,如果有兩個相同的刪除方法,所需要的參數也一致,則可以調整參數位置加以區別
* 如下:
* stu/info/{sid}/{sname}
* stu/{sid}/info/{sname}
*原則二:
* RESTful方式訪問時參數最好都是數據庫表字段,非數據庫表字段用傳統問號拼接即可
*
*/
@GetMapping(value="stu/info/{sid}/{sname}")
@ResponseBody
public Object getName(@PathVariable("sid") Integer sid,@PathVariable("sname") String sname){
return "sid:"+sid+"-sname:"+sname;
}
七、Springboot集成Redis
1、在pom.xml中添加redis依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、在*.properties中添加redis配置信息
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123456
3、插入獲取redis數據示例
見圖11.1、11.2
八、SpringBoot集成Dubbo
1、需要三個modual,一個爲接口工程,一個爲服務提供者,一個爲服務消費者。
接口工程:存放實體bean和業務接口。
maven工程:dubbo-interfaces
服務提供者:存放業務接口的實現類,並將服務註冊到服務中心,調用數據持久層。
springboot web工程:dubbo-providers
服務消費者:從註冊中心調用服務提供者提供的服務,來處理瀏覽器發出的請求。 springboot web工程
springboot web工程:dubbo-consumers
2、配置
A、添加依賴(服務者和消費者都需要添加)
<!--dubbo集成springboot依賴-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!--註冊中心,zookeeper-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>
</dependency>
<!--接口工程-->
<dependency>
<groupId>com.farben.springboot</groupId>
<artifactId>dubbo-interfaces</artifactId>
<version>1.0.0</version>
</dependency>
B、修改application.properties配置文件
服務提供者:
#內置tomcat端口
server.port=8091 #別和服務消費者一樣
#設置上下文根
server.servlet.context-path=/s
#dubbo的配置
spring.application.name=dubbo-providers
#聲明當前項目是服務提供者
spring.dubbo.server=true
spring.dubbo.registry=zookeeper://127.0.0.1:2181
服務消費者:
#內置tomcat端口
server.port=8090
#設置上下文根
server.servlet.context-path=/s
#dubbo的配置
spring.application.name=dubbo-consumers
#註冊中心
spring.dubbo.registry=zookeeper://127.0.0.1:2181
C、註冊中心
一般使用zookeeper,可以在windows上搭建一個單節點的即可。
下載地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz
解壓後,拷貝配置文件爲zoo.cfg,並修改dataDir屬性爲自定義的目錄,然後在bin下情動zkServer.cmd即可。
3、代碼書寫
dubbo-consumers:
Controller:
@Controller
public class StudentController {
/**
* Reference註解是dubbo的註解,別導錯了
* 表明要從註冊中心引用已經暴露的服務,即StudentService.class
*/
@Reference(interfaceClass = StudentService.class,version="1.0.0",check=false)
private StudentService service;
@RequestMapping(value="dubbo/{id}")
@ResponseBody
public Object getOneStudent(@PathVariable("id") Integer id){
return service.getOneStudent(id);
}
}
dubbo-interfaces:
Service:
public interface StudentService {
Object getOneStudent(Integer id);
}
dubbo-providers:
Service.impl
@Component //將類加入spring容器
//將服務暴露給註冊中心。這是dubbo的註解,別導錯了
@Service(interfaceClass = StudentService.class,version = "1.0.0",timeout = 10000)
//父接口類對象、版本、超時時間
public class StudentServiceImpl implements StudentService {
@Override
public Object getOneStudent(Integer id) {
return 12;
}
}
3、三個註解
@EnableDubboConfiguration 在服務提供者和服務消費者的入口程序上添加,表明開啓dubbo配置。
@Service dubbo的註解,別導錯了。在業務接口上添加,將服務暴露給註冊中心。
@Reference dubbo的註解,別導錯了。在控制層上使用表明從註冊中心引用服務。
4、注意事項:
在dubbo-providers和dubbo-consumers的springboot入口類上都需要加入@EnableDubboConfiguration註解來開啓dubbo的配置
啓動時zkServer.cmd,再啓動dubbo-providers,最後啓動dubbo-consumers。
Dubbo要求實體類bean需要實現序列化接口。
九、SpringBoot創建java工程
1、和springboot web工程區別
創建時:勾選web後不要勾選spring web。
創建後:resources下沒有static、templates等靜態資源文件夾,且pom文件在的web工程起步依賴變成了非web工程起步依賴。
2、獲取容器內對象
因爲沒有web工程的依賴,那麼如何獲取通過@Service、@Component等註解加入Spring容器的對象?
有兩種方式,見以下示例:
第一種方式:
@SpringBootApplication
public class SpringbootJavaApplication {
public static void main(String[] args) {
/**
* 入口類啓動後返回一個ConfigurableApplicationContext對象,該對象也是spring的容器
* 可以通過該對象的getBean("對象所屬類名首字母小寫")來獲取
* 通過@Service、@Component等註解spring容器對象。
*/
ConfigurableApplicationContext cac= SpringApplication.run(SpringbootJavaApplication.class, args);
StudentServiceImpl service=(StudentServiceImpl) cac.getBean("studentServiceImpl");
System.out.println(service.welcomeSpringbootJava("welcome to springboot java application!"));
Student student=(Student) cac.getBean("student");
student.setSname("張三");
System.out.println(student.getSname());
}
}
第二種方式:
@SpringBootApplication
public class SpringbootJava2Application implements CommandLineRunner { //第一步,實現CommandLineRunner接口
//第二步,在注入對象上加入@Autowired註解
@Autowired
private StudentService service;
@Autowired
private Student student;
public static void main(String[] args) {
SpringApplication.run(SpringbootJava2Application.class, args);
}
@Override
public void run(String... args) throws Exception { //重寫run方法
System.out.println(service.welcomeSpringbootJava("welcome to springboot java application!"));
student.setSname("張三");
System.out.println(student.getSname());
}
}
3、其實springboot創建非web應用沒什麼軟用,不如直接創建maven java工程呢。
所以這一部分僅作了解即可。
十、關閉/修改springboot工程啓動logo
1、關閉logo
直接上代碼
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
/**
* 關閉springboot 啓動logo
*/
SpringApplication spring=new SpringApplication(SpringbootApplication.class);
spring.setBannerMode(Banner.Mode.OFF);
spring.run(args);
}
}
2、修改logo
A、訪問
https://www.bootschool.net/ascii
或
http://patorjk.com/software/taag/
輸入文字,獲得想要更改的logo圖樣,拷貝下來。
B、在resources文件夾下創建banner.txt文件
將複製下來的logo拷貝到該文件保存啓動程序即可看到自定義的logo。
文件名必須叫banner.txt
十一、Springboot使用攔截器
1、攔截器和過濾器
過濾器攔截的是servlet,而在springmvc之後,只剩下一個公有的servlet,原本的多個servlet已有多個單元
方法替代,而攔截器攔截的就是這些單元方法。
過濾器在servlet之前,而攔截器在servlet之後,單元方法之前。
2、攔截器配置
A、自定義的攔截器類需要實現HandlerInterceptor接口,重寫preHandle方法,在方法中定義攔截器規則。
B、需要一個配置類,配置類使用@Configuration聲明,並實現WebMvcConfigurer接口,重寫
addInterceptors方法,在方法中定義攔截器攔截範圍。
3、代碼示例
model:
@Component
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
interceptor:
/**
* 攔截器,定義攔截器規則
* 實現HandlerInterceptor接口,重寫preHandle
* 並在preHandle方法中定義
* session中有user,則返回true。直接訪問
* 沒有user,則重定向/user/error,返回false
*/
public class UserLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
User user=(User)request.getSession().getAttribute("user");
if(user==null){
response.sendRedirect(request.getContextPath()+"/user/error");
return false;
}
return true;
}
}
config:
/**
* 攔截器配置類,定義攔截器攔截範圍
* addPathPatterns表明攔截的範圍 假設爲爲【1,5】
* excludePathPatterns表名在要攔截的範圍中排除的範圍 假設爲2,3
* 則真正攔截範圍爲1,4,5
* /user/** 代表只要開頭爲/user,後面隨便是什麼,隨便有多少級子目錄
* /user/* 代表只要開頭爲/user,後面隨便是什麼,只有一級子目錄
*/
@Configuration
public class UserConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
String [] addPathPatterns={
"/user/**"
};
String [] excludePathPatterns={
"/user/login","/user/error"
};
registry.addInterceptor(new UserLoginInterceptor()).
addPathPatterns(addPathPatterns).
excludePathPatterns(excludePathPatterns);
}
}
controller:
@Controller
@RequestMapping(value="/user")
public class UserLoginInterceptorTest {
@Autowired
private User user;
//登陸的方法,不登陸也可訪問
@RequestMapping(value="/login")
public @ResponseBody String login(HttpServletRequest req){
req.getSession().setAttribute("user",user);
return "login succeed!";
}
//登陸後才能訪問的方法
@RequestMapping(value="/center")
public @ResponseBody String center(){
return "after login succeed,you can enter the center area!";
}
//登陸失敗跳轉的方法,不登陸也可訪問
@RequestMapping(value="/error")
public @ResponseBody String error(){
return "you must login first!!";
}
}
十二、springboot使用過濾器
1、過濾器配置
第一種方式:
A、自定義過濾器用@WebFilter(urlPatterns = "過濾路徑") 標註,實現Filter接口,複寫doFilter方法。
B、入口類用@ServletComponentScan(basePackages = "com.farben.springboot.filter")標準,配置被掃描的過濾器路徑。
第二種方式:
A、自定義過濾器實現Filter接口,複寫doFilter方法。
B、自定義配置類,加@Configuration標註,在類中自定義方法,方法中註冊過濾器,添加過濾路徑,並返回這個過濾器。
2、第一種方式代碼
filter:
@WebFilter(urlPatterns = "/user") //過濾掉“/user”
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("進入自定義過濾器");
chain.doFilter(request,response);
}
}
controller:
@Controller
public class MyFilterTest {
@RequestMapping(value="/user")
public @ResponseBody String user(){
return "user info show over!!";
}
@RequestMapping(value="/stu")
public @ResponseBody String stu(){
return "can't come in filter";
}
}
入口類:
@SpringBootApplication
@ServletComponentScan(basePackages = "com.farben.springboot.filter") //servlet掃描路徑
public class SpringbootFilterApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootFilterApplication.class, args);
}
}
3、第二種方式代碼
filter:
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("歡迎進入過濾器");
chain.doFilter(request,response);
}
}
配置類config
@Configuration //定義爲配置類
public class MyFilterConfig {
@Bean
public FilterRegistrationBean myFilterRegistration(){
//註冊過濾器
FilterRegistrationBean myFilter = new FilterRegistrationBean(new MyFilter());
//添加過濾器路徑
myFilter.addUrlPatterns("/user");
return myFilter;
}
}
controller:
@Controller
public class MyFilterTest {
@RequestMapping(value="/user")
public @ResponseBody
String user(){
return "user info show over!!";
}
@RequestMapping(value="/stu")
public @ResponseBody String stu(){
return "can't come in filter";
}
}
入口類:
@SpringBootApplication
public class SpringbootFilter2Application {
public static void main(String[] args) {
SpringApplication.run(SpringbootFilter2Application.class, args);
}
}
十三、springboot使用servlet
第一步:
自定義servlet用@WebServlet標註,實現HttpServlet接口,在doGet或doPost方法中實現servlet邏輯。
第二步(有兩種實現方式):
第一種:
入口類用@ServletComponentScan標註。
第二種:
自定義配置類,在配置類中配置自定義好的servlet。
注意:
用得不多,用到再百度即可。