struts2的工作原理是什麼?
阿新 • • 發佈:2018-11-26
作者:郭無心 連結:https://www.zhihu.com/question/28583043/answer/74684588 來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { //1.獲取請求引數 String servletPath = req.getServletPath(); System.out.println(servletPath); String path = null; //2.判斷servletPath,若其等於“product-input.action”,則轉發到 //WEB-INF/pages/input.jsp if("/product-input.action".equals(servletPath)){ path = "/WEB-INF/pages/input.jsp"; } //3.判斷servletPath,若其等於"/product-save.action", 則 if("/product-save.action".equals(servletPath)){ //1).獲取請求引數 String productName = request.getParameter("productName"); String productDesc = request.getParameter("productDesc"); String productPrice = request.getParameter("productPrice"); //2).將請求封裝成一個Product物件 Product product = new Product(null, productName, productDesc, Double.parseDouble(productPrice)); //3).執行儲存操作 System.out.println("Save Product: " + product); product.setProductId(1001); //4). 將product物件儲存到request當中 //${param.productName} -> ${requestScope.product.productName} request.setAttribute("product", product); path = "/WEB-INF/pages/details.jsp"; } if(path != null){ request.getRequestDispatcher(path).forward(request, response); return; } }
1、客戶端(Client)向伺服器傳送一個請求(request)
2、客器(Container)通過web.xml對映請求,並獲得控制器(Controller)的名字。
3、容器(Container)呼叫控制元件器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前呼叫FilterDispatcher,Struts2.1之後呼叫StrutsPrepareAndExecuteFilter。
4、控制器(Controller)通過ActionMapper獲得Action的資訊。
5、控制器(Controller)呼叫ActionProxy。
6、ActionProxy讀取struts.xml檔案讀取相應的action和interceptor stack的資訊。
7、ActionProxy把request請求傳遞給ActionInvocation。
8、ActionInvocation依次呼叫action和interceptor。
9、根據action執行結果,產生result。
10、Result資訊返回給ActionInvocation。
11、產生一個HttpServletResponse響應。
12、將產生的響應返回給客戶端。