【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
<?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,介面從業務邏輯分離出來,靈活多變,同時,使用配置檔案將控制層也變得更加靈活,降低了系統耦合。大道至簡,一切變得輕鬆,簡單了。