?? 第一章:struts2入門(mén).txt
字號(hào):
一. 下載
http://struts.apache.org/download.cgi
二. 介紹
Apache Struts 2是一個(gè)優(yōu)秀的,可擴(kuò)展的企業(yè)級(jí)Java WEB應(yīng)用程序框架.
是基于webwork2的框架,是WebWork和Struts社區(qū)二者的合并
功能:
1) 框架中包括了標(biāo)簽庫(kù)。標(biāo)簽與框架的驗(yàn)證和國(guó)際化特性相交互,來(lái)確保輸入的正確和輸出范圍.標(biāo)簽庫(kù)可以用在JSP,FreeMarker,或Velocity.當(dāng)然,其它的標(biāo)簽庫(kù),JSTL,和AJAX也可以使用,可選的同Struts標(biāo)簽.JSF組件也支持.
三. 新特性
比struts1.x與webwork2.x
1) Action不同,吸取webwork的action的特定,不需要繼承任何接口
2) 線程模式不同,struts1.x的action是單例的,2.0是一個(gè)請(qǐng)求一個(gè)實(shí)例,沒(méi)有線程安全問(wèn)題,但web容器保證不會(huì)產(chǎn)生性能問(wèn)題和過(guò)多的垃圾對(duì)象
3) servlet容器依賴(lài),action對(duì)request和response進(jìn)行了封裝,可以不依賴(lài)這些對(duì)象,但有需要,仍可訪問(wèn)它們。
4) 可測(cè)試性,提供了StrutsTestCase,可以很方便的模擬一些對(duì)象,進(jìn)行單元測(cè)試
5) 簡(jiǎn)化了actionform,不需要繼承任何父類(lèi)
6) 表達(dá)式語(yǔ)言,struts1整合了jstl,2.0使用Ognl
7) 校驗(yàn)不同,1.x用validatorForm+配置文件,2.x用xwork框架,XWork 校驗(yàn)框架使用為屬性類(lèi)類(lèi)型定義的校驗(yàn)和內(nèi)容校驗(yàn),來(lái)支持chain校驗(yàn)子屬性
8) Struts1 支持每一個(gè)模塊有單獨(dú)的Request Processors(生命周期),但是模塊中的所有Action必須共享相同的生命周期。Struts2 支持通過(guò)攔截器堆棧(Interceptor Stacks)為每一個(gè)Action創(chuàng)建不同的生命周期。堆棧能夠根據(jù)需要和不同的Action一起使用。
四、環(huán)境要求
servlet2.4+jsp2.0+jdk5.0
五、開(kāi)發(fā)工具
目前J2EE開(kāi)發(fā)工具主要分為Eclipse和NetBeans兩大陣營(yíng),Eclipse的最高版本為3.3,NetBeans 的最高版本為6.0.MyEclipse 是一個(gè)功能強(qiáng)大且框架支持非常廣泛的WEB 開(kāi)發(fā)插件,該產(chǎn)品是收費(fèi)項(xiàng)目。目前MyEclipse 的最高版本為6.0,即便如此,尚不支持Struts2.0,我們只能手工配置Struts2.0 的開(kāi)發(fā)環(huán)境。
六、庫(kù)文件
從網(wǎng)站上下載的Struts2 包含了二三十個(gè)庫(kù)文件,但大多數(shù)是可選的,有些庫(kù)是插件,用于和其他框架的整合。
讀者可自行下載struts2-blank-2.1.0.war 壓縮包,展開(kāi)后是一個(gè)非常簡(jiǎn)單的項(xiàng)目,從WEB-INF/lib 目錄中可以看到5個(gè)庫(kù)文件,解釋如下:
包名 說(shuō)明
commons-logging-1.0.4.jar 日志管理
freemarker-2.3.8.jar 表現(xiàn)層框架,定義了struts2的可視組件主題(theme)
ognl-2.6.11.jar OGNL表達(dá)式語(yǔ)言,struts2 支持該EL
struts2-core-2.0.10.jar struts2 的核心庫(kù)
xwork-2.0.4.jar webwork的核心庫(kù),自然需要它的支持
七. struts常用包與類(lèi)分析
,基本上每一個(gè)Struts2 類(lèi)都訪問(wèn)了WebWork提供的功能,從而也可以看出Struts2 與WebWork千絲萬(wàn)縷的聯(lián)系。但無(wú)論如何,Struts2 的核心功能比如將請(qǐng)求委托給哪個(gè)Action處理都是由xwork完成的,Struts2 只是在WebWork的基礎(chǔ)上做了適當(dāng)?shù)暮?jiǎn)化、加強(qiáng)和封裝,并少量保留Struts1.x 中的習(xí)慣。
1. 常用包
org.apache.struts2.components
該包封裝視圖組件,Struts2 在視圖組件上有了很大加強(qiáng),不僅增加了組件的屬性個(gè)數(shù),更新增了幾個(gè)非常有用的組件,如updownselect、doubleselect、datetimepicker、token、tree等。另外,Struts2 可視化視圖組件開(kāi)始支持主題(theme),缺省情況下,使用自帶的缺省主題,如果要自定義頁(yè)面效果,需要將組件的theme屬性設(shè)置為simple。
org.apache.struts2.config
該包定義與配置相關(guān)的接口和類(lèi)。實(shí)際上,工程中的xml 和properties 文件的讀取和解析都是由WebWork 完成的,Struts 只做了少量的工作。
org.apache.struts2.dispatcher
Struts2 的核心包,最重要的類(lèi)都放在該包中。
org.apache.struts2.impl
該包只定義了3 個(gè)類(lèi), 他們是StrutsActionProxy 、StrutsActionProxyFactory、StrutsObjectFactory,這三個(gè)類(lèi)都是對(duì)xwork的擴(kuò)展。
org.apache.struts2.interceptor : 定義內(nèi)置的截?cái)r器。
org.apache.struts2.util : 實(shí)用包
org.apache.struts2.validators : 只定義了一個(gè)類(lèi):DWRValidator。
org.apache.struts2.views : 提供freemarker、jsp、velocity等不同類(lèi)型的頁(yè)面呈現(xiàn)。
2. 常用的類(lèi)
org.apache.struts2.dispatcher.Dispatcher
該類(lèi)有兩個(gè)作用:
1)、初始化
2)、調(diào)用指定的Action的execute()方法。
org.apache.struts2.dispatcher.FilterDispatcher
這是一個(gè)過(guò)濾器,有四個(gè)作用:
1)、執(zhí)行Action
2)、清理ActionContext,避免內(nèi)存泄漏
3)、處理靜態(tài)內(nèi)容(Serving static content)
4)、為請(qǐng)求啟動(dòng)xwork’s的截?cái)r器鏈。
八、工作機(jī)制
1. 表示一次Action請(qǐng)求所要經(jīng)過(guò)的Servlet filters(Servlet 過(guò)濾器)。ActionContextCleanUp 的可選過(guò)濾器,這個(gè)過(guò)濾器對(duì)于Struts2 和其他框架的集成很有幫助,例如:SiteMesh Plugin。最后一個(gè)filter就是我們注冊(cè)的過(guò)濾器FilterDispatcher。
2. FilterDispatcher首先會(huì)根據(jù)請(qǐng)求的URL解析出對(duì)應(yīng)的action 名稱(chēng),然后去咨詢(xún)ActionMapper這個(gè)action是否需要被執(zhí)行。
3. 如果ActionMapper決定這個(gè)action需要被執(zhí)行,把工作委派給ActionProxy。接著它會(huì)咨詢(xún)配置管理器,并讀取在struts.xml文件中定義的配置信息。接下來(lái)ActionProxy會(huì)創(chuàng)建ActionInvocation對(duì)象。
4. ActionInvocation是Xwork原理的(Command模式)實(shí)現(xiàn)部分。它會(huì)調(diào)用這個(gè)Action已定義的攔截器(before方法),Action方法,Result方法。
5. 最后,看上面流程的圖的方向,它會(huì)再執(zhí)行攔截器(after方法),再回到Servlet Filter部分
6. 最后結(jié)束,并傳給用戶(hù)一個(gè)結(jié)果響應(yīng),返回到result定義的結(jié)果頁(yè)面。
http請(qǐng)求-->一系列過(guò)濾器(FilterDispatcher)-->ActionMapper-->ActionProxy(讀取xwork.xml)-->創(chuàng)建Action對(duì)象(command模式)-->方法前攔截器-->excute方法并定位返回的視圖-->方法后攔截器-->響應(yīng)視圖
九、WebWork的三個(gè)關(guān)鍵組件
1、 Action
一般一個(gè)Action代表一次請(qǐng)求或調(diào)用,是基于Command模式的實(shí)現(xiàn)。在WebWork中,一般Action類(lèi)需要實(shí)現(xiàn)Action接口,或者直接繼承基礎(chǔ)類(lèi)ActionSupport。不要將業(yè)務(wù)邏輯放在Action中。
2、 Result。
它是一個(gè)結(jié)果頁(yè)面的定義。它用來(lái)指示Action執(zhí)行之后,如何顯示執(zhí)行的結(jié)果。Result Type表示如何以及用哪種視圖技術(shù)展現(xiàn)結(jié)果。通過(guò)Result Type,WebWork可以方便的支持多種視圖技術(shù);而且這些視圖技術(shù)可以互相切換,Action部分不需做任何改動(dòng)。
3、 Interceptor。
WebWork的攔截器,WebWork截獲Action請(qǐng)求,在Action執(zhí)行之前或之后調(diào)用攔截器方法。這樣,可以用插拔的方式將功能注入到Action中。WebWork框架的很多功能都是以攔截器的形式提供出來(lái)。例如:參數(shù)組裝,驗(yàn)證,國(guó)際化,文件上傳等等。
十、用eclipse開(kāi)發(fā)struts2.0
1. 在eclipse中配置用戶(hù)庫(kù)
選擇菜單Window->Preferences->Java->Build Path->User Libraries。
new--add jars--添加27個(gè)jar包
2. 新建web項(xiàng)目,導(dǎo)入用戶(hù)庫(kù)struts2.0
右擊項(xiàng)目--build path--add libraries--user library--選中struts2.0--完成
3. 修改web.xml,加上struts2.0的過(guò)濾器
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
默認(rèn)情況下,該過(guò)濾器攔截請(qǐng)求字符串中以.action 結(jié)尾的請(qǐng)求,并將該請(qǐng)求委托給指定的Action 進(jìn)行處理。
4. 新建org.accp.struts2.action.LoginAction
import com.opensymphony.xwork2.ActionSupport;
/**
*/
public class LoginAction extends ActionSupport{
/**
* 在父類(lèi)中定義了方法execute(),當(dāng)用戶(hù)向該Action發(fā)送請(qǐng)求時(shí)自動(dòng)調(diào)用<p>
* 該類(lèi)還封裝了幾個(gè)有用的功能<p>
* getText():從資源文件中獲取國(guó)際化消息<p>
* addFieldError():驗(yàn)證輸入未通過(guò)時(shí)添加錯(cuò)誤消息,支持國(guó)際化<p>
*/
public String execute() throws Exception{
return this.SUCCESS;
}
}
5. 創(chuàng)建全局配置文件struts.xml
在src(編譯后到WEB-INF\classes)下創(chuàng)建struts.xml 文件,這是Struts2 的配置文件,類(lèi)似于Struts1.x中的struts-config.xml,在struts.xml 文件中可以配置Action、Bean、Interceptor 等組件。
可以拷貝struts-default.xml中的dtd
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-default.xml"></include>
<package name="a" extends="struts-default">
<action name="login" class="org.accp.struts2.action.LoginAction">
<result>/index.jsp</result>
</action>
</package>
</struts>
1) include
包含其他xml 文件,在示例中,這意味著struts.xml 可以訪問(wèn)定義在struts-default.xml 文件中的組件。該元素可以使得Struts2 定義多個(gè)配置文件,“分而治之”。要注意的是,任何一個(gè)struts2 配置文件都應(yīng)該和struts.xml 有相同的格式,包括doctype,并且可以放在類(lèi)路徑下的任何地方。
2) package
為Action或截?cái)r器分組。
name:名稱(chēng),必填項(xiàng),名稱(chēng)自定義,沒(méi)特別要求。方便別的package引用。
extends:package 能繼承其他的package,即通過(guò)該屬性實(shí)現(xiàn),值為另一個(gè)package的name。在示例中,extends =”struts-default”是從struts-default.xml 中繼承的。
3) action
定義Action,name屬性為訪問(wèn)時(shí)用到的名稱(chēng),class屬性是Action的類(lèi)名。
4) result 根據(jù)Action的返回值定義頁(yè)面導(dǎo)航。缺省是SUCCESS
Action的預(yù)定義的返回值有:
String SUCCESS = "success";
String NONE = "none";
String ERROR = "error";
String INPUT = "input";
String LOGIN = "login";
比如,當(dāng)Action返回SUCCESS時(shí)希望轉(zhuǎn)到ok.jsp頁(yè)面,則可以這樣寫(xiě):
<result name=”success”>ok.jsp</result>
6. 寫(xiě)返回頁(yè)面index.jsp
<%@ page pageEncoding="gbk"%>
<body>
<h1 style="color:red">第一個(gè)struts2.0應(yīng)用程序成功發(fā)布,希望再接再勵(lì),漸入佳境</h1>
</body>
7. 訪問(wèn)
http://localhost:8080/test/login.action
8. 修改index.jsp,加上登陸
<%@ page pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<font color="red"><s:property value="message" /></font>
<s:form action="login">
<table>
<tr><td><s:textfield label="用戶(hù)名" name="uname"/></td></tr>
<tr><td><s:password label="密 碼" name="upass"/></td></tr>
<tr><td><s:submit/></td></tr>
</table>
</s:form>
</body>
</html>
9. 修改LoginAction,處理驗(yàn)證
public class LoginAction extends ActionSupport{
private String uname;
private String upass;
private String message;
public String execute() throws Exception{
if(!uname.equals(upass)) {
setMessage("用戶(hù)名或密碼錯(cuò)誤");
return this.INPUT;
}
return this.SUCCESS;
}
public getter/setter() {}
}
10. 修改struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-default.xml"></include>
<package name="a" extends="struts-default">
<action name="login" class="org.accp.struts2.action.LoginAction">
<result>/main.jsp</result>
<result name="input">/index.jsp</result>
</action>
</package>
</struts>
11. 加上main.jsp
<%@ page pageEncoding="gbk"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<h1 style="align:center;color:blue"><s:property value="uname" />,歡迎登陸!</h1>
</body>
</html>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -