1. 程式人生 > >Spring Boot 入門之web基礎篇(二)

Spring Boot 入門之web基礎篇(二)

一、前言

上一篇《Spring Boot 入門之基礎篇(一)》介紹了 Spring Boot 的環境搭建以及專案啟動打包等基礎內容,本篇繼續深入介紹 Spring Boot 與 Web 開發相關的知識。

二、整合模板引擎

由於 jsp 不被 SpringBoot 推薦使用,所以模板引擎主要介紹 Freemarker 和 Thymeleaf。

2.1 整合 Freemarker

2.1.1 新增 Freemarker 依賴


在 application.properties 中新增如下內容:

2.1.2 新增 Freemarker 模板配置


2.1.3 Freemarker 案例演示

在 controller 包中建立 FreemarkerController:


結果如下:在 templates 目錄中建立名為 hello.ftl 檔案,內容如下:


image

2.2 整合 Thymeleaf

2.2.1 新增 Thymeleaf 依賴

在 pom.xml 檔案中新增:


在 application.properties 中新增如下內容:

2.2.2 新增 Thymeleaf 模板配置


2.2.3 Thymeleaf 案例演示
上述配置都是預設值。

在 controller 包中建立 ThymeleafController:


在 template 目錄下建立名為 hello.html 的檔案,內容如下:


結果如下:

image

三、整合 Fastjson

3.1 新增依賴


建立一個配置管理類 WebConfig ,如下:

3.2 整合 Fastjson


3.3 演示案例:

建立一個實體類 User:


建立controller:


此時,還不能看出 Fastjson 是否正常工作,我們在 User 類中使用 Fastjson 的註解,如下內容:

12@JSONField(format="yyyy-MM-dd")private Date birthday;

image

日期格式與我們修改的內容格式一致,說明 Fastjson 整合成功。

四、自定義 Servlet

4.1 編寫 Servlet

1234567891011121314public class ServletTest 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 { resp.setContentType("text/html;charset=utf-8"); resp.getWriter().write("自定義 Servlet"); }}

4.2 註冊 Servlet

將 Servelt 註冊成 Bean。在上文建立的 WebConfig 類中新增如下程式碼:

1234@Beanpublic ServletRegistrationBean servletRegistrationBean() { return new ServletRegistrationBean(new ServletTest(),"/servletTest");}

結果如下:

image

五、自定義過濾器/第三方過濾器

5.1 編寫過濾器

12345678910111213141516171819202122232425public class TimeFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("=======初始化過濾器========="); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { long start = System.currentTimeMillis(); filterChain.doFilter(request, response); System.out.println("filter 耗時:" + (System.currentTimeMillis() - start)); } @Override public void destroy() { System.out.println("=======銷燬過濾器========="); }}

5.2 註冊過濾器

要是該過濾器生效,有兩種方式:

1) 使用 @Component 註解

2) 新增到過濾器鏈中,此方式適用於使用第三方的過濾器。將過濾器寫到 WebConfig 類中,如下:

12345678910111213@Beanpublic FilterRegistrationBean timeFilter() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(); TimeFilter timeFilter = new TimeFilter(); registrationBean.setFilter(timeFilter); List<String> urls = new ArrayList<>(); urls.add("/*"); registrationBean.setUrlPatterns(urls); return registrationBean;}

結果如下:

image

六、自定義監聽器

6.1 編寫監聽器

12345678910111213public class ListenerTest implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { System.out.println("監聽器初始化..."); } @Override public void contextDestroyed(ServletContextEvent sce) { }}

6.2 註冊監聽器

註冊監聽器為 Bean,在 WebConfig 配置類中新增如下程式碼:

1234@Beanpublic ServletListenerRegistrationBean<ListenerTest> servletListenerRegistrationBean() { return new ServletListenerRegistrationBean<ListenerTest>(new ListenerTest());}

當啟動容器時,結果如下:

image

針對自定義 Servlet、Filter 和 Listener 的配置,還有另一種方式:

12345678910111213141516171819@SpringBootApplicationpublic class SpringbootWebApplication implements ServletContextInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { // 配置 Servlet servletContext.addServlet("servletTest",new ServletTest()) .addMapping("/servletTest"); // 配置過濾器 servletContext.addFilter("timeFilter",new TimeFilter()) .addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),true,"/*"); // 配置監聽器 servletContext.addListener(new ListenerTest()); } public static void main(String[] args) { SpringApplication.run(SpringbootWebApplication.class, args); }}

七、自定義攔截器

7.1 編寫攔截器

使用 @Component 讓 Spring 管理其生命週期:

123456789101112131415161718192021222324252627282930313233343536@Componentpublic class TimeInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("========preHandle========="); System.out.println(((HandlerMethod)handler).getBean().getClass().getName()); System.out.println(((HandlerMethod)handler).getMethod().getName()); request.setAttribute("startTime", System.currentTimeMillis()); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("========postHandle========="); Long start = (Long) request.getAttribute("startTime"); System.out.println("耗時:"+(System.currentTimeMillis() - start)); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception { System.out.println("========afterCompletion========="); Long start = (Long) request.getAttribute("startTime"); System.out.println("耗時:"+(System.currentTimeMillis() - start)); System.out.println(exception); }}

