Struts2第(一)篇《自己實現struts2框架》

本文來自:曹勝歡博客專欄。轉載請註明出處:http://blog.csdn.net/csh624366188  

 

     Struts最早是作爲Apache Jakarta項目的組成部分,項目的創立者希望通過對該項目的研究,改進和提高JavaServer Pages Servlet標籤庫以及面嚮對象的技術水準。最初的struts1.x很快在企業開發中流行了起來,與此同時,當時還有一個非常的優秀的web開發框架誕生,那就是webwork,但webwork沒有像struts1那麼幸運,沒有得到流行,但webwork簡潔、靈活功能強大等優點絕不輸於當時流行的strut1.x。當然struts1開發人員不是也沒有意識到這一點。於是struts WebWork得到了結合,webwork算是利用struts的名氣來發展自己吧,於是struts2誕生了。

Struts2概述

    Struts 2Struts的下一代產品,是在 struts WebWork的技術基礎上進行了合併的全新的Struts 2框架。其全新的Struts 2的體系結構與Struts 1的體系結構的差別巨大。Struts 2WebWork爲核心,採用攔截器的機制來處理用戶的請求,這樣的設計也使得業務邏輯控制器能夠與Servlet API完全脫離開,所以Struts 2可以理解爲WebWork的更新產品。雖然從Struts 1Struts 2有着太大的變化,但是相對於WebWorkStruts 2只有很小的變化。由於struts1現在開發中很少在用到,所以我們直接進入struts2的學習,但以前的項目中還是大多數保留着struts1的應用。由於struts是基於mvc模式的框架,所以我們學習struts的第一步就是開發自己的基於MVC的框架

首先看一下一個MVC的流程圖的例子:

       就像圖中例子,在視圖層addJsp中寫一個提交兩個數據的表單,表單提交給控制器,在控制器中通過它所提交的uri獲得表單所要提交的action,然後把請求交給action,然後在action中調用業務邏輯的方法進行邏輯運算,獲得結果,把結果保存起來,然後,把所有返回的界面作爲返回結果返回給控制器,然後控制器根據返回的界面的字符串選擇轉發到該界面

下面我們就用程序,把這個流程實現出來:

1.首先要把表單界面寫出來:add.jsp

  1. <form action="add.action" method="post"><div align="center"><font color="#8000ff">  
  2.   
  3.      </font><font size="5" color="#8000ff"><strong>加法器實現</strong></font><br/>  
  4.   
  5.      </div><table align="center">  
  6.   
  7.      <tr>  
  8.   
  9.      <td>第一個數:</td>  
  10.   
  11.      <td><input type="text" name="firstNmb"/></td>  
  12.   
  13.      </tr>  
  14.   
  15.      <tr>  
  16.   
  17.      <td>第二個數:</td>  
  18.   
  19.      <td><input type="text" name="secondNmb"/></td>  
  20.   
  21.      </tr>  
  22.   
  23.      <tr align="center">  
  24.   
  25.      <td colspan="2"><input type="submit" value=" 求和"/>    <input type="reset"value="重置"></td>  
  26.   
  27.      </tr>  
  28.   
  29.      </table>  
  30.   
  31.     </form>  
<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:

  1. public void doPost(HttpServletRequest request, HttpServletResponse response)  
  2.   
  3. throws ServletException, IOException {  
  4.   
  5. String path=request.getRequestURI();  
  6.   
  7. String realPath=path.substring(path.lastIndexOf("/")+1, path.lastIndexOf("."));  
  8.   
  9. Action action=null;  
  10.   
  11. String path2=null;  
  12.   
  13. if("add".equals(realPath)){  
  14.   
  15. action=new AddAction();  
  16.   
  17. path2=action.execute(request, response);  
  18.   
  19. }  
  20.   
  21.           .........  
  22.   
  23.          If(....){  
  24.   
  25.                  .......  
  26.   
  27.               }  
  28.   
  29. request.getRequestDispatcher(path2).forward(request, response);  
  30.   
  31. }  
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中要對他進行配置:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <web-app version="2.5"   
  4.   
  5. xmlns="http://java.sun.com/xml/ns/javaee"   
  6.   
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  8.   
  9. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  10.   
  11. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  12.   
  13.   <servlet>  
  14.   
  15.     <servlet-name>Controller</servlet-name>  
  16.   
  17.     <servlet-class>zxj.struts2.servlet.Controller</servlet-class>  
  18.   
  19.   </servlet>  
  20.   
  21.   <servlet-mapping>  
  22.   
  23.     <servlet-name>Controller</servlet-name>  
  24.   
  25.     <url-pattern>*.action</url-pattern>  
  26.   
  27.   </servlet-mapping>  
  28.   
  29. </web-app>  
<?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

  1. public interface Action {  
  2.   
  3. public String result(HttpServletRequest request,HttpServletResponse response);  
  4.   
  5. }  
public interface Action {

public String result(HttpServletRequest request,HttpServletResponse response);

}



      

下面是具體的action實現:addaction.java:其中具體的業務邏輯調用的add方法就是兩個數相加,這裏就不貼代碼了:

 

  1. public String execute(HttpServletRequest request,  
  2.   
  3. HttpServletResponse response) {  
  4.   
  5. double i=Double.parseDouble(request.getAttribute("firstNmb").toString());  
  6.   
  7. double n=Double.parseDouble(request.getAttribute("secondNmb").toString());  
  8.   
  9. Calculator c=new Calculator();  
  10.   
  11. double result=c.add(i, n);  
  12.   
  13. request.setAttribute("result", result);  
  14.   
  15. return "add_result.jsp";  
  16.   
  17. }  
  18.   
  19. }  
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框架

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章