Java程式設計師從笨鳥到菜鳥之(三十五)細談struts2 一)自己實現struts2框架
Struts最早是作為Apache Jakarta專案的組成部分,專案的創立者希望通過對該專案的研究,改進和提高JavaServer Pages 、Servlet、標籤庫以及面嚮物件的技術水準。最初的struts1.x很快在企業開發中流行了起來,與此同時,當時還有一個非常的優秀的web開發框架誕生,那就是webwork,但webwork沒有像struts1那麼幸運,沒有得到流行,但webwork簡潔、靈活功能強大等優點絕不輸於當時流行的strut1.x。當然struts1開發人員不是也沒有意識到這一點。於是struts 和WebWork得到了結合,webwork算是利用struts的名氣來發展自己吧,於是
Struts2概述
Struts 2是Struts的下一代產品,是在 struts 和WebWork的技術基礎上進行了合併的全新的Struts 2框架。其全新的Struts 2的體系結構與Struts 1的體系結構的差別巨大。Struts 2以WebWork為核心,採用攔截器的機制來處理使用者的請求,這樣的設計也使得業務邏輯控制器能夠與Servlet API完全脫離開,所以Struts 2可以理解為WebWork的更新產品。雖然從Struts 1到Struts 2有著太大的變化,但是相對於WebWork,Struts 2只有很小的變化。由於struts1現在開發中很少在用到,所以我們直接進入
首先看一下一個MVC的流程圖的例子:
就像圖中例子,在檢視層add。Jsp中寫一個提交兩個資料的表單,表單提交給控制器,在控制器中通過它所提交的uri獲得表單所要提交的action,然後把請求交給action,然後在action中呼叫業務邏輯的方法進行邏輯運算,獲得結果,把結果儲存起來,然後,把所有返回的介面作為返回結果返回給控制器,然後控制器根據返回的介面的字串選擇轉發到該介面
下面我們就用程式,把這個流程實現出來:
1.首先要把表單介面寫出來:add.jsp
<form action="add.action" method="post"><div align="center"><font color="#8000ff"> </font><font size="5" color="#8000ff"><strong>加法器實現</strong></font><br/> </div><table align="center"> <tr> <td>第一個數:</td> <td><input type="text" name="firstNmb"/></td> </tr> <tr> <td>第二個數:</td> <td><input type="text" name="secondNmb"/></td> </tr> <tr align="center"> <td colspan="2"><input type="submit" value=" 求和"/> <input type="reset"/ value="重置"></td> </tr> </table> </form>
2.建立控制器,其實這裡的控制器就是一個servlet,這裡我們給規定凡是請求字尾是.action的都提交到這個控制器裡,controller.java:
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String path=request.getRequestURI();String realPath=path.substring(path.lastIndexOf("/")+1, path.lastIndexOf("."));Action action=null;String path2=null;if("add".equals(realPath)){action=new AddAction();path2=action.execute(request, response);} ......... If(....){ ....... }request.getRequestDispatcher(path2).forward(request, response);}
因為控制器是一個servlet,所以在web.xml中要對他進行配置:
<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>Controller</servlet-name> <servlet-class>zxj.struts2.servlet.Controller</servlet-class> </servlet> <servlet-mapping> <servlet-name>Controller</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping></web-app>
下面來看一下action裡面應該寫的內容,由於一直以來都提倡面向介面程式設計,並且面向介面程式設計也能很好的體現java的可擴充套件性,所以我們對所有的action提供一個共同的介面:action.java:
public interface Action {public String result(HttpServletRequest request,HttpServletResponse response);}
下面是具體的action實現:addaction.java:其中具體的業務邏輯呼叫的add方法就是兩個數相加,這裡就不貼程式碼了:
public String execute(HttpServletRequest request,HttpServletResponse response) {double i=Double.parseDouble(request.getAttribute("firstNmb").toString());double n=Double.parseDouble(request.getAttribute("secondNmb").toString());Calculator c=new Calculator();double result=c.add(i, n);request.setAttribute("result", result);return "add_result.jsp";}}
這些就是我們自己寫的mvc的基本框架,當然這裡面有很多不足的地方,這裡只是為了演示基於mvc框架的基本架構,具體細節都可以細化和擴充套件性的實現,比如控制器裡面的選擇哪個action,這個可以用配置檔案來實現的,基本思路:在控制器中獲得所請求action的字首名,然後去解析所配置的檔案,在然後拿著這個字首名去找配置檔案中相符的action所對應的類,然後在利用反射執行對應類的方法,根據然後在執行完action後,獲得結果,然後從配置中獲得獲該結果對應的介面,這樣就可以很好的體現了這個程式的可擴充套件性了。
到這裡我相信大家應該對基於mvc的框架的執行流程有一定的瞭解了,相信大家一定對學習struts2框架迫不接待了,那大家就等待著下一篇部落格:細談struts2之初識struts2框架