(Java)手動封裝Servlet

概述

  • 只要掌握了JavaSE的知識,以及B/S架構請求和響應的流程,就可以看懂,反射的部份佔得比較多,還有註解
  • 使用環境:git

    • JDK:1.8
    • Tomcat:9.0.3
    • 編譯器:IDEA 2019

原生Servlet的問題

  • Servlet的做用:github

    • Servlet的做用是處理瀏覽器發送過來的請求以及服務器響應回去的信息
    • 經過瀏覽器發送過來的資源請求,轉發給對應的資源
  • 原生Servlet的寫法web

    • 1)在web.xml對一個Servlet進行配置
    • 2)實現Servlet接口/繼承HttpServlet
    • 3)重寫doPost/doGet/Service方法
  • 原生Servlet產生的問題瀏覽器

    • 1)配置信息多:每寫一個Servlet類須要配置8行xml
    • 2)每一個Servlet類都要實現/繼承,增長耦合度
    • 3)一個Servlet類只對應了一個功能,當項目中的功能愈來愈多時,Servlet類也會愈來愈多

解決策略

  • 1)將多個Servlet的方法封裝到一個Servlet中服務器

    • 這樣一個Servlet類就對應了多個功能
  • 2)封裝一個DispatcherServlet類,這個類根據瀏覽器的資源請求,找到對應的Servlet,以及處理Servlet類的響應session

    • 也就是這個DispatcherServlet類是惟一一個繼承HttpServlet/實現Servlet接口,而以前寫的Servlet類就是普通的類
    • 這樣作下降了耦合度,web.xml配置文件中也只須要配置DispatcherServlet,減小了配置信息

封裝後的組件

image

  • 如上圖所示,主要封裝了兩個組件,分別是DispatcherServlet和Handler
  • DispatcherServlet的做用:架構

    • 1)接收瀏覽器發送過來的請求
    • 2)將請求交給Handler
  • Handler的做用:框架

    • 1)解析請求
    • 2)找處處理該請求的對象
    • 3)找到該對象具體處理該請求的方法
    • 4)解析執行對象執行方法後的結果
    • 5)將結果響應回給瀏覽器
  • ModelAndView:jsp

    • 這個對象是用來存儲服務器返回的轉發/重定向路徑,以及服務器要返回的參數
  • ApplicationContext.properties:spa

    • 這個配置文件是用來存儲請求名字對應的處理對象的類路徑

使用方法

@SessionAttributes("name")
public class AtmController {//須要管理這個Controller的單例機制
 private AtmService service = new AtmService();
 public ModelAndView login(User user){
        ModelAndView mv = new ModelAndView();
 String result = service.login(user);
 if("success".equals(result)){
 mv.addObject("name",user.getName());//若是存在session中 先放在mv容器裏
 mv.setViewName("welcome.jsp");
 }else{
            mv.addObject("result",result);
 mv.setViewName("index.jsp");
 }
        return mv;
 }
    
 @ResponseBody
 public List<User> query(){
        List<User> userList = service.query();
 return userList;
 }
}
  • 好比如上代碼:
  • 幾個自定義註解的含義:

    • @SessionAttributes("參數名"):

      • 這個註解的做用是把參數存到session做用域裏
      • 必須寫在類名上面
      • 存入的參數必須是在request做用域裏面存在的
    • @ResponseBody:

      • 寫在方法上面
      • 若是返回的是實體對象、List對象、JSON對象、String字符串,則須要加上這個註解
    • @RequestParam("參數名"):

      • 寫在方法攜帶的參數前面,註解裏寫的名字和方法的參數名一致
      • 若是瀏覽器發送的請求攜帶了參數,那麼執行的對象不須要經過request對象就能拿到參數
    • 若是參數是一個實體對象/Map對象,那麼就不須要寫@RequestParam註解,框架會自動把請求攜帶的參數包裝成一個對象

侷限性

  • 由於時間不夠充足,因此只是簡單的封裝,因此使用的時候也是有不少問題,好比對於方法參數處理以及響應信息的處理類型只能處理幾個基本數據類型、實體對象以及Map、list集合和Json對象
  • 封裝這個的意義主要是練習JavaSE的知識,以及瞭解真正的控制層的框架是怎麼處理的,因此若是真的感興趣的能夠照着我這個思路繼續寫下去

代碼地址:https://github.com/Cing-self/...

相關文章
相關標籤/搜索