這幾天一直在學習JPetStore這個基與輕量級j2EE架構的寵物電子商務網站,下面來分析一下基於Struts+Spring+Ibatis架構的用戶管理模塊.
首先分析一下jpetstore的用戶登錄界面,看struts-config.xml文件,
用戶信息Bean,用戶信息Bean為AccountActionForm配置兩個不同的實例。accountForm用戶存放用戶登錄信息。workingAccountForm用於用戶注冊,以及賬號修改時存放信息。<form-beans>
<!--存放用戶登陸的賬號信息-->
<form-bean name="accountForm"
type="org.springframework.samples.jpetstore.web.struts.AccountActionForm"/>
<form-bean name="cartForm" type="org.springframework.samples.jpetstore.web.struts.CartActionForm"/>
<form-bean name="emptyForm" type="org.springframework.samples.jpetstore.web.struts.BaseActionForm"/>
<!--用於用戶注冊和個人資料修改時存放用戶信息-->
<form-bean name="workingAccountForm"
type="org.springframework.samples.jpetstore.web.struts.AccountActionForm"/>
<form-bean name="workingOrderForm"
type="org.springframework.samples.jpetstore.web.struts.OrderActionForm"/>
</form-beans>
1.使用已有帳號登陸<action path="/shop/signonForm"
type="org.springframework.samples.jpetstore.web.struts.DoNothingAction"
validate="false">
<forward name="success" path="/WEB-INF/jsp/struts/SignonForm.jsp"/>
</action>
<action path="/shop/signon"
type="org.springframework.samples.jpetstore.web.struts.SignonAction"
name="accountForm" scope="session" validate="false">
<forward name="success" path="/shop/index.do"/>
</action>
<!-- 用戶點擊登陸,系統調用 shop/signonForm 直接將用戶的登陸請求,轉向到SignonForm.jsp頁面(登陸界面),輸入用戶名,密碼,點擊登錄,系統將調用 shop/signon Action來處理用戶登錄請求,如果登陸失敗,頁面返回到SignonForm.jsp頁面(登陸界面),登陸成功,shop/signon 轉到主頁面shop/index.do。--〉
2.創建新帳號
<!-- 如果用戶在當前登錄頁面(SigonForm.jsp)中選擇“創建新帳號”,系統將調用“shop/newAccountForm”在NewAccountFormAction 的execute中為httpsession創建AccountActionForm用戶存放用戶的注冊信息,然後轉向到用戶注冊界面NewAccountForm.jsp --><action path="/shop/newAccountForm"
type="org.springframework.samples.jpetstore.web.struts.NewAccountFormAction"
name="workingAccountForm" scope="session" validate="false">
<forward name="success" path="/WEB-INF/jsp/struts/NewAccountForm.jsp"/>
</action>
<!--用戶在填寫完注冊信息以後,注冊,系統調用“NewAccountAction”,如果注冊失敗,返回注冊界面,系統將顯示注冊的錯誤信息,如果注冊成功,系統自動轉向到主頁面。--><action path="/shop/newAccount"
type="org.springframework.samples.jpetstore.web.struts.NewAccountAction"
name="workingAccountForm" scope="session"
validate="true" input="/WEB-INF/jsp/struts/NewAccountForm.jsp">
<forward name="success" path="/shop/index.do"/>
</action>
3.編輯賬號
<!-- 當用戶點擊修改用戶信息的時候,系統調用editAccountForm 為賬號的修改做一些必要的准備,然後定向到賬號修改頁面EditAccountForm.jsp,用戶輸入修改,點擊提交,系統調用shop/editAccount檢查修改資料是否合法,如果沒有錯誤,確認修改,轉到主頁面,若有錯誤,轉到賬號修改界面-><action path="/shop/editAccountForm" type="org.springframework.samples.jpetstore.web.struts.EditAccountFormAction"
name="workingAccountForm" scope="session" validate="false">
<forward name="success" path="/WEB-INF/jsp/struts/EditAccountForm.jsp"/>
</action>
<action path="/shop/editAccount" type="org.springframework.samples.jpetstore.web.struts.EditAccountAction"
name="workingAccountForm" scope="session" validate="true" input="/WEB-INF/jsp/struts/EditAccountForm.jsp">
<forward name="success" path="/shop/index.do"/>
</action>
個人分析:
從jpetsore的賬號管理的源代碼來看,有以下幾個值得我們注意的地方(目前對struts還不是很熟悉):
1.AccountActionForm封裝了賬號Account,不知道是不是這個原因,需要在轉入創建賬號頁面,或者是修改賬號頁面的情況下,在action的doExecute執行中都創建了AccountActionForm實例,並對其進行了初始化,並把它加入了httpsession中。
2.系統用BaseActionForm繼承了ActionFrom ,使用BaseAction繼承了Action,同時把這兩個子類替代了其父類在系統中的作用,所余的from和action都是從這兩個派生類派生出來的。BaseActionFrom提供了方便的字段校驗,而BaseAction加入了
public void setServlet(ActionServlet actionServlet) {
super.setServlet(actionServlet);
if (actionServlet != null) {
ServletContext servletContext = actionServlet.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
this.petStore = (PetStoreFacade) wac.getBean("petStore");
}
很好的和spring銜接在了一起,獲得了系統的業務邏輯對象 。