上面博文,主要簡單的介紹了一下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
- <?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框架的流程