1.什么是Struts2?
- 是基于MVC模式的開源Java EE技術(shù)Web開發(fā)框架。
- 什么是框架?
其實(shí)就是一組jar包,其本質(zhì)是對(duì)jdk功能的擴(kuò)展,包括一系列最佳的實(shí)踐,作用是解決某個(gè)領(lǐng)域的問題。 - 什么是MVC模式?
1.定義:是一種對(duì)代碼進(jìn)行分層開發(fā)的方式。
2.用途:對(duì)組建之間進(jìn)行隔離、分層,從而有利于代碼的后期維護(hù)。
3.內(nèi)容:- M:Model,代表業(yè)務(wù)邏輯層,是應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部分。
通常模型對(duì)象負(fù)責(zé)在數(shù)據(jù)庫(kù)中存取數(shù)據(jù)。 - V:View,代表是圖層,是應(yīng)用程序中處理數(shù)據(jù)顯示的部分。
通常視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的。 - C:Controlle,代表控制層,是應(yīng)用程序中處理用戶交互的部分。
通??刂破髫?fù)責(zé)從視圖讀取數(shù)據(jù),控制用戶輸入,并向模型發(fā)送數(shù)據(jù)。
- M:Model,代表業(yè)務(wù)邏輯層,是應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部分。
- 什么是框架?

- Struts2是來(lái)源于WebWork框架,是在WebWork框架的基礎(chǔ)上再與Struts1的優(yōu)點(diǎn)進(jìn)行整合而設(shè)計(jì)出來(lái)的新MVC框架。
2.配置Struts2到eclipse中
1.進(jìn)入Struts2的官網(wǎng)下載Struts2安裝包:http://struts.apache.org

2.下載到本地后解壓:
解壓后,apps文件內(nèi)就是一些實(shí)例,lib文件夾是Struts2所需的所有jar包庫(kù),docs文件夾是說(shuō)明文檔。

3.在eclipse中配置Struts2環(huán)境,主要是分三步,第一步是導(dǎo)入所需的jar包,第二步配置web.xml,第三步配置Struts.xml。
lib文件夾下有所有的jar包,但我們不會(huì)全部都用到,剛開始我們只需要導(dǎo)入常用的若干jar包即可,我們可以解壓Apps文件夾下的struts2-blank.war,該實(shí)例的lib文件夾中只包含幾項(xiàng)常用的jar包。所以,我們將解壓后的struts2-blank.war導(dǎo)入到eclipse中,文檔結(jié)構(gòu)如圖所示:

