?? 14. struts1.x note.txt
字號(hào):
Day1:
overview:
1.MVC概述
2.Struts框架 (技術(shù)概覽)
3.Struts開(kāi)發(fā)步驟
4.Struts新手上路
5.Struts詳解
6.使用工具構(gòu)建struts應(yīng)用
**************************************************************
一 MVC概述 (教材Page 219)
1 起源
2 設(shè)計(jì)理念
圖(Page 219)
Controller:
Model:
View:
3.分層設(shè)計(jì)對(duì)Model的影響
4.Web MVC的發(fā)展(Page 221 ~ 227)
Model1 ---> Model2 ---> Framework
1)Model1的特點(diǎn)(Page 222)
2)Model2的特點(diǎn)(Page 224)
3)Framework的引入(Page 226)
引入框架的作用
A. 使得功能組件松散耦合,甚至可配置
B. 提供公用的服務(wù):
例如:i18n,安全,表單的重復(fù)提交,文件上傳……
C. 簡(jiǎn)化開(kāi)發(fā)模型——使得開(kāi)發(fā)人員的精力集中在業(yè)務(wù)邏輯之上
框架的分類
A.設(shè)計(jì)的思路
白盒框架:使用時(shí),需要了解其內(nèi)部結(jié)構(gòu)(extends);入侵性框架
黑盒框架:不需了解其代碼細(xì)節(jié),最多實(shí)現(xiàn)其接口;非入侵性框架
B.功能、作用
Web:Strusts1.x, WebWork, Strusts2.x(發(fā)展1.x和webwork), JSF(抗衡.net), Tapestry,
Shale, ZK, Echo, (根本全是Servlet規(guī)范) ……
Business:Spring, Seam
Persistence(持久層):Hibernate, Toplink, OpenOJB, ……
評(píng)價(jià)框架的優(yōu)劣?
A.設(shè)計(jì)理念 先進(jìn)?
B.編程模型 簡(jiǎn)單?
C.是否擁抱規(guī)范、標(biāo)準(zhǔn)?
D.社區(qū)是否龐大?第三方的支持程度?
程序設(shè)計(jì)思路
可維護(hù)性:預(yù)見(jiàn)需求(預(yù)見(jiàn)多年后的事)
可重用:
代碼可重用(最低級(jí)別):粒度:方法(常用代碼塊),類,包,組件(類庫(kù))
設(shè)計(jì)的可重用:框架(半成品,如Hibernate);產(chǎn)品(開(kāi)發(fā)軟件);算法、設(shè)計(jì)模式
分析的可重用(最高級(jí)別,見(jiàn)不到代碼):文檔、規(guī)范、標(biāo)準(zhǔn)(ISO:CMM,CMMI)
可擴(kuò)展性:
*****************************************************
二、Struts框架 (技術(shù)概覽)
1.Struts簡(jiǎn)介
Apache
OpenSource
官方網(wǎng)站:http://jakarta.apache.org
MVC
Servlet, JSP, 資源文件, 定制標(biāo)簽庫(kù)
Struts框架的位置
2.Struts快速上手
需求描述:
系統(tǒng)的登錄
開(kāi)發(fā)步驟
1) 創(chuàng)建項(xiàng)目、搭建環(huán)境
下載Struts開(kāi)發(fā)包
把%STRUTS_HOME%/lib/*.jar拷貝到WEB-INF/lib
把%STRUTS_HOME%/contrib/struts-el/lib/*.jar拷貝到WEB-INF/lib
把%STRUTS_HOME%/lib/*.tld拷貝到WEB-INF(新版本無(wú)需這么做)
將%STRUTS_HOME%/contrib/struts-el/lib/*.tld 拷貝到WEB-INF(新版本無(wú)需這么做)
2) 配置WEB-INF/web.xml文件
<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>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
3) 在WEB-INF創(chuàng)建struts-config.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans />
<global-exceptions />
<global-forwards />
<action-mappings />
<message-resources parameter="com.yourcompany.struts.ApplicationResources" />
</struts-config>
4) 提供login.jsp
引入struts標(biāo)簽庫(kù)
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<html:form action="/login">
<table>
<tr>
<td>用戶名:</td>
<td><html:text property="username"></html:text></td>
</tr>
<tr>
<td>密 碼:</td>
<td><html:password property="password"></html:password></td>
</tr>
<tr>
<td colspan=2 align=center>
<html:submit value="登錄"></html:submit>
</td>
</tr>
</table>
</html:form>
5) 提供Form Bean
com.form.LoginForm
public class LoginForm extends ActionForm {
private String username;
private String password;
//getter, setter
}
配置文件更新:
<form-beans>
<form-bean name="loginForm" type="com.form.LoginForm"></form-bean>
</form-beans>
6) 提供action:LoginAction extends Action
public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
LoginForm loginForm = (LoginForm)form;
String username = loginForm.getUsername();
String password = loginForm.getPassword();
boolean isLogin = false;
if("maxwell".equals(username) && "123".equals(password)) {
isLogin = true;
}
if(isLogin) {
return mapping.findForward("success");
} else {
return mapping.findForward("error");
}
}
}
配置文件更新:
<action-mappings>
<action path="/login" type="com.action.LoginAction" name="loginForm">
<forward name="success" path="/success.jsp"></forward>
<forward name="error" path="/error.jsp"></forward>
</action>
</action-mappings>
3.Struts技術(shù)詳解
1) struts的MVC模型 (Page229)
2) 主要組件詳解
1)ActionServlet
繼承HttpServlet類,需要在web.xml中配置
<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>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
2)Action
開(kāi)發(fā)人員必須繼承這個(gè)Action類,供ActionServlet所驅(qū)動(dòng)。
職責(zé):調(diào)用業(yè)務(wù)邏輯方法
將控制權(quán)返回給ActionServlet并且提供相關(guān)的路由信息
public class LoginAction extends Action {
......
}
步驟:
(1) 繼承Action類。
(2) 覆蓋 execute(...)方法。
(3) 返回ActionForward對(duì)象 (提供決策信息給ActionServlet選擇適當(dāng)?shù)囊晥D響應(yīng)用戶) 。
(4) 在struts-config.xml中配置
<action-mappings>
<action input="/index.jsp" :ActionForm驗(yàn)證失敗的跳轉(zhuǎn)頁(yè)面
name="aForm" :與Action對(duì)應(yīng)的FormBean對(duì)象
path="/myAction" :請(qǐng)求URI(/myAction.do)
scope="session" :FormBean作用域范圍
type="action.LoginAction" :自定義的Action類
validate="true" :FormBean是否調(diào)用validate(...)方法
>
<forward name="success" path="/success.jsp" /> :成功跳轉(zhuǎn)的頁(yè)面
</action>
......
</action-mappings>
注:scope的值可以是request和session,默認(rèn)是session
3)ActionForm:封裝HTTP請(qǐng)求中的數(shù)據(jù)
將用戶提交的數(shù)據(jù)自動(dòng)填充(在相應(yīng)的action的execute方法被調(diào)用之前)到form的屬性中
無(wú)需手工調(diào)用request.getParameter(…)
開(kāi)發(fā)人員必須繼承這個(gè)ActionForm類
public class LoginForm extends ActionForm {
......
}
3) 處理流程(程序中的關(guān)系)
****************************************************************************
三、使用IDE工具生成struts項(xiàng)目
Day2:
1 視圖選擇
2 國(guó)際化
3 Struts中的異常處理
4 動(dòng)態(tài)表單
5.標(biāo)簽庫(kù)
*************************************************************************
1 視圖選擇
局部轉(zhuǎn)發(fā)與全局轉(zhuǎn)發(fā)(優(yōu)先級(jí):局部轉(zhuǎn)發(fā)的優(yōu)先級(jí)比全局轉(zhuǎn)發(fā)的優(yōu)先級(jí)高)
1) 局部轉(zhuǎn)發(fā):只對(duì)某個(gè)Action可見(jiàn)
<action ...>
<forward name="success" path="/success.jsp" />
</action>
2) 全局轉(zhuǎn)發(fā):對(duì)所有的Action可見(jiàn)(共享)
<global-forwards>
<forward name="success" path="/globalsuccessful.jsp"></forward>
</global-forwards>
例子:
把登錄例子中的成功跳轉(zhuǎn)設(shè)置為全局轉(zhuǎn)發(fā)。
2 I18N
I18N解決辦法
創(chuàng)建多個(gè)資源文件,根據(jù)用戶設(shè)置選擇不同資源文件
ApplicationResources.properties
ApplicationResources_en.properties
ApplicationResources_zh.properties
資源文件:
用于映射頁(yè)面中的靜態(tài)信息、按鈕標(biāo)簽、錯(cuò)誤信息等,
通過(guò)一個(gè)屬性文件(.properties) 把所有頁(yè)面的靜態(tài)信息集中在一起,便于修改。
例子:
編寫(xiě)資源文件的步驟:
1) 編輯資源文件
login_en.properties
login.title=Login Page
login.success=Congratuation! You successfully login our System!
login.username=User Name
login.password=Password
添加對(duì)中文的支持txt:
login.title=登錄頁(yè)面
login.success=恭喜你!你已經(jīng)成功登錄我們的系統(tǒng)了!
login.username=用戶名
login.password=密碼
login.submit=登錄
轉(zhuǎn)換本地編碼為Unicode:
native2ascii login.txt login_zh.properties ----->生成login_zh.properties文件
login.title=\u767b\u5f55\u9875\u9762
login.success=\u606d\u559c\u4f60\uff01\u4f60\u5df2\u7ecf\u6210\u529f\u767b\u5f55\u6211\u4eec\u7684\u7cfb\u7edf\u4e86\uff01
login.username=\u7528\u6237\u540d
login.password=\u5bc6\u7801
login.submit=\u767b\u5f55
2)在struts-config.xml文件中配置資源文件<message-resources parameter="login" />
3)在JSP文件中使用<bean:message key="login.title"/>標(biāo)簽輸出資源文件中的值
4)演示效果:
修改瀏覽器的設(shè)置
英文界面少寫(xiě)了"login.submit";則是找出中文的
3 Struts中的異常處理
java class: try/catch/finally/throws/throw/custom Exception class
jsp: page指令 + web.xml配置<error-page>
struts: try/catch/finally/throws/throw/custom Exception class
聲明方式(*)------->struts-config.xml
定制異常處理器(*)
ActionErrors(或ActionMessages):異常的集合類
ActionMessage:具體異常類
關(guān)系圖
方法一:
在actionform的validate方法中處理(很少使用,一般用驗(yàn)證框架實(shí)現(xiàn)用戶輸入合法性驗(yàn)證)
(1)重寫(xiě)action form的validate方法
@Override
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if(username == null || username.equals("") || username.length() > 50) {
ActionMessage msg = new ActionMessage("error.username");
errors.add("errorusername", msg);
}
return errors;
}
login_en.properties的內(nèi)容
error.username=Please input the correct user name!
login_zh
error.username=請(qǐng)輸入正確的用戶名信息!error.username=\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u7528\u6237\u540d\u53ca\u5bc6\u7801\uff01
(2)配置struts-config.xml文件
在action標(biāo)記內(nèi)添加一個(gè)input屬性和validate屬性
其中,
input屬性的值-----表示發(fā)生錯(cuò)誤后跳轉(zhuǎn)到的頁(yè)面
validate屬性的值-----表示ActionServlet是否去執(zhí)行ActionForm的validate(...)方法,并且這個(gè)屬性默認(rèn)值是true
<action-mappings>
<action name="loginForm"
path="/login"
type="com.action.LoginAction"
input="/login.jsp"
validate="true">
<forward name="fail" path="/fail.jsp"></forward>
</action>
</action-mappings>
(3)在login.jsp頁(yè)面中加入<html:errors/>輸出錯(cuò)誤。
方法二:
在action的execute方法中處理(極少使用,知道這種方法就可以了)
(1)在action的execute方法中寫(xiě)錯(cuò)誤處理的代碼(和action form里valdiate方法的代碼基本一致)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -