千里馬

          天馬行空

          Struts1 原理及配置講解附源碼

              最近要看公司網(wǎng)站源碼,源碼都是用struts1寫的,我們平時(shí)用的都是struts2,所以的對(duì)struts1不是很熟悉。我也就是剛開始接觸struts的時(shí)候?qū)truts1有個(gè)簡單的學(xué)習(xí)(搭建一個(gè)簡單的項(xiàng)目,然后連接數(shù)據(jù)庫做一些增刪改查的操作還可以,但是具體的原理讓我說我也說不上來),因此今天抽一部分時(shí)間把struts1的概念了解下和自己動(dòng)手搭建一個(gè)項(xiàng)目使用struts1(就是一個(gè)簡單的用戶登錄,居然可以跑起來,瞬間感覺對(duì)用struts1做一些簡單功能還是可以做成的)。廢話不說了....

             首先介紹下struts1工作原理:

            1.初始化:struts框架的總控制器ActionServlet是一個(gè)Servlet,它在web.xml中配置成自動(dòng)啟動(dòng)的

           Servlet,在啟動(dòng)時(shí)總控制器會(huì)讀取配置文件(struts-config.xml)的配置信息,為struts

           中不同的模塊初始化相應(yīng)的對(duì)象。(面向?qū)ο笏枷?

           2.發(fā)送請(qǐng)求:用戶提交表單或通過URL向WEB服務(wù)器提交請(qǐng)求,請(qǐng)求的數(shù)據(jù)用HTTP協(xié)議傳給web服務(wù)器。

           3.form填充:struts的總控制器ActionServlet在用戶提交請(qǐng)求時(shí)將數(shù)據(jù)放到對(duì)應(yīng)的form對(duì)象中的成員

           變量中。

           4.派發(fā)請(qǐng)求:控制器根據(jù)配置信息對(duì)象ActionConfig將請(qǐng)求派發(fā)到具體的Action,對(duì)應(yīng)的formBean一并

           傳給這個(gè)Action中的excute()方法。

           5.處理業(yè)務(wù):Action一般只包含一個(gè)excute()方法,它負(fù)責(zé)執(zhí)行相應(yīng)的業(yè)務(wù)邏輯(調(diào)用其它的業(yè)務(wù)模塊)

           完畢后返回一個(gè)ActionForward對(duì)象。服務(wù)器通過ActionForward對(duì)象進(jìn)行轉(zhuǎn)發(fā)工作。

           6.返回響應(yīng):Action將業(yè)務(wù)處理的不同結(jié)果返回一個(gè)目標(biāo)響應(yīng)對(duì)象給總控制器。

           7.查找響應(yīng):總控制器根據(jù)Action處理業(yè)務(wù)返回的目標(biāo)響應(yīng)對(duì)象,找到對(duì)應(yīng)的資源對(duì)象,一般情況下

           為jsp頁面。

           8.響應(yīng)用戶:目標(biāo)響應(yīng)對(duì)象將結(jié)果傳遞給資源對(duì)象,將結(jié)果展現(xiàn)給用戶。

          下面具體介紹一下struts1配置并配合簡單的例子簡單易懂:

              Action, ActionForm, ActionForward ,這三個(gè)對(duì)象構(gòu)成了Struts 的核心。 


            Struts 最核心的控制器是ActionServlet ,該Servlet 攔截用戶請(qǐng)求,井將用戶請(qǐng)求轉(zhuǎn)入到Struts 體系內(nèi)。

          一、配置ActionServlet 


          ActionServlet 是一個(gè)標(biāo)準(zhǔn)的Servlet ,在web.xml 文件中配置,該Servlet 用于攔所有的HTTP 請(qǐng)求。 


          在web.xml 文件中配置ActionServlet 應(yīng)增加如下片段:

           <servlet>
              <!-- ActionServlet 的名 -->
              <servlet-name>actionSevlet</servlet-name>
              <!-- 配置Servlet 的實(shí)現(xiàn)類 -->
              <servlet-class>
                  org.apache.struts.action.ActionServlet
              </servlet-class>
              <!-- 指定Struts 的第一個(gè)配置文件 -->
              <init-param>
                  <!-- 指定配置文件的映射 -->
                  <param-name>config</param-name>
                  <param-value>/WEB-INF/struts-con工fgl.xml</param-value>
              </init-param>
              <!-- 指定Struts 的第二個(gè)配置文件 -->
              <init-param>
                  <!-- 指定配置文件的映射 -->
                  <param-name>config/wawa</param-name>
                  <param-value>/WEB-INF/struts-config2.xml</param-value>
              </init-param>
              <!-- 將ActionServlet配置成自啟動(dòng)Servlet -->
              <load-on-startup>2</load-on-startup>
          </servlet>

          二、配置ActionForm 


          配置ActionForm ,必須包含ActionForm 類才行。Struts 要求ActionForm 必須繼承Struts 的基類: org.apache.struts.action.ActionForm,ActionForm 的實(shí)現(xiàn)非常簡單,該類只是一個(gè)普通的JavaBean,只要為每個(gè)屬性提供對(duì)應(yīng)的setter 和getter 方法即可。根據(jù)前面的講解, ActionForm 用于封裝用戶的請(qǐng)求參數(shù),而請(qǐng)求參數(shù)是通過JSP 頁面的表單域傳遞過來的。因此應(yīng)保證ActionForm 的參數(shù)與表單域的名字相同。 


          注意: JavaB ean 的參數(shù)是根據(jù)getter 、setter 方法確定的。如果希望有一個(gè)A 的屬性,則應(yīng)該提供getA 和setA 的方法。 


          (1)ActionForm的實(shí)現(xiàn) 


          ActionForm 的屬性必須與JSP 頁面的表單域相同。本示例的表單包含如下兩個(gè)表單域: 


          • usemame 


          • password 


          因此, ActionForm 必須繼承org.apache.struts.action.ActionForm,并為這兩個(gè)域提供對(duì)應(yīng)的setter 和getter 方法,下面是ActionForm 的源代碼:


          import org.apache.struts.action.ActionForm;
          public class LoginForm extends ActionForm {
              private String username;
              private String password;

              // 表單域username對(duì)應(yīng)的setter 方法
              /**
               * @return the username
               */
              public String getUsername() {
                  return username;
              }

              /**
               * @param username
               *            the username to set
               */
              public void setUsername(String username) {
                  this.username = username;
              }

              /**
               * @return the password
               */
              public String getPassword() {
                  return password;
              }

              /**
               * @param password
               *            the password to set
               */
              public void setPassword(String password) {
                  this.password = password;
              }

          }

          (2)ActionForm 的配置 


          所有的ActionForm 都被配置在struts-config.xml 文件中,該文件包括了一個(gè)form-beans 的元素,該元素內(nèi)定義了所有的ActionForm,每個(gè)ActionForm 對(duì)應(yīng)一個(gè)form-bean 元素。 


          為了定義LoginForm. 必須在struts-config.xml文件中增加如下代碼:

          <!-- 用于定義所有的ActionForm -->
          <form-beans>
              <!-- 定義ActionForm,至少指定兩個(gè)屬性: name , type-->
              <form-bean name="loginForm" type="lee.LoginForm" />
          </form-beans>

          三、配置Action 


          Action 的配置比ActionForm 相對(duì)復(fù)雜一點(diǎn),因?yàn)锳ction 負(fù)責(zé)管理與之關(guān)聯(lián)的ActionForm. 它不僅需要配置實(shí)現(xiàn)類,還需要配置Action 的path 屬性,該屬性用于被用 


          戶請(qǐng)求。對(duì)于只需在本Action 內(nèi)有效的Forward. 還應(yīng)在Action 元素內(nèi)配置局部Forward。 


          (1)Action 的實(shí)現(xiàn) 


          通過ActionForm. 可使Action 無須從HTTP 請(qǐng)求中解析參數(shù)。因?yàn)樗械膮?shù)都被封裝在ActionForm中,下面是Action 從AcitionForm 取得請(qǐng)求參數(shù)的源代碼:

          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          import org.apache.struts.action.Action;
          import org.apache.struts.action.ActionForm;
          import org.apache.struts.action.ActionForward;
          import org.apache.struts.action.ActionMapping;
          public class LoginAction extends Action {
              // 必須重寫該核心方法,該方法actionForm 將表單的請(qǐng)求參數(shù)封裝成值對(duì)象
              public ActionForward execute(ActionMapping mapping, ActionForm form,
                      HttpServletRequest request, HttpServletResponse response)
                      throws Exception {
                  //將ActionForm強(qiáng)制類型轉(zhuǎn)換為LoginForm
                  LoginForm loginForm = (LoginForm) form;
                  // 從ActionForm中解析出請(qǐng)求參數(shù): username
                  String username = loginForm.getUsername();
                  // 從ActionForm中解析出請(qǐng)求參數(shù): password
                  String pass = loginForm.getUsername();
                  //后面的處理與前一個(gè)示例的Action 相同。
                  ...
              }
          }

          該Action 從轉(zhuǎn)發(fā)過來的ActionForm 中解析請(qǐng)求參數(shù),對(duì)應(yīng)的ActionForm 則由ActionServlet 在接收到用戶請(qǐng)求時(shí),負(fù)責(zé)實(shí)例化。 


          實(shí)際的過程是: ActionServlet 攔截到用戶請(qǐng)求后,根據(jù)用戶的請(qǐng)求,在配置文件中查找對(duì)應(yīng)的Action , Action 的name 屬性指定了用于封裝請(qǐng)求參數(shù)的ActionForm; 然后ActionServlet 將創(chuàng)建默認(rèn)的ActionForm 實(shí)例,并調(diào)用對(duì)應(yīng)的setter 方法完成ActionForm的初始化。 


          ActionServlet 在分發(fā)用戶請(qǐng)求時(shí),也將對(duì)應(yīng)ActionForm 的實(shí)例一同分發(fā)過來。 


          (2)Action 的配置 


          Action 需要配置如下幾個(gè)方面。 


          • Action 的path: ActionServlet 根據(jù)該屬性來轉(zhuǎn)發(fā)用戶的請(qǐng)求,即將用戶請(qǐng)求轉(zhuǎn)發(fā)與之同名的Action 。同名的意思是:將請(qǐng)求的.do 后綴去掉,匹配Action 的path屬性值。 


          • Action 的name: 此處的name 屬性并不是Action 本身的名字,而是與Action 關(guān)聯(lián)的ActionForm。因此該name 屬性必須是前面存在的ActionForm 名。 


          • Action 的type: 該屬性用于指定Action 的實(shí)現(xiàn)類,也就是負(fù)責(zé)處理用戶請(qǐng)求的業(yè) 


          務(wù)控制器。 


          • 局部Forward: Action 的轉(zhuǎn)發(fā)并沒有轉(zhuǎn)發(fā)到實(shí)際的JSP 資源,而是轉(zhuǎn)發(fā)到邏輯名,即Forward 名。在Action 內(nèi)配置的Forward 都是局部Forward (該Forward 只在該Action 內(nèi)有效)。 


          下面是該Action 的配置代碼:

          <!-- 該元素里配置所有的Action -->
          <action-mappings>
              <!-- 配置Action. 指定了path , name , type 等屬性 -->
              <action path="/login" type="lee.LoginAction" name="loginForm">
                  <!-- 配置局部Forward -->
                  <forward name="welcome" path="/WEB-INF/jsp/welcome.jsp" />
                  <forward name="input" path="/login.jsp" />
              </action>
          </action-mappings>

          四、配置Forward 


          正如前面所講, Forward 分局部Forward 和全局Forward 兩種。前者在Action 里配置,僅對(duì)該Action 有效:后者單獨(dú)配置,對(duì)所有的Action 都有效。 


          配置Forward 非常簡單,主要需要指定以下三個(gè)屬性。 


          • name: 該Forward 的邏輯名。 


          • path: 該Forward 映射到的JSP 資源。 


          • redirect: 是否使用重定向。 


          局部Forward 作為Action 的子元素配置;全局Forward 配置在global-forwards 元素里。 


          下面是配置全局Forward 的代碼:

          <!-- 配置全局Forward -->
          <global-forwards>
              <!-- 配置Forward對(duì)象的name 和path 屬性 -->
              <forward name="error" path="/WEB-INF/jsp/error.jsp" />
          </global-forwards>

          上面的配置代碼中,配置了一個(gè)全局Forward,該Forward 可以被所有的Action 訪問。通常,只將全局資源配置成全局Forward。當(dāng)每個(gè)Action 在轉(zhuǎn)發(fā)時(shí),首先在局部Forward 中查找與之對(duì)應(yīng)的Forward,如果在局部Forward 中找不到對(duì)應(yīng)的Forward 對(duì)象,才會(huì)到全局Forward 中查找。因此,局部Forward 可以覆蓋全局Forward。 


          下面提供了該應(yīng)用的struts-config.xm1文件的全部源代碼:

          <?xml version="1.0" encoding="UTF-8"?>
          <!-- Struts 配置文件的文件頭,包含DTD 等信息 -->
          <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
          <!--Struts 配置文件的根元素 -->
          <struts-config>
              <!--配置所有的ActionForm -->
              <form-beans>
                  <!--配置第一個(gè)ActionForm,指定ActionForm的name 和type 屬性 -->
                  <form-bean name="loginForm" type="lee.LoginForm" />
              </form-beans>
              <!--配置全局Forward對(duì)象 -->
              <global-forwards>
                  <!--該Forward對(duì)象的name 屬性為error. 映射資源為/WEB-INF/jsp/error.jsp -->
                  <forward name="error" path="/WEB-INF/jsp/error.jsp" />
              </global-forwards>
              <!--此處配置所有的Action 映射-->
              <action-mappings>
                  <!--配置Action 的path. type 屬性name 屬性配置Action 對(duì)應(yīng)的ActionForm-->
                  <action path="/login" type="lee.LoginAction" name="loginForm">
                      <!--還配置了兩個(gè)局部Forward. 這兩個(gè)局部Forward僅對(duì)該Action有效-->
                      <forward name="welcome" path="/WEB-INF/jsp/welcome.jsp" />
                      <forward name="input" path="/login.jsp" />
                  </action>
              </action-mappings>
          </struts-config>

           上面就是struts1配置大致過程,如果你還不是很明白,可以下載我上傳的一個(gè)源碼(就是按照上面的步驟配置的,一個(gè)簡單的登陸)。

           源碼下載地址:http://download.csdn.net/detail/lizi22/6796111

          posted on 2014-01-01 17:26 Mr Lee 閱讀(6497) 評(píng)論(2)  編輯  收藏 所屬分類: java技術(shù)

          Feedback

          # re: Struts1 原理及配置講解附源碼 2014-01-02 09:06 鵬達(dá)鎖業(yè)

          不打算寫年終總結(jié),實(shí)在是沒什么好總結(jié)的。無論是苦逼了一年,還是逗逼了一年,這一年還是過去了  回復(fù)  更多評(píng)論   

          # re: Struts1 原理及配置講解附源碼 2014-01-03 09:07 鵬達(dá)鎖業(yè)

          贊一個(gè),歡迎回訪  回復(fù)  更多評(píng)論   


          My Links

          Blog Stats

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章檔案

          (hibernate)http://www.aygfsteel.com/dyllove98/archive/2012/05/12/377959.html

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 买车| 兖州市| 焦作市| 海原县| 盐源县| 朔州市| 惠东县| 油尖旺区| 沈丘县| 乐都县| 潜江市| 绥阳县| 玉门市| 辉南县| 乐清市| 咸宁市| 绥中县| 全椒县| 太和县| 左权县| 林周县| 五莲县| 岢岚县| 甘肃省| 建宁县| 垣曲县| 班戈县| 广东省| 泊头市| 天门市| 四平市| 波密县| 朝阳市| 黄冈市| 德格县| 宁河县| 容城县| 胶州市| 凤翔县| 墨脱县| 泸西县|