【SSH進階之路】Struts基本原理 + 實現簡單登錄(二)

 上面博文,主要簡單的介紹了一下SSH的基本概念,比較宏觀,作爲初學者能夠有一個整體上的認識,個人認爲對學習有很好的輔助功能,它不僅僅是一個“瞭望塔”,更是檢驗是否真正掌握所有內容的一個前提。

      Struts是基於MVC的框架,它進一步的對MVC進行了封裝,它是怎麼封裝的,我們從先回顧一下MVC再到Struts,再用Struts給大家實現一個簡單登錄的實例。我們開始吧。


MVC


概念


       MVC全名是Model View Controller,是模型(model)—視圖(view)—控制器(controller)的縮寫,知道這麼多就夠了。


      大家都知道SUN公司對於MVC模式先後推出的一種規範,第一種是JSP Model1,第二種則是JSP Model2;Model1就是jsp + javabean,Model2就是jsp + servlet + javabean兩種模式,前者是純JSP,後者是簡單的MVC。我們通過兩個時序圖來對比一下Model1和Model2:


Model1




優點:

1、編碼簡單

2、適合小型項目

 

缺點:

1、顯示層與業務邏輯混在一起

2、jsp的職責不單一,職責過重,不便於維護


Model2



 

優點:

1、分層清晰,職責清楚,比較適合於大型項目架構

2、可擴展性強

3、實現了業務邏輯和顯示分離,降低系統的耦合度


缺點:

1、增加了大量編寫代碼的工作量


對比


        Model1在一定程序上實現了MVC,即JSP是控制層與表示層合二爲一了,這樣的效果顯然不如將控制層單獨劃分出來的好。而Model2則是將控制層(sevlet)單獨的劃分出來了,專門負責業務流程的控制,接受頁面的請求,創建所需的javabean實例,並將處理後的數據再返回給JSP,渲染頁面,這樣分層清晰,可擴展性強,降低系統的耦合度。


Struts1


概念


       說概念真談不上,Struts實質上就是採用JavaServlet/JSP技術,在Model2的基礎上實現的一個MVC框架。


Struts1實現MVC的模型圖


         


各部分的職責


雖然說Struts不難,但對於初學者而言,真正的弄明白Struts也是一件很簡單的事,我們介紹一下幾個關鍵點的職責,以便對struts的原理有更進一步的認識。


ActionServlet,前端控制器

1、根據相應的規則截取Http請求的URL

2、將Http請求分發到相應的Action處理


ActionForm,相當於實體

1、收集表單數據,將表單數據轉換成相應的數據類型


Action,業務層控制器

1、 取得表單數據
2、調用業務邏輯
3、返回轉向信息


我們再根據登錄實例,對比上面的模型圖,進一步理解一下Struts的基本原理,最後做一下總結。

 

登錄實例


1、配置Struts

*拷貝struts相關的jar到WEB-INF/lib下
*在web.xml文件中配置ActionServlet
*提供struts-config.xml文件,需要放到WEB-INF下

如圖所示:

         

2、編寫代碼


web.xml

