Spring boot專案helloworld進一步瞭解(一)
本文內容梳理:
1、tomcat埠號修改(方式兩種)
2、banner改變
3、關於spring boot的返回資料解析(json資料和編碼格式)
4、整合jsp或者ftl頁面 (同時整合jsp和freemarker)
前期準備:
在上文基礎上完善檔案
新增目錄resources(注意:若前期建立的maven web專案,可省略這步)
一、tomcat啟動埠號配置,可主要分為兩種
1、通過修改啟動類(一般不使用該方法)
SpringApplication.run(StartApplication.class, "--server.port=5000");
2、通過配置檔案修改 (常使用) spring boot支援兩種配置檔案方式(application.properties和application.yml)
1>使用application.properties配置(注意:將方法一註釋掉,否則埠號修改以方法一為主)
新建application.properties檔案,新增內容
server.port=5001
2> 通過application.yml配置
新建application.yml檔案(注意:該檔案不可識別“tab”鍵,空格必須使用空格鍵)
server:
port: 5002
注意:在修改埠時,是有主次之分,Java類 > application.properties >application.yml
關於spring boot的框架時,一般使用application.properties為主,application.yml為輔。本部落格關於spring boot的框架的配置,會使用application.properties.(application.yml的配置檔案一般在spring cloud微服務架構中使用較多)
二、banner改變
banner是什麼?在我們啟動類時的圖示顯示
1、修改banner
resources檔案下新增banner.txt檔案。啟動類會自動去識別
eg:
2、關閉banner(一般不使用)
SpringApplication sp = new SpringApplication(StartApplication.class);
sp.setBannerMode(Banner.Mode.OFF);
sp.run(args);
三、關於spring boot的返回資料解析(json資料和編碼格式)
1、測試關於spring boot自定義的json解析和編碼格式
1>定義實體類;
private int id;
private String name;
private Date time;
備註:關於setter和getter方法自己完善
2>在StartApplication.class類中新增controller方法 (主要用來測試json和編碼格式)
@RequestMapping("json")
public TestJsonModel json() {
TestJsonModel json = new TestJsonModel();
json.setId(1);
json.setName("魂牽");
json.setTime(new Date());
return json;
}
@RequestMapping("teststr")
public String str(){
return "字串編碼測試!!";
}
3>啟動測試
備註:不難發現,關於編碼格式預設進行了UTF-8的轉換,同時json也進行了預設解析
2、修改編碼格式配置(反向測試)
在StartApplication.class類中新增,編碼格式
@Bean
public StringHttpMessageConverter stringHttpMessageConverter() {
/*編碼方式修改*/
//預設Utf-8 原始碼( java.nio.charset.Charset中第613行)
//StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
//反向去測試
StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("ISO-8859-1"));
return converter;
}
注意:json資料會預設去解析,所以當字串在json資料內時,會進行預設編碼
3、修改json預設配置(方法一)
在StartApplication.class類中新增,json格式(本人使用fastjson.jar)
1>pom.xml新增依賴
<!-- 自定義json資料解析 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
2>StartApplication.class引入
@Bean
public HttpMessageConverters useConverters() {
FastJsonHttpMessageConverter fast = new FastJsonHttpMessageConverter();
//處理中文亂碼問題(不然出現中文亂碼)
List<MediaType> fastMediaTypes = new ArrayList<MediaType>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fast.setSupportedMediaTypes(fastMediaTypes);
HttpMessageConverters httpMessageConverters = new HttpMessageConverters(fast);
return httpMessageConverters;
}
測試:修改實體類
@JSONField(serialize=false)
private int id;
private String name;
@JSONField(format="yyyy-mm-dd hh:mm:ss")
private Date time;
4、關於修改編碼格式和接送解析方法二
繼承WebMvcConfigurationSupport 類 (或者WebMvcConfigurerAdapter類(建議使用該類)),覆寫configureMessageConverters方法
主要區別:
當通過繼承WebMvcConfigurationSupport 類來實現時,sping boot自動配置的mvc資訊將失效導致需要重新定義許多東西(包括:頁面跳轉時的預設路徑等)。所以建議繼承WebMvcConfigurerAdapter。
原始碼:
內容修改和新增:
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
System.out.println("=================自定義json資料解析開始====================");
super.configureMessageConverters(converters);
//定義FastJsonHttpMessageConverter實體類
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setFeatures(Feature.SupportArrayToBean);//這邊可以自己定義
fastConverter.setFastJsonConfig(fastJsonConfig);
//處理中文亂碼問題(不然出現中文亂碼)
List<MediaType> fastMediaTypes = new ArrayList<MediaType>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
converters.add(fastConverter);
System.out.println("=================自定義json資料解析結束====================");
System.out.println("=================自定義編碼方式開始====================");
//編碼格式修改
StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("ISO-8859-1"));
//StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
converters.add(converter);
System.out.println("=================自定義編碼方式結束====================");
}
測試結果:
四、整合jsp或者ftl頁面
注意:關於json和編碼格式解析使用的是繼承WebMvcConfigurerAdapter(否則頁面跳轉或是關於字串的編碼會出一定問題。)1、整合jsp頁面
1>新增依賴 pom.xml中
<!-- 新增Jsp支援jar包 -->
<!-- servlet 依賴 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<!--JSTL(JSP Standard Tag Library,JSP標準標籤庫)是一個不斷完善的開放原始碼的JSP標籤庫,是由apache的jakarta小組來維護的。 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
2>新增頁面跳轉控制 application.properties中
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
3>建立jsp檔案
按下面路徑
簡單的jsp頁面即可
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="en">
<head>
<title>Hello 你好</title>
</head>
<body>
Hello 你好
</body>
</html>
6>新增controller,在啟動類中:
@RequestMapping("jsp")
public ModelAndView testJsp() {
ModelAndView m = new ModelAndView("testjsp");
Map<String,Object> map = m.getModel();
TestJsonModel json = new TestJsonModel();
json.setId(1);
json.setName("EL表示式");
json.setTime(new Date());
map.put("json", json);
map.put("str", "字串編碼測試");
return m;
}
5>重新啟動類訪問結果
備註:關於spring boot jsp頁面跳轉中的亂碼問題:
1>首先檢視關於後臺在傳遞字串時到jsp頁面的編碼格式(可以看內容三的講解),本文采用UTF-8。
2>關於jsp頁面的編碼格式,本文也是UTF-8.
3>jsp頁面的編碼控制:
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
關於內容的意思:contentType:伺服器傳到jsp頁面的編碼格式。
pageEncoding:jsp頁面本身的編碼格式。
一般:這三項控制好後,頁面的亂碼問題幾乎均能解決。
2、整合ftl頁面
1>引入pom檔案
<!-- ftl依賴檔案引入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
2>新增ctrl 再啟動類中
@RequestMapping("ftl")
public ModelAndView testFtl() {
ModelAndView m = new ModelAndView("helloFtl");
Map<String,Object> map = m.getModel();
TestJsonModel json = new TestJsonModel();
json.setId(1);
json.setName("EL表示式");
json.setTime(new Date());
map.put("json", json);
map.put("str", "字串編碼測試");
return m;
}
2>在resources檔案下新增資料夾 templates,再新增helloFtl.ftl檔案,內容如下
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Hello World!</title>
</head>
<body>
<h1>Hello world!! 你好 ${str} ${json.name}</h1>
</body>
</html>
3> 註釋配置中關於jsp的配置 ,關於ftl的配置spring boot會自動載入。
4>訪問結果
備註:關於ftl頁面路徑的配置:
1> 配置檔案中修改:但父目錄再resources下:
配置新增:
spring.freemarker.template-loader-path=classpath:/ftl/ #src/main/resources
檔案新增:
備註:為了方便測試,將頁面資訊中templates修改為ftl
測試結果:
2> 在啟動類中,重新定義ViewResolver和FreeMarkerConfigurer
程式碼如下:
@Bean
public FreeMarkerViewResolver getFmViewResolver() {
FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
resolver.setCache(true);
resolver.setPrefix("");
resolver.setSuffix(".ftl");
resolver.setContentType("text/html; charset=UTF-8");
return resolver;
}
@Bean
public FreeMarkerConfigurer freemarkerConfig() throws IOException, TemplateException {
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
//configurer.setTemplateLoaderPaths("file:絕對路徑","http://www.xxx.com/");
configurer.setTemplateLoaderPaths("file:\\C:\\Users\\Administrator\\Desktop\\臨時檔案\\csdn檔案\\spring-boot-hello-master (1)\\spring-boot-hello-master\\src\\main\\webapp\\WEB-INF\\ftl");
configurer.setDefaultEncoding("UTF-8");
return configurer;
}
注意:file僅能寫絕對路徑。我在WEB-INF下建立ftl檔案下放置ftl檔案。
測試結果:
3>同時整合jsp和freemarker
1>修改啟動類中 bean的生成規則:
@Bean
public FreeMarkerViewResolver getFmViewResolver() {
FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
resolver.setCache(true);
resolver.setPrefix("");
resolver.setSuffix(".ftl");
resolver.setContentType("text/html; charset=UTF-8");
resolver.setOrder(0);
return resolver;
}
@Bean
public FreeMarkerConfigurer freemarkerConfig() throws IOException, TemplateException {
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
//configurer.setTemplateLoaderPaths("file:絕對路徑","http://www.xxx.com/");
configurer.setTemplateLoaderPaths("file:\\C:\\Users\\Administrator\\Desktop\\臨時檔案\\csdn檔案\\spring-boot-hello-master (1)\\spring-boot-hello-master\\src\\main\\webapp\\WEB-INF\\ftl");
configurer.setDefaultEncoding("UTF-8");
return configurer;
}
/*
* jsp
* */
@Bean
public ViewResolver getJspViewResolver() {
InternalResourceViewResolver jsp = new InternalResourceViewResolver();
jsp.setPrefix("/WEB-INF/jsp/");
jsp.setSuffix(".jsp");
jsp.setOrder(1);
return jsp;
}
2>新增與jsp同名的ftl檔案,測試誰優先(ftl優先)
啟動類中:
@RequestMapping("ftljsp")
public ModelAndView testFtlJsp() {
ModelAndView m = new ModelAndView("testjsp");
Map<String,Object> map = m.getModel();
TestJsonModel json = new TestJsonModel();
json.setId(1);
json.setName("EL表示式");
json.setTime(new Date());
map.put("json", json);
map.put("str", "字串編碼測試");
return m;
}
2> 頁面檔案:
testjsp.ftl內容:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>Hello World!</title>
</head>
<body>
<h1>ftl中 Hello 你好 ${json.name} ${str}</h1>
</body>
</html>
測試結果:ftl檔案優先執行。
本文就到此結束:如果有問題可以留言。
github地址:https://github.com/hunqian/spring-boot-hello-more.git