国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

JBuilder2005 Struts深度體驗之改造

2024-07-21 02:15:16
字體:
來源:轉載
供稿:網友
中國最大的web開發資源網站及技術社區,

  用actionform截獲登錄表單數據

  原登錄模塊用bookstore.user描述login.jsp登錄頁面表單的數據,在switch.jsp程序中通過<jsp:usebean>標簽獲取login.jsp表單的數據。其實user類相當于struts框架中的模型,我們將通過一個actionform更好地實現這個功能。

  actionform和bean一樣以屬性名匹配的映射機制從http請求中填充對象數據,但actionform比一般的bean提供了更多的功能,struts允許actionform通過validate()方法進行自校驗,當數據不合法時自動轉向到輸出界面,此外還可以通過reset()方法,在數據填充前復位屬性值。

  下面我們就來創建useractionform,替換user的功能,建立起struts框架中的"數據模型"。

  1.指定actionform的web模塊及類信息

  file->new...->web->在web頁中雙擊actionform圖標,彈出如圖 6所示的對話框:


圖 6 創建useractionform

  ·struts config:我們前面有提到struts1.1支持多個配置文件,所以你在這兒可以選擇使用哪個struts配置文件。因為我們現在還沒有定義多個struts配置文件,所以只得使用struts-config.xml。在開發新增圖書的功能時,我們將定義另一個配置文件。

  ·actionform:actionform的類名,這里我們填入useractionform。

  按next到下一步。

  2.定義actionform屬性


圖 7 定義actionform屬性

  通過add...按鈕為useractionform增加4個屬性,如圖 7所示。特別的,如果這個actionform所對應的入口頁面已經創建,你也可以直接通過add from jsp...按鈕,選擇一個jsp頁面,jbuilder會分析這個頁面的表單,并將表單的數據組件名抽取為actionform的屬性。

  按next到下一步。

  3.一些附加功能的定義


圖 8 附加功能定義

  在formbeanname中為useractionform指定一個名字,一般接受jbuilder所提供的默認名即可。這個名字將在struts-config.xml文件用來命名useractionform。

  actionform比一般javabean強大的地方在于它可以進行數據檢驗,還可以進行數據復位。如果這個actionform最終要放到session中的,那么最好實現reset()方法,以復位actionform的數據,否則屬性可能不會反映最新的值。這里, useractionform無需進行數據有效性校驗,但由于useractionform最終需要放到session中,所以我們需要實現reset()方法。故此我們勾選create/replace reset() method body選項。

  直接按finish創建useractionform,再將user類的代碼拷貝過來,整改后的最終代碼如下所示:

  代碼清單 6 以actionform實現的user類

