Web 專案 tiger 之12 註冊 Servlet 三大元件之 Servlet
阿新 • • 發佈:2019-02-03
本文導讀
- Spring Boot 由於預設以 Jar 包方式啟動嵌入式的 Servlet 容器來啟動 Spring Boot 的 web 應用,沒有 web.xml 檔案,所以無法再像以前一樣通過在 web.xml 配置來使用 Servlet ,但是 Spring Boot 提供了其它的方式。
- 以前使用 Servlet ,第一步自定義類繼承 javax.servlet.http.HttpServlet,然後重寫其 doGet 與 doPost 方法,在方法中編寫控制程式碼;第二步在 web.xml 中配置<servlet></servlet> 請求對映路徑即可。
- Spring Boot 註冊 Servlet:
- 第一步自定義類繼承 HttpServlet ,然後重寫其 doGet 與 doPost 方法,在方法中編寫控制程式碼仍然需要
- 第二步將 ServletRegistrationBean 元件新增到 Spring 容器中
自定義 Servlet
- 如下所示,仍然和以前一樣書寫 Servlet 程式碼
package com.lct.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Created by Administrator on 2018/8/11 0011. * 標準的 Servlet 實現 HttpServlet; * 重新其 doGet 、doPost 方法 */ public class BookServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println(":com.lct.servlet.BookServlet:" + req.getRequestURL()); /**講求轉發到後臺的 user/users 請求去,即會進入*/ req.getRequestDispatcher("user/users").forward(req, resp); } }
- 上面 Serlvet 就是轉發到下面的 UserControllr 控制器中,這是以前寫好的,在此不再累述
新增 ServletRegistrationBean
- @Configuration 配置類相當於以前的 beans.xml 中的配置,也是 tiger 專案之前寫好的,現在將 ServletRegistrationBean 也新增到 Spring 容器中來
package com.lct.config; import com.lct.component.MyLocaleResolve; import com.lct.servlet.BookServlet; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.LocaleResolver; /** * Created by Administrator on 2018/7/28 0028. * 自定義配置類 */ @Configuration public class MyMvcConfig { /** * 將我們自己的 LocaleResolver 元件交於 Spring 容器管理 * 從而覆蓋 Spring Boot預設的區域資訊解析器 * * @return */ @Bean public LocaleResolver localeResolver() { return new MyLocaleResolve(); } /** * 自定義嵌入式Servlet容器定製器元件 * 然後修改應用上下文路徑以及 Tomcat 埠 * * @return */ @Bean public WebServerFactoryCustomizer webServerFactoryCustomizer() { /** * 使用 ConfigurableServletWebServerFactory */ return new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() { @Override public void customize(ConfigurableServletWebServerFactory configurableServletWebServerFactory) { /** * 修改應用上下文路徑以及 Tomcat 埠 */ configurableServletWebServerFactory.setContextPath("/cat"); configurableServletWebServerFactory.setPort(8084); } }; } /** * 註冊 Servlet 三大元件 之 Servlet * 新增 ServletRegistrationBean ,就相當於以前在 web.xml 中配置的 <servlet></servlet>標籤 */ @Bean public ServletRegistrationBean myServlet() { /**第二個引數是個不定引數組,可以配置對映多個請求 * 相當於以前在 web.xml中配置的 <servlet-mapptin></servlet-mapptin>*/ ServletRegistrationBean registrationBean = new ServletRegistrationBean(new BookServlet(), "/bookServlet"); return registrationBean; } }
執行測試
- 上面請求之後,後臺控制檯輸出如下:
// 第一次請求 “bookServlet”
:com.lct.servlet.BookServlet:http://localhost:8084/cat/bookServlet
// bookServlet 中開始轉發到 user/users,此時因為沒有登入,所以被攔截器攔截重定向去了登入頁
com.lct.component.LoginHandlerInterceptor ::: http://localhost:8084/cat/user/users
// 登入成功重定向到 user/users,此時攔截器放行
com.lct.component.LoginHandlerInterceptor ::: http://localhost:8084/cat/user/users
// 登入成功後 再次請求 bookServlet
:com.lct.servlet.BookServlet:http://localhost:8084/cat/bookServlet
// bookServlet轉發到user/users,登入成功後攔截器放行
com.lct.component.LoginHandlerInterceptor ::: http://localhost:8084/cat/user/users
:com.lct.servlet.BookServlet:http://localhost:8084/cat/bookServlet
com.lct.component.LoginHandlerInterceptor ::: http://localhost:8084/cat/user/users