下面我們就在這個(gè)文檔的基礎(chǔ)上開發(fā)一個(gè)基于Struts2框架的模擬登錄的實(shí)例。
3.用Struts2實(shí)現(xiàn)簡(jiǎn)單的模擬登錄
- 首先,新建三個(gè)JSP頁(yè)面:登錄頁(yè)面 login.jsp,登錄成功頁(yè)面true.jsp,登錄失敗頁(yè)面 false.jsp。
1.login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Struts2實(shí)現(xiàn)登錄</title>
</head>
<body>
<form action="login.action" method="post" name="login">
用戶名:<input name="username" type="text" id="textfield"/>
密碼:<input name="password" type="text" id="textfield2"/>
<input type="submit" name="button" value="提交">
</form>
</body>
</html>
2.true.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
sucess!
<br>
welcome,<s:property value="username"></s:property>
</body>
</html>
3.false.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
wrong!
</body>
</html>
- 新建業(yè)務(wù)(控制)組件
Struts2的業(yè)務(wù)組建非常的簡(jiǎn)潔,簡(jiǎn)潔到僅僅由一個(gè)POJO(簡(jiǎn)單的Java對(duì)象)就可以實(shí)現(xiàn)Struts1中Action+ActionFrom的功能,這也是Struts2解耦合特性的體現(xiàn)。另外如果嚴(yán)格的說(shuō),Struts2的Action并不是一個(gè)業(yè)務(wù)組件,他僅僅是一個(gè)控制層,真正的業(yè)務(wù)組件是通過新建一個(gè)JavaBean業(yè)務(wù)層/服務(wù)層來(lái)實(shí)現(xiàn)的。
新建一個(gè)package包,命名為controller,然后再該包中新建一個(gè)Login類,這個(gè)類的功能就相當(dāng)于Struts1中的Action或Servlet,其功能都是MVC模型中的控制層,代碼如下:
package controller;
public class Login {
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;
}
public String execute(){
if(username.equals("root")&&password.endsWith("123123")){
return "toTure";
}else{
return "toFalse";
}
}
}
上述代碼中新建了兩個(gè)屬性u(píng)sername、password,并生成其get/set方法,并實(shí)現(xiàn)execute()方法,該方法是規(guī)定的,必須是一個(gè)public的方法,且該方法返回的數(shù)據(jù)類型是字符串String,方法名是execute,該約定就像public static void main(String args[])一樣固定。
execute()方法返回的是一個(gè)指向物理文件地址的邏輯名稱,在配置文件struts.xml中進(jìn)行了配置,相當(dāng)于Struts1中的ActionForward類。
在execute()方法中對(duì)username、password的值進(jìn)行判斷,如果成功則返回一個(gè)字符串toTrue,否則返回toFalse。這里需要注意的是,class Login類中的username、password實(shí)際上與login.jsp頁(yè)面中的表單名稱相對(duì)應(yīng),代碼如下:
<form action="login.action" method="post" name="login">
用戶名:<input name="username" type="text" id="textfield"/>
密碼:<input name="password" type="text" id="textfield2"/>
<input type="submit" name="button" value="提交">
</form>
至此,已經(jīng)創(chuàng)建完成了JSP頁(yè)面和控制層文件,而且,已經(jīng)在控制層類Login中實(shí)現(xiàn)了一個(gè)簡(jiǎn)易的登錄驗(yàn)證功能,下一步就是通過配置JSP頁(yè)面與Login類和其他組件關(guān)聯(lián)起來(lái)。
- 配置web.xml
編輯WebContent下WEB-INF中的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts Blank</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>
添加過濾器的目的是攔截所有請(qǐng)求。在Struts1中使用的是中心控制類的ActionServlet來(lái)進(jìn)行請(qǐng)求的分發(fā),Struts2中使用的是過濾器。
為什么要配置web.xml?
因?yàn)閃eb應(yīng)用是基于請(qǐng)求/響應(yīng)架構(gòu)的應(yīng)用,所以不管是哪一種MVC Web架構(gòu),都需要在web.xml中配置該框架的核心servlet或Filter,這樣才可以讓該框架加入到Web應(yīng)用中。
- 新建中心配置文件struts.xml
配置文件struts.xml相當(dāng)于Struts1的配置文件struts-config.xml,是一個(gè)中心配置文件。這個(gè)配置文件struts.xml要放到classes目錄中,所以要在項(xiàng)目的資源目錄src中創(chuàng)建struts.xml文件,創(chuàng)建完畢后,在struts.xml中注冊(cè)Action和result。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="struts2" extends="struts-default">
<action name="login" class="controller.Login">
<result name="toTure">/true.jsp</result>
<result name="toFalse">/false.jsp</result>
</action>
</package>
</struts>
標(biāo)記action是本例的主要部分,屬性值name是訪問Action的URL,就像servlet的URL映射地址一樣,通過這個(gè)名稱就可以訪問到這個(gè)action,屬性class是這個(gè)Action在項(xiàng)目中具體java文件的完整路徑,要帶上包名以及類名,是一個(gè)完整的路徑。子標(biāo)記result的功能是執(zhí)行完Action后要到達(dá)的JSP頁(yè)面的路徑,該路徑要使用邏輯名來(lái)標(biāo)記,所以result標(biāo)記的name屬性就是這個(gè)true.jsp的邏輯名稱,通過該邏輯名稱可以找到true.jsp物理文件所以,Struts2只需要獲取exectue()方法返回的字符串就可以確定下一步轉(zhuǎn)向哪一個(gè)JSP頁(yè)面。
還需要注意的是,form表單action屬性值login.action中的login指的就是配置文件struts.xml代碼:
<action name="login" class="controller.Login">
中的name="login",兩個(gè)的值是對(duì)應(yīng)的。
運(yùn)行一下,結(jié)果:

至此,我們就完成了一個(gè)簡(jiǎn)單的基于Struts2框架模擬登錄的小實(shí)例,不早了,該睡覺了,等下次我們?cè)僖黄鹄^續(xù)深入探究Struts2框架。