7.2 註冊攔截器

編寫攔截器後,我們還需要將其註冊到攔截器鏈中,如下配置:

12345678910111213@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter{ @Autowired private TimeInterceptor timeInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(timeInterceptor); }}

請求一個 controller ,結果如下:

image

八、配置 AOP 切面

8.1 新增依賴

1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency>

8.2 編寫切面類

使用 @Component,@Aspect 標記到切面類上:

12345678910111213141516171819202122@Aspect@Componentpublic class TimeAspect { @Around("execution(* com.light.springboot.controller.FastJsonController..*(..))") public Object method(ProceedingJoinPoint pjp) throws Throwable { System.out.println("=====Aspect處理======="); Object[] args = pjp.getArgs(); for (Object arg : args) { System.out.println("引數為:" + arg); } long start = System.currentTimeMillis(); Object object = pjp.proceed(); System.out.println("Aspect 耗時:" + (System.currentTimeMillis() - start)); return object; }}

請求 FastJsonController 控制器的方法,結果如下:

image

九、錯誤處理

9.1 友好頁面

先演示非友好頁面,修改 FastJsonController 類中的 test 方法:

12345678910111213141516171819@RestController@RequestMapping("fastjson")public class FastJsonController { @RequestMapping("/test") public User test() { User user = new User(); user.setId(1); user.setUsername("jack"); user.setPassword("jack123"); user.setBirthday(new Date()); // 模擬異常 int i = 1/0; return user; }}

image

當系統報錯時,返回到頁面的內容通常是一些雜亂的程式碼段,這種顯示對使用者來說不友好,因此我們需要自定義一個友好的提示系統異常的頁面。

在 src/main/resources 下建立 /public/error,在該目錄下再建立一個名為 5xx.html 檔案,該頁面的內容就是當系統報錯時返回給使用者瀏覽的內容:

12345678910111213<!DOCTYPE html><html lang=

相關推薦

Spring Boot 入門web基礎

一、前言上一篇《Spring Boot 入門之基礎篇(一)》介紹了 Spring Boot 的環境搭建以及專案啟動打包等基礎內容,本篇繼續深入介紹 Spring Boot 與 Web 開發相關的知識。二、整合模板引擎由於 jsp 不被 SpringBoot 推薦使用,所以模板

Spring Boot 入門持久層

imp 配置文件 bat catch map ann 文件 save values 原文地址:Spring Boot 入門之持久層篇(三) 博客地址:http://www.extlight.com 一、前言 上一篇《Spring Boot 入門之 Web 篇(二)》介紹

Spring Boot 學習持久層

該系列並非完全原創,官方文件、作者一、前言上一篇《Spring Boot 入門之 Web 篇(二)》介紹了 Spring Boot 的 Web 開發相關的內容,專案的開發離不開資料,因此本篇開始介紹持久層相關的知識。二、整合 JdbcTemplate1、新增依賴在pom.xm

Spring Boot 入門 Web

一、前言 上一篇《Spring Boot 入門之基礎篇(一)》介紹了 Spring Boot 的環境搭建以及專案啟動打包等基礎內容,本篇繼續深入介紹 Spring Boot 與 Web 開發相關的知識。 二、整合模板引擎 由於 jsp 不被 SpringBoot 推薦使用,所以模板引擎主

Spring Boot 入門配置基礎

原文地址:Spring Boot 入門之基礎篇(一) 部落格地址:http://www.extlight.com 一、前言 Spring Boot 是由 Pivotal 團隊提供的全新框架,其設計目的是用來簡化新 Spring 應用的初始搭建以及開發過程。該框架使用了特定的方式

React學習筆記react基礎1

lis fun tst struct pan 流程 普通 如果 是把 一.React特點歸納   1.聲明式的視圖層:React 模板寫在 JS 文件中,而不是 html 的 <script> 標簽中。能使用所有 JS 語法,而不只有模板語法,所以更加靈活。  

React學習筆記react基礎2

應用場景 組件 單元 ren provide form 實例 show wid   上一節我已經對React中基本的組件操作進行了說明,這一節我將對組件的一些附加屬性(如:組件的生命周期和組件的樣式)以及一些其他功能進行講解 一.組件的樣式 1.外部CSS樣式表: /

Linux成長路-基礎1

一、計算機組成及功能1、計算機的組成計算機組成指的是系統結構的邏輯實現,包括機器機內的資料流和控制流的 組成及邏輯設計等。主要分為五個部分:控制器,運算器,儲存器,輸入裝置,輸出裝置。2、各組成部分的功能(1)運算器:運算器的主要功能是對資料進行各種運算。這些運算除了常規的加、減、乘、除等基本的算術運算之外,

Java多執行緒基礎

上一篇介紹了Java多執行緒的基礎概念和synchronized關鍵字,這篇繼續介紹Java多執行緒的其他關鍵字和重要的方法。 一、volatile關鍵字 1.1 Java記憶體模型

Spring+SpringMVC+MyBatis+easyUI整合基礎講一下maven

github地址,點這裡。專案效展示,點這裡。賬號:admin 密碼:123456 下一篇文章開始,所有的專案原始碼都是與maven整合後的程式碼了,所以這一篇講一講maven。1、簡單介紹 我們看一下github上一些開源專案的目錄結構,下圖中有mybatis、nett

Spring Boot開發明月千城

D:\soft\Java\jdk1.7.0_04\bin\java -Didea.launcher.port=7532 "-Didea.launcher.bin.path=D:\idea\ideainstall\IntelliJ IDEA 14.0.2\bin" -Dfile.encoding=UTF-8 -

nginx 從入門到實踐 -基礎2

上篇說到了linux的安裝 目錄基本講解 以及啟動訪問。 下面繼續探索。 1)模組 –with-http_random_linux_module 目錄中選擇一個隨機主頁 _ witn-http_sub_module

Spring+SpringMVC+MyBatis+easyUI整合基礎程式碼簡化

前言當然,也可以直接匯入原始碼, 點選這裡下載程式碼。由於剛開始寫部落格,所以很多細節都想不到,原始碼也放到GitHub上去了,自己動動手應該也就可以了,無非是自己多注意一點,細心一點,編碼啊,jar包啊,有時候或者一個分號,或者一個單引號雙引號,這些都可能導致出錯的,一定要多動手,自己多實踐。簡化目的又看了

Spring+SpringMVC+MyBatis+easyUI整合基礎版本控制

日常囉嗦 還好在第一篇文章裡就列好了接下來的主線及要寫的知識點,不然都不知道要寫什麼東西了,開篇裡已經列了基礎篇要講svn和git的知識點,所以這一篇就寫一下版本控制。 專案實際效果展示在這裡,賬密:

Spring+SpringMVC+MyBatis+easyUI整合基礎專案簡述及技術選型介紹

萌芽階段 很久之前就開始打算整理一下自己的技術部落格了,由於各種原因(藉口總是可以找到的),實在抽不出時間所以計劃一直處於擱置狀態,一直只是心底的一顆小萌芽,日復一日的悠悠歲月如同手中緊抓的沙子,無聲無息的流失,不過這顆小生命也在我渴望與期待的澆灌下不斷的長大。

JAVA工程師成神路--基礎目錄

在網上看到一篇文章“java成神之路”,按照上面的要求大幹一番,看看能不能成神。 具體指標 一、基礎篇 1-1 JVM     1.1.1  JAVA記憶體           1.1.1.1  JAVA記憶體模型           1.1.1.2 JAVA記憶體管理  

linux學習進程

通過 passwd 查看 現在 替換 cnblogs exe -1 stdio.h 進程原語 1.fork #include<unistd.h> pid_t fork(void);   fork   子進程復制父進程,子進程和父進程的PID是不一樣的,在

springmvc入門映射處理器

als tst pass 登錄 其它 value false 是把 中間 實例:SimpleUrlHandlerMapping 步驟一:建立後端控制器UserContrller.java.代碼如下: package com.asm; //...省略導入的相關類

C語言基礎運算子

導航:   2.1 算數運算子   2.2 邏輯運算子   2.3 位運算   2.4 賦值運算   2.5 記憶體訪問符號 ----->x<------------->x&

linux基礎:基於Redhat7系統的特殊許可權與acl許可權列表

新建目錄和檔案的預設許可權 新建目錄和檔案的預設許可權是由系統中umask值來決定的。 新建FILE許可權:666-umask (對位相減)    由數字法賦許可權的過程中,我們能夠發現,凡是奇數許可權,總是包含執行許可權的。而一個檔案如果預設就包含執行許可權其實是非常危險的。因此如果所