[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.   <welcome-file-list>  
  8.     <welcome-file>index.jsp</welcome-file>  
  9.   </welcome-file-list>  
  10.     
  11.   <!-- 標準 ActionServlet 配置文件-->  
  12.   <servlet>  
  13.     <servlet-name>action</servlet-name>  
  14.     <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>  
  15.     <init-param>  
  16.       <param-name>config</param-name>  
  17.       <param-value>/WEB-INF/struts-config.xml</param-value>  
  18.     </init-param>  
  19.     <init-param>  
  20.       <param-name>debug</param-name>  
  21.       <param-value>2</param-value>  
  22.     </init-param>  
  23.     <init-param>  
  24.       <param-name>detail</param-name>  
  25.       <param-value>2</param-value>  
  26.     </init-param>  
  27.     <load-on-startup>2</load-on-startup>  
  28.   </servlet>  
  29.   
  30.   
  31.   <!-- 標準 ActionServlet Mapping配置信息 -->  
  32.   <servlet-mapping>  
  33.     <servlet-name>action</servlet-name>  
  34.     <url-pattern>*.do</url-pattern>  
  35.   </servlet-mapping>  
  36.     
  37. </web-app>  

struts-config.xml

[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="ISO-8859-1" ?>  
  2.   
  3. <!DOCTYPE struts-config PUBLIC  
  4.           "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"  
  5.           "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">  
  6.   
  7. <struts-config>  
  8.     <form-beans>  
  9.         <form-bean name="loginForm" type="com.liang.struts.LoginActionForm"></form-bean>  
  10.     </form-beans>  
  11.       
  12.     <action-mappings>  
  13.         <action path="/login"   
  14.                 type="com.liang.struts.LoginAction"  
  15.                 name="loginForm"  
  16.                 scope="request"  
  17.                 >  
  18.             <forward name="success" path="/login_success.jsp"></forward>  
  19.             <forward name="error" path="/login_error.jsp"></forward>  
  20.         </action>  
  21.     </action-mappings>  
  22. </struts-config>  

LoginAction

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. package com.liang.struts;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. import org.apache.struts.action.Action;  
  7. import org.apache.struts.action.ActionForm;  
  8. import org.apache.struts.action.ActionForward;  
  9. import org.apache.struts.action.ActionMapping;  
  10. /** 
  11.  * 登錄Action 
  12.  * 負責取得表單數據,調用業務邏輯,返回轉向信息 
  13.  * @author liang 
  14.  * 
  15.  */  
  16. public class LoginAction extends Action {  
  17.   
  18.     @Override  
  19.     public ActionForward execute(ActionMapping mapping, ActionForm form,  
  20.             HttpServletRequest request, HttpServletResponse response)  
  21.             throws Exception {  
  22.         LoginActionForm laf =(LoginActionForm)form;  
  23.         //從ActionForm獲取表單數據  
  24.         String username = laf.getUsername();  
  25.         String password = laf.getPassword();  
  26.         UserManager userManager = new UserManager();  
  27.         try{  
  28.             //調用業務邏輯  
  29.             userManager.login(username, password);  
  30.             //跳轉到成功頁面  
  31.             return mapping.findForward("success");  
  32.         }catch(UserNotFoundException e){  
  33.             e.printStackTrace();  
  34.             request.setAttribute("msg""用戶不能找到,用戶名稱=[" + username + "]");  
  35.         }catch(PasswordErrorException e){  
  36.             e.printStackTrace();  
  37.             request.setAttribute("msg""密碼錯誤");  
  38.         }  
  39.         //跳轉到失敗頁面  
  40.         return mapping.findForward("error");  
  41.     }  
  42.   
  43. }  


LoginActionForm

[java] view plain copy
 print?
  1. package com.liang.struts;  
  2.   
  3. import org.apache.struts.action.ActionForm;  
  4. /** 
  5.  * 登錄ActionForm,負責表單收集數據 
  6.  * 表單的屬性必須和ActionForm中的get和set的屬性一致 
  7.  * @author liang 
  8.  * 
  9.  */  
  10. @SuppressWarnings("serial")  
  11. public class LoginActionForm extends ActionForm {  
  12.       
  13.     private String username;  
  14.       
  15.     private String password;  
  16.       
  17.     public String getUsername() {  
  18.         return username;  
  19.     }  
  20.     public void setUsername(String username) {  
  21.         this.username = username;  
  22.     }  
  23.     public String getPassword() {  
  24.         return password;  
  25.     }  
  26.     public void setPassword(String password) {  
  27.         this.password = password;  
  28.     }  
  29. }  


login.jsp

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <%@ page language="java" contentType="text/html; charset=GB18030"  
  2.     pageEncoding="GB18030"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=GB18030">  
  7. <title>Insert title here</title>  
  8. </head>  
  9. <body>  
  10.     <form action="login.do" method="post">  
  11.         用戶:<input type="text" name="username"><br>  
  12.         密碼:<input type="password" name="password"><br>  
  13.         <input type="submit" value="登錄"><br>  
  14.     </form>  
  15. </body>  
  16. </html>  

PS:登錄頁面不難,主要是一定注意action的名字和ActionServlet的配置一致。


總結


       Struts很好的封裝了MVC,界面從業務邏輯分離出來,靈活多變,同時,使用配置文件將控制層也變得更加靈活,降低了系統耦合。大道至簡,一切變得輕鬆,簡單了。


源碼


留個懸念,下篇博文,我們一步步重構MVC實現Struts框架的流程

發佈了0 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章