1. package bookstore;
2.
3. import java.sql.*;
4. import java.text.*;
5. import java.util.date;
6. import javax.servlet.http.*;
7. import org.apache.struts.action.*;
8.
9. public class useractionform
10. extends actionform
11. {
12.  private string userid;
13.  private string password;
14.  private string username;
15.  private string logindatetime;
16.  public string getpassword() {
17.   return password;
18.  }
19.
20.  …
21.  //復位所有屬性值
22.  public void reset(actionmapping actionmapping,httpservletrequest servletrequest) {
23.   this.userid = null;
24.   this.username = null;
25.   this.password = null;
26.   this.logindatetime = null;
27. }


  此外,jbuilder自動在struts-conf.xml文件中通過<form-bean>描述actionform。useractionform必須和一個action相關聯,因為http請求通過struts總控制器轉發給action,struts控制器一旦發現action有一個對應的actionform時,就用http請求的數據填充這個actionform。

  用action代替switch.jsp的控制轉換功能

  我們在前面已經數落用switch.jsp實現請求轉換控制的缺點,struts框架的action是實現請求轉換控制的最適合替代者。

  在這節里,我們就來創建一個名為loginaction的action,讓其完美的接替switch.jsp的工作。

  file->new...->web->在web頁中雙擊action圖標,啟動創建action的向導。

  1.指定action名字及web模塊


圖 9 指定web模塊及action名字

  在action中鍵入loginaction作為action的類名,其中base class的下拉框中有許多action基類可供選擇,它們用于不同的場合,這些選項是:

  ·org.apache.struts.action.action:標準的action。

  ·org.apache.struts.actions.forwardaction:相當于jsp的<jsp:forward>,方便struts控制器進行預處理。此外,從學究的角度上來說,在jsp頁面直接通過<jsp:forward>違反了mvc的分層原則,控制器無法干預。

  ·org.apache.struts.actions.includeaction:出于forwardaction相似的原因,struts推薦用includeaction代替jsp的<jsp:include>。

  ·org.apache.struts.actions.lookupdispatchaction:如果一個表單有多個提交按鈕,不同的提交按鈕執行不同的業務操作,用dispatchaction最為合適。

  ·org.apache.struts.actions.switchaction:用switchaction可在不同的struts模塊間轉換。

  由于我們的action需要完成用戶密碼驗證的業務,并根據結果轉換到不同的頁面中,所以這個loginaction是一個普通的action,故我們選擇org.apache.struts.action.action。

  按next到下一步。

  2.設置action的配置信息


圖 10 設置loginaction的配置信息

  ·action path:訪問這個action的uri,接受默認的/loginaction,這樣我們將通過類似這樣的url:http://127.0.0.1:8080/webmodule/loginaction.do來訪問這個action。

  ·formbean name:下拉框中列出web模塊中所有的actionform,我們選擇前一小節中所創建的useractionform。這樣客戶端的http請求訪問loginaction時,http請求所帶的數據就會被struts總控制器自動填充到useractionform中了。

  ·scope:action有兩個選擇:request和session。表示actionform在填充后將放在request對象中還是session對象中,由于我們需要在通過密碼驗證后,才使用戶登錄系統。這樣就不能使useractionform在數據填充時就放入session中,而應該在通過密碼驗證后,手工將其綁定到session中(useractionform一旦綁定到session中,其valuebound()方法就會被調用,記錄用戶登錄日志),故此,我們選擇request。

  ·input jsp:輸入的jsp頁面。在actionform需要進行數據有效性自校驗的情況下,如果校驗失敗,struts框架總控制器將請求返回到這個輸入頁面上。因為useractionform無需進行有效性校驗(在3.1的第3步我們沒有為useractionform實現自校驗功能),所以無需指定輸入的jsp。

  按finish按鈕直接創建loginaction,jbuilder自動打開struts config editor,生動形象地展現用戶登錄模塊struts框架下的處理流程,如圖 11所示:


圖 11 struts config editor

  位于中心的/loginaction是訪問loginaction的uri,它是登錄業務的控制器。struts總控制器創建一個useractionform實例,并用http請求的數據填充useractionform實例,然后將其傳給loginaction的execute()方法。

  3.定義訪問入口

  現在我們需要調整login.jsp表單的提交地址,使用loginaction來處理用戶登錄的請求,調整后的代碼如所示:

  代碼清單 7 login.jsp 使用loginaction處理用戶登錄

1. <%@page contenttype="text/html; charset=gbk" import="bookstore.userlist" %>
2. …
3. <form name="form1" method="post" action="/webmodule/loginaction.do">用戶名:
4.  <select name="userid">
5.   <option value="" selected>--登錄用戶--</option>
6.    <%=userlist.getuserlisthtml()%>
7.  </select>
8.  密 碼:
9.  <input name="password" type="password">
10.   <input type="submit" name="submit" value="登錄">
11. </form>
12. </body>
13. </html>


  如第3行所示,將原來action="switch.jsp"改為"/webmodule/loginaction.do",由于我們需要將整個應用部署于/webmodule的uri下,所以需要在action訪問的地址前加上/webmodule。如果通過struts的<html:form>標簽來指定表單提交的地址,則無需添加/webmodule,標簽將自動進行轉換,你將在本專題后續內容中學習到這種方法。

  注意:

  struts框架總控制器servlet通過路徑匹配的方式截獲http請求,其匹配串是*.do,表示url以.do結束的http請求才會被struts框架處理,否則struts忽略之。所以在寫鏈接地址時千萬不要忘了調用地址后加一個.do的后綴。


  對login.jsp做調整后,重新切換到/loginaction的struts config editor中,你將看到如圖 12所示的流程圖:


圖 12 在jsp中指定調用action后的流程圖

  jbuilder將分析web模塊中所有jsp文件,如果發現引用了/loginaction就將其添加到該圖中來,作為其訪問入口。

  4.為/loginaction定義兩個出口

  一個action一般只有一個入口,但往往會有多個出口,action根據業務處理的不同結果轉向相應的出口。圖 12 /loginaction右邊是一個帶"forward"的淺色虛框,右鍵單擊這個forward虛框,在彈出的菜單中點擊add forward菜單項,在strut config editor中將新增一個默認名為forward的出口項圖標,左鍵單擊這個forward新增的圖標,對這個出口進行制定,如圖 13所示:


圖 13 為action定義出口

  我們為這個出口地址取名為success,點擊path后的…按鈕彈出browser for path對話框,列出當前web模塊所有可作為出口地址,如圖 14所示:


圖 14 可選出口地址

  我們選擇welcome.jsp作為success的出口地址,按ok確定。

  按相同的方法再為/loginaction創建一個名為fail出口地址為fail.jsp以及名為error出口地址為error.jsp兩出口,最后登錄模塊的流程如圖 15所示:


圖 15 登錄模塊的最終流程

  后面,我們將在loginaction通過代碼根據用戶驗證成功與否決定程序的出口,你將會發現我們通過出口的名字引用出口的地址。
完成以上配置后,切換到source標簽頁,struts-config.xml文件中悉數記錄下了這個配置信息:

  代碼清單 8 登錄模塊對應struts-config.xml的配置信息

1. <struts-config>
2.  <form-beans>
3.   <form-bean name="useractionform" type="bookstore.useractionform" />
4.  </form-beans>
5.  <action-mappings>
6.   <action name="useractionform" path="/loginaction"
7.        scope="request" type="bookstore.loginaction">
8.    <forward name="success" path="/welcome.jsp" />
9.    <forward name="fail" path="/fail.jsp" />
10.   <forward name="error" path="/error.jsp" />
11.   </action>

12.  </action-mappings>
13. </struts-config>


  其中第3行的配置信息聲明了useractionform,為其指定了一個名字,在第6~10行是/loginaction的配置信息,它通過name屬性聲明這個action對應的actionform為useractionform。

  在第8~10行,3個出口各對應一個<forward>配置項,在loginaction中我們將通過<forward>的name屬性引用出口的地址。

  下面,我們調整loginaction類的execute()方法的代碼,在其中驗證用戶密碼,并根據驗證結果轉向不同的出口,其最終代碼如下所示:

  代碼清單 9 loginaction.java

1. package bookstore;
2.
3. import org.apache.struts.action.actionmapping;
4. import org.apache.struts.action.actionform;
5. import javax.servlet.http.httpservletrequest;
6. import javax.servlet.http.httpservletresponse;
7. import org.apache.struts.action.actionforward;
8. import org.apache.struts.action.action;
9.
10. import java.sql.*;
11.
12. public class loginaction
13. extends action {
14.  public actionforward execute(actionmapping actionmapping,
15.    actionform actionform,
16.    httpservletrequest servletrequest,
17.    httpservletresponse servletresponse) {
18.     useractionform useractionform = (useractionform) actionform;
19.      connection conn = null;
20.      try
21.     {
22.      conn = dbconnection.getconnection();
23.      preparedstatement pstat = conn.preparestatement(
24.        "select user_name from t_user where user_id=? and password = ?");
25.      pstat.setstring(1, useractionform.getuserid());
26.      pstat.setstring(2, useractionform.getpassword());
27.      resultset rs = pstat.executequery();
28.      if (rs.next())
29.      { //密碼正確
30.       useractionform.setusername(rs.getstring(1));
31.       servletrequest.getsession().setattribute("ses_userbean", useractionform);
32.       return actionmapping.findforward("success");//通過驗證,轉向welcome.jsp出口
33.      }
34.     }
35.     catch (sqlexception se)
36.     {
37.      se.printstacktrace();
38.      return actionmapping.findforward("error");//程序發生異常,轉向error.jsp出口
39.     }
40.     finally
41.     {
42.      try
43.      {
44.       if (conn != null)
45.       {
46.        conn.close();
47.       }
48.      }
49.      catch (sqlexception ex)
50.      {
51.       ex.printstacktrace();
52.       return actionmapping.findforward("error");//程序發生異常,轉向error.jsp出口
53.      }
54.     }
55.     return actionmapping.findforward("fail");//未通過驗證,轉向fail.jsp出口
56.    }
57. }


  在第18行通過強制類型轉換獲取useractionform實例,其后驗證用戶的代碼其實就是switch.jsp驗證用戶的scriptlet的代碼。我們根據用戶驗證的結果通過actionmapping將請求轉向不同的出口(如第32、38、52、55行所示),其中findforward(name)中的name即是struts-config.xml中對應action配置項的<forward>中指出的出口項名字。這種通過名字引用出口的調用方式給我們帶來了很大的靈活性,因為它將流程邏輯和具體實現隔離開來,假設你不希望用welcome.jsp作為登錄成功所轉向的頁面,你只要在配置文件中對success的出口配置項進行調整就可以了,而無需更改程序。

  在通過用戶驗證后,我們將useractionform手工放到session中(第31行),以ses_userbean為名放入session時useractionform的valuebound()方法會被觸發調用,記錄用戶登錄日志。由于原success.jsp包含下面的代碼:

<jsp:usebean id="ses_userbean" scope="session" class="bookstore.user"/>


  因為此時,我們已經用useractionform替換原user類,所以需要對這行代碼作調整,否則在進行強制類型轉換時將發生classcastexception異常。調整后的代碼為:

<jsp:usebean id="ses_userbean" scope="session" class="bookstore.useractionform"/>


  提示:

  一般情況下,action只執行流程控制的功能,而不執行具體的業務處理。所以loginaction的execute()中驗證用戶的業務最好抽取到一個具體的bo中(business object:商業處理對象)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 登封市| 正镶白旗| 绥芬河市| 达拉特旗| 宁城县| 理塘县| 讷河市| 皋兰县| 丹阳市| 唐河县| 崇仁县| 永修县| 临泉县| 渝中区| 桑植县| 吴忠市| 大荔县| 鄂州市| 亳州市| 平罗县| 娄烦县| 称多县| 商河县| 宜州市| 西乌珠穆沁旗| 西吉县| 舒城县| 孟津县| 汶上县| 临朐县| 南雄市| 乡城县| 桂林市| 岳阳县| 察隅县| 福泉市| 平陆县| 江达县| 通辽市| 呼伦贝尔市| 溧水县|