【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也是一件非常easy的事,我們介紹一下幾個關鍵點的職責。以便對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
<?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"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 標準 ActionServlet 配置文件--> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>2</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <!-- 標準 ActionServlet Mapping配置信息 --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1" ?
> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="loginForm" type="com.liang.struts.LoginActionForm"></form-bean> </form-beans> <action-mappings> <action path="/login" type="com.liang.struts.LoginAction" name="loginForm" scope="request" > <forward name="success" path="/login_success.jsp"></forward> <forward name="error" path="/login_error.jsp"></forward> </action> </action-mappings> </struts-config>
LoginAction
package com.liang.struts; 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; /** * 登錄Action * 負責取得表單數據,調用業務邏輯。返回轉向信息 * @author liang * */ public class LoginAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { LoginActionForm laf =(LoginActionForm)form; //從ActionForm獲取表單數據 String username = laf.getUsername(); String password = laf.getPassword(); UserManager userManager = new UserManager(); try{ //調用業務邏輯 userManager.login(username, password); //跳轉到成功頁面 return mapping.findForward("success"); }catch(UserNotFoundException e){ e.printStackTrace(); request.setAttribute("msg", "用戶不能找到,用戶名稱=[" + username + "]"); }catch(PasswordErrorException e){ e.printStackTrace(); request.setAttribute("msg", "密碼錯誤"); } //跳轉到失敗頁面 return mapping.findForward("error"); } }
LoginActionForm
package com.liang.struts; import org.apache.struts.action.ActionForm; /** * 登錄ActionForm,負責表單收集數據 * 表單的屬性必須和ActionForm中的get和set的屬性一致 * @author liang * */ @SuppressWarnings("serial") public class LoginActionForm extends ActionForm { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
login.jsp
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Insert title here</title> </head> <body> <form action="login.do" method="post"> 用戶:<input type="text" name="username"><br> 密碼:<input type="password" name="password"><br> <input type="submit" value="登錄"><br> </form> </body> </html>
PS:登錄頁面不難。主要是一定註意action的名字和ActionServlet的配置一致。
總結
Struts非常好的封裝了MVC,界面從業務邏輯分離出來。靈活多變。同一時候,使用配置文件將控制層也變得更加靈活,減少了系統耦合。大道至簡,一切變得輕松。簡單了。
源代碼
留個懸念,下篇博文,我們一步步重構MVC實現Struts框架的流程。
【SSH進階之路】Struts基本原理 + 實現簡單登錄(二)