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 檔案,內容如下:
2.2 整合 Thymeleaf
2.2.1 新增 Thymeleaf 依賴
在 pom.xml 檔案中新增:
在 application.properties 中新增如下內容:
2.2.2 新增 Thymeleaf 模板配置
2.2.3 Thymeleaf 案例演示上述配置都是預設值。
在 controller 包中建立 ThymeleafController:
在 template 目錄下建立名為 hello.html 的檔案,內容如下:
結果如下:
三、整合 Fastjson
3.1 新增依賴
建立一個配置管理類 WebConfig ,如下:
3.2 整合 Fastjson
3.3 演示案例:
建立一個實體類 User:
建立controller:
此時,還不能看出 Fastjson 是否正常工作,我們在 User 類中使用 Fastjson 的註解,如下內容:
12 | "yyyy-MM-dd")private Date birthday; | (format=
日期格式與我們修改的內容格式一致,說明 Fastjson 整合成功。
四、自定義 Servlet
4.1 編寫 Servlet
1234567891011121314 | public class ServletTest extends HttpServlet { |
4.2 註冊 Servlet
將 Servelt 註冊成 Bean。在上文建立的 WebConfig 類中新增如下程式碼:
1234 | public ServletRegistrationBean servletRegistrationBean() { return new ServletRegistrationBean(new ServletTest(),"/servletTest");} |
結果如下:
五、自定義過濾器/第三方過濾器
5.1 編寫過濾器
12345678910111213141516171819202122232425 | public class TimeFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { System.out.println("=======初始化過濾器========="); } 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)); } public void destroy() { System.out.println("=======銷燬過濾器========="); }} |
5.2 註冊過濾器
要是該過濾器生效,有兩種方式:
1) 使用 @Component 註解
2) 新增到過濾器鏈中,此方式適用於使用第三方的過濾器。將過濾器寫到 WebConfig 類中,如下:
12345678910111213 | public 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;} |
結果如下:
六、自定義監聽器
6.1 編寫監聽器
12345678910111213 | public class ListenerTest implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { System.out.println("監聽器初始化..."); } public void contextDestroyed(ServletContextEvent sce) { }} |
6.2 註冊監聽器
註冊監聽器為 Bean,在 WebConfig 配置類中新增如下程式碼:
1234 | public ServletListenerRegistrationBean<ListenerTest> servletListenerRegistrationBean() { return new ServletListenerRegistrationBean<ListenerTest>(new ListenerTest());} |
當啟動容器時,結果如下:
針對自定義 Servlet、Filter 和 Listener 的配置,還有另一種方式:
12345678910111213141516171819 | public class SpringbootWebApplication implements ServletContextInitializer { 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 | public class TimeInterceptor implements HandlerInterceptor { 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; } 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)); } 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 | public class WebConfig extends WebMvcConfigurerAdapter{ private TimeInterceptor timeInterceptor; public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(timeInterceptor); }} |
請求一個 controller ,結果如下:
八、配置 AOP 切面
8.1 新增依賴
1234 | <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency> |
8.2 編寫切面類
使用 @Component,@Aspect 標記到切面類上:
12345678910111213141516171819202122 | public class TimeAspect { ("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 控制器的方法,結果如下:
九、錯誤處理
9.1 友好頁面
先演示非友好頁面,修改 FastJsonController 類中的 test 方法:
12345678910111213141516171819 | "fastjson")public class FastJsonController { ("/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; }} | (
當系統報錯時,返回到頁面的內容通常是一些雜亂的程式碼段,這種顯示對使用者來說不友好,因此我們需要自定義一個友好的提示系統異常的頁面。
在 src/main/resources 下建立 /public/error,在該目錄下再建立一個名為 5xx.html 檔案,該頁面的內容就是當系統報錯時返回給使用者瀏覽的內容:
12345678910111213 | <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整合基礎篇(五)講一下mavengithub地址,點這裡。專案效展示,點這裡。賬號: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 (對位相減) 由數字法賦許可權的過程中,我們能夠發現,凡是奇數許可權,總是包含執行許可權的。而一個檔案如果預設就包含執行許可權其實是非常危險的。因此如果所 |