Struts1-從入門到精通_第1頁(yè)
Struts1-從入門到精通_第2頁(yè)
Struts1-從入門到精通_第3頁(yè)
Struts1-從入門到精通_第4頁(yè)
Struts1-從入門到精通_第5頁(yè)
已閱讀5頁(yè),還剩61頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Struts開源MVC框架

成為軟件行業(yè)的武林高手

少林派(照著練)注重根基,循序漸進(jìn)多學(xué),多練,多思,多改。武當(dāng)派(想著練)善長(zhǎng)技巧,以柔克剛多掌握一些編程技巧,多去考慮一下性能,效率,重構(gòu)一些代碼,多分析一下代碼的優(yōu)劣性逍遙派(創(chuàng)新練)任意發(fā)揮,注重人性化設(shè)計(jì)〔如何讓使用者更易上手,更易于使用〕,注重美感〔交互性強(qiáng)〕,注重哪種架構(gòu)〔語(yǔ)言〕的優(yōu)劣選擇,編程軟件就是設(shè)計(jì)一件藝術(shù)作品。Struts1Lession1為什么要用SSH框架使用框架,可以讓我們更簡(jiǎn)單的開發(fā),更容易的架構(gòu)工程,更好的提升程序性能.Struts工作流程第一個(gè)struts程序多層架構(gòu)概述JAVAEE開發(fā)的體系結(jié)構(gòu)管理模型層springController控制層1、Servlet2、Struts1(MVC)3、Struts2(webwork)Hibernate(mybatis)DBDAOPOView視圖層JspHtmlflash…Service多層架構(gòu)概述分層的目的:將顯示、業(yè)務(wù)邏輯、數(shù)據(jù)訪問(wèn)等功能完全分開,防止相互之間的影響,實(shí)現(xiàn)模塊間的松耦合,簡(jiǎn)化維護(hù)本錢。所謂“耦合”,指將兩個(gè)元素像鏈子一樣連接在一起。在軟件領(lǐng)域,“耦合”一般指軟件組件之間的依賴程度。呈現(xiàn)層:用struts實(shí)現(xiàn)MVC。業(yè)務(wù)邏輯層:用spring持久化層:用hibernateStruts是什么?Struts的目標(biāo)是提供一個(gè)開發(fā)Web應(yīng)用的開源框架。Struts鼓勵(lì)基于M2模式〔即MVC設(shè)計(jì)模式〕來(lái)開發(fā)程序?;貞汳odel1設(shè)計(jì)模式以JSP為中心的開發(fā)模型,稱為Model1〔JSP+JAVABEAN〕。1.業(yè)務(wù)邏輯與表示邏輯混和,不利維護(hù)與重用。2.HTML中嵌入了大量的JAVA代碼3.驗(yàn)證、流程控制、更新程序的狀態(tài)全部在JSP中完成回憶Model2設(shè)計(jì)模式ModelViewControllerMVCMVCMVC是一種設(shè)計(jì)模式M是指數(shù)據(jù)模型,V是指用戶界面,C那么是控制器。使用MVC的目的是將M和V的實(shí)現(xiàn)代碼別離C確保M和V的同步,用來(lái)控制M層和V層,一旦M改變,V應(yīng)該同步更新。被推薦為Sun公司J2EE平臺(tái)的設(shè)計(jì)模式。Struts實(shí)現(xiàn)的MVC框架web.xmlStruts框架組件ActionServlet類控制導(dǎo)航流。ActionServlet根據(jù)URI來(lái)決定哪個(gè)Action類被用于處理請(qǐng)求,Action可以校驗(yàn)輸入,并訪問(wèn)業(yè)務(wù)層以便從數(shù)據(jù)庫(kù)檢索信息。Action需要知道頁(yè)面提交了哪些內(nèi)容,所以由ActionServlet根據(jù)請(qǐng)求URI來(lái)決定將請(qǐng)求參數(shù)綁定到哪個(gè)ActionForm中,并傳入Action。Action在完成業(yè)務(wù)邏輯后,返回一個(gè)ActionForward對(duì)象,ActionServlet根據(jù)ActionForward對(duì)象中的路徑來(lái)調(diào)用頁(yè)面完成響應(yīng)。Struts將這些信息綁定在一個(gè)ActionMapping對(duì)象中,一個(gè)ActionMapping對(duì)應(yīng)一個(gè)請(qǐng)求URI,當(dāng)請(qǐng)求路徑到達(dá)的時(shí)候,ActionServlet就會(huì)查詢ActionMapping對(duì)象,ActionMapping對(duì)象將告訴ActionServlet哪個(gè)Action類會(huì)被調(diào)用、哪個(gè)ActionForm類被用于傳遞頁(yè)面數(shù)據(jù)以及哪些ActionForward

將被用于轉(zhuǎn)向。Action、ActionForm、

ActionForward等,Struts通過(guò)一個(gè)配置文件:struts-config.xml文件來(lái)定義。Stringpath=request.getRequestURI();path=path.subString(path.indexOf("/",1),path.lastIndexOf("."));開始一個(gè)Struts工程在Apache網(wǎng)站上下載Struts,將文件解壓。將lib路徑下的所有JAR文件復(fù)制到Web應(yīng)用的WEB-INF/lib路徑下。://官方網(wǎng)站下載struts例::///download.cgi#struts13101.31版本或在MyEclipce的集成環(huán)境中加載Struts的JAR文件。第一個(gè)Struts工程,實(shí)現(xiàn)用戶登錄操作配置ActionServlet配置ActionServlet:修改web工程的web.xml文件,添加如下Servlet映射配置。

<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><load-on-startup>2</load-on-startup></servlet><servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>(可選)沒(méi)有單位,表示的是效勞器啟動(dòng)的時(shí)候初始化加載的順序,數(shù)值越大,加載優(yōu)先級(jí)別越低。如果我們?cè)趙eb效勞器啟動(dòng)的時(shí)候加載多個(gè)程序,那么就用這個(gè)數(shù)值的相對(duì)大小來(lái)確定那幾個(gè)程序的加載順序。<load-on-startup>給容器一個(gè)actionservlet的權(quán)重。如果設(shè)置為2,那么允許其他servlet在需要的時(shí)候首先裝入 <servlet-mapping>這段告訴容器將匹配*.do格式的文件請(qǐng)求轉(zhuǎn)發(fā)到actionservlet。這就是我們所配的action。不匹配這種格式的文件請(qǐng)求將不被struts處理。 參數(shù):config缺省值:/WEB-INF/struts-config.xml說(shuō)明:包含配置信息的xml文件上下問(wèn)相關(guān)路徑參數(shù):debug缺省值:0說(shuō)明:調(diào)試的詳細(xì)級(jí)別,控制針對(duì)這個(gè)servlet將記錄多少信息。接受的值為0(off)和1(最不嚴(yán)格)直到6(最嚴(yán)格)。大多數(shù)struts組件設(shè)置為級(jí)別0或2參數(shù):detail缺省值:0說(shuō)明:用來(lái)處理應(yīng)用配置文件的Digester的調(diào)試詳細(xì)級(jí)別。接受的值為0(off)和1(最不嚴(yán)格)直到6(最嚴(yán)格)。編寫幾個(gè)必要的文件一個(gè)ActionForm〔UserForm〕 填充頁(yè)面表單封裝成一個(gè)類一個(gè)Action〔LoginAction〕 通過(guò)action調(diào)用業(yè)務(wù)邏輯,轉(zhuǎn)發(fā)等操作進(jìn)行處理struts-config.xml文件 Struts核心配置文件。JSP頁(yè)面登錄頁(yè)面〔login.jsp〕成功頁(yè)面〔welcome.jsp〕失敗頁(yè)面〔error.jsp〕創(chuàng)立struts-config.xml在WEB-INF目錄下創(chuàng)立struts-config.xml文件,并添加如下內(nèi)容<?xmlversion="1.0"encoding=“UTF-8"?><!DOCTYPEstruts-configPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.3//EN"":///struts/dtds/struts-config_1_3.dtd"><struts-config></struts-config>struts-config.xml文件,是由ActionServlet讀取的配置文件,它定義了所有關(guān)于Action、ActionForm、ActionForward等的詳細(xì)信息<struts-config><form-beans> <form-beanname="loginForm" type="com.struts.form.LoginForm“/></form-beans><global-forwards> <forwardname="fail"path="/fail.jsp"></forward></global-forwards><action-mappings> <actionpath="/login"name="loginForm"type="com.struts.action.LoginAction"> <forwardname="succ"path="/succ.jsp"></forward> </action></action-mappings></struts-config>創(chuàng)立ActionFormActionForm是一個(gè)JavaBean,需繼承org.apache.struts.action.ActionForm類,它捕獲通過(guò)HTTP請(qǐng)求傳送的參數(shù)ActionForm針對(duì)每個(gè)HTML表單中的字段具有一個(gè)對(duì)應(yīng)的屬性ActionServlet匹配請(qǐng)求中的參數(shù)和ActionForm中的屬性,并調(diào)用ActionForm中的setter方法,將參數(shù)傳入ActionFormActionForm中的內(nèi)部屬性全部定義為私有的〔private〕,并通過(guò)公共(public)的getter/setter方法來(lái)訪問(wèn)創(chuàng)立ActionAction是一個(gè)Java類,需繼承org.apache.struts.action.Action類ActionServlet將會(huì)組裝ActionForm,并將它傳遞給ActionAction通常負(fù)責(zé):輸入校驗(yàn)調(diào)用業(yè)務(wù)邏輯類執(zhí)行業(yè)務(wù)邏輯操作決定返回哪個(gè)ActionForward添加ActionForm配置在struts-config.xml文件中,在<struts-config>標(biāo)簽的內(nèi)部,添加如下配置:

<form-beans><form-beanname=""type=""/></form-beans><form-beans>標(biāo)簽內(nèi)部可以包含多個(gè)<form-bean>標(biāo)簽<form-bean>標(biāo)簽必須指定name和type屬性name屬性是給此ActionForm一個(gè)標(biāo)識(shí)名稱type屬性指定了此ActionForm是哪個(gè)類,必須是全路徑的類名添加Action配置在struts-config.xml文件中,緊接著<form-beans>標(biāo)簽的下面,添加對(duì)LoginAction的配置:<action-mappings><actionpath=""type=""name=""scope=""><forwardname=""path=""/><forwardname=""path=""/></action></action-mappings><action>標(biāo)簽可以配置的重要屬性包括path-從頁(yè)面上通過(guò)一個(gè)什么樣的URL路徑來(lái)訪問(wèn)Action〔不包含.do〕type–訪問(wèn)這個(gè)URL的時(shí)候,調(diào)用哪個(gè)Action類,這是Action的全路徑類名name–這個(gè)屬性用來(lái)標(biāo)識(shí)哪個(gè)ActionForm將被創(chuàng)立,并將提交的表單組件給它scope–FormBean的作用域范圍,可以取值為session和request,一般取值都是request創(chuàng)立jsp文件創(chuàng)立login.jsp文件,添加一個(gè)表單,action為login.do,這個(gè)login.do的意思,將會(huì)告訴struts的ActionServlet,它將需要調(diào)用哪個(gè)Action來(lái)處理這個(gè)表單的請(qǐng)求。創(chuàng)立welcome.jsp文件,輸入登錄成功的歡送信息創(chuàng)立error.jsp文件,輸入登錄失敗的提示信息運(yùn)行流程從瀏覽器輸入地址:://localhost:8080/StrutsDemo/login.jsp,Tomcat將按通常情況來(lái)處理這個(gè)JSP并返回瀏覽器。提交表單,實(shí)際上是提交到了這樣一個(gè)URL地址:://localhost:8080/StrutsDemo/login.do,Tomcat將會(huì)根據(jù)web.xml的配置,將這個(gè)請(qǐng)求發(fā)送給相應(yīng)的Servlet,在我們的應(yīng)用中,Tomcat將會(huì)把這個(gè)請(qǐng)求發(fā)送給org.apache.struts.action.ActionServlet這個(gè)類。然后ActionServlet根據(jù)struts-config.xml的配置信息,調(diào)用LoginAction對(duì)象去處理這個(gè)請(qǐng)求,在此之前,它會(huì)將頁(yè)面表單的請(qǐng)求數(shù)據(jù)封裝到UserForm對(duì)象中,并傳遞給LoginAction。LoginAction返回一個(gè)ActionForward對(duì)象,包含了將要轉(zhuǎn)向的路徑信息。ActionServlet根據(jù)這個(gè)ActionForward對(duì)象所包含的路徑信息,調(diào)用相應(yīng)的頁(yè)面去執(zhí)行響應(yīng)。運(yùn)行流程圖Struts1lession2Struts與mvc單例模式Struts中的標(biāo)簽html,bean,logicStruts中的國(guó)際化Struts與MVC視圖〔View〕在使用Struts框架的web應(yīng)用程序中,JSP以及相關(guān)的技術(shù)〔如Taglib〕等共同組成視圖層,這一層的主要職責(zé)是顯示用戶界面。Struts提供了很多機(jī)制讓我們能更加輕松地創(chuàng)立視圖控制器〔Controller〕Struts中,ActionServlet是控制器層組件模型〔Model〕模型包括:系統(tǒng)的內(nèi)部狀態(tài)以及改變系統(tǒng)狀態(tài)的動(dòng)作Struts中的Action和ActionForm是模型的一局部Struts建議把”做什么”(Action)和”如何做”(業(yè)務(wù)邏輯)相別離創(chuàng)立業(yè)務(wù)邏輯處理類使用單例模式(Singleton)來(lái)創(chuàng)立業(yè)務(wù)邏輯處理類將Action中的業(yè)務(wù)處理代碼移到這個(gè)類中創(chuàng)立一些異常處理類,由這個(gè)類來(lái)產(chǎn)生,由Action來(lái)捕獲。一般Singleton模式通常有幾種形式:publicclassSingleton{

privateSingleton(){}

//注意這是private只供內(nèi)部調(diào)用

privatestaticSingletoninstance=newSingleton();

//這里提供了一個(gè)供外部訪問(wèn)本class的靜態(tài)方法,可以直接訪問(wèn)publicstaticSingletongetInstance(){

returninstance;

}}

第二種形式:publicclassSingleton{ privateSingleton(){}privatestaticSingletoninstance=null;

publicstaticsynchronizedSingletongetInstance() {

if(instance==null)

instance=newSingleton();

returninstance; }}頁(yè)面之間數(shù)據(jù)的傳遞如何將數(shù)據(jù)從Action中傳遞到下一個(gè)JSP頁(yè)面?一般使用request.setAttribute方法:在Action中,使用request.setAttribute(Stringname,Objectdata)方法往request中設(shè)置參數(shù)在JSP中,使用request.getAttribute(Stringname)來(lái)獲取相應(yīng)的參數(shù)容器接收頁(yè)面請(qǐng)求Struts的核心組件是ActionServlet,像其它所有Servlet一樣,它是生存在容器中的,比方Tomcat、WebLogic等,當(dāng)容器啟動(dòng)的時(shí)候,它會(huì)讀取web.xml文件〔部署描述符〕,告訴容器它會(huì)裝入哪些Servlet一個(gè)標(biāo)準(zhǔn)的Servlet是通過(guò)servlet-mapping來(lái)設(shè)定,哪些請(qǐng)求,將會(huì)被提交到哪些servlet中Struts的servlet-mapping配置一般是:<servlet-mapping><servlet-name>action</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>這樣配置的意思是:任何以.do結(jié)尾的URL請(qǐng)求,都會(huì)被發(fā)送到ActionServlet進(jìn)行處理Struts標(biāo)簽庫(kù)Jsp頁(yè)面應(yīng)該防止使用java腳本,因?yàn)檫@些腳本會(huì)大大降低jsp頁(yè)面的可讀性,但jsp頁(yè)面依然需要具備動(dòng)態(tài)輸出的功能,通過(guò)標(biāo)簽可以完成表現(xiàn)層的輸出Struts主要提供了如下3個(gè)標(biāo)簽庫(kù)html:用于生成html的標(biāo)簽bean:用于完成程序國(guó)際化,輸出ActionForm的屬性值等logic:用于完成循環(huán),選擇流程控制等在web.xml中引入標(biāo)簽庫(kù)定義。然后在每個(gè)JSP文件中引入?;蛘邿o(wú)需在web.xml中定義,但在JSP文件中添加如下聲明:<%@taglibprefix="bean"uri=":///tags-bean"%><%@taglibprefix="logic"uri=":///tags-logic"%><%@taglibprefix="html"uri=":///tags-html"%>html標(biāo)簽html標(biāo)簽使用struts的html標(biāo)簽最終將被解釋為標(biāo)準(zhǔn)的html標(biāo)簽。里面的標(biāo)簽根本上都和html標(biāo)簽一一對(duì)應(yīng)建議以后使用struts自帶的html標(biāo)簽

<html:form

action="/reg"

method="post">

用戶名

<html:text

property="username"/>

密碼

<html:password

property="userpass"/>

性別<html:radio

property="gender"

value="0"/>男

<html:radio

property=“gender”

value=“1”/>女

愛(ài)好<html:checkboxproperty="hobby"value="籃球"/>籃球<html:multibox

property="hobby"

value="看書"/>看書

<html:multibox

property="hobby"

value="睡覺(jué)"/>睡覺(jué)

<html:multibox

property="hobby"

value="編程"/>編程

備注

<html:textarea

property="memo"

rows="5"

cols="60"/>

<html:submit>提交</html:submit>

or<html:submit

value=”提交”/>

<html:reset>去除</html:reset>

<html:cancel>取消</html:cancel>

bean標(biāo)簽bean標(biāo)簽 <bean:write/>輸出bean里面的屬性值<bean:define/>將某個(gè)bean中的屬性定義成腳本可以訪問(wèn)的變量<bean:message/>輸出國(guó)際化信息<bean:messagekey=“hello”/>會(huì)自動(dòng)查找struts-config.xml中配置的資源文件中的hello這個(gè)鍵的值。<bean:defineid="a1"value="helloworld"></bean:define>用來(lái)定詢問(wèn)變量a1,它的值是hello<bean:writename="a1"/>寫出a1變量的值。<jsp:useBeanid="a2"class="com.yourcompany.struts.form.RegForm"></jsp:useBean><jsp:setPropertyname="a2"property="content"value="xxx"/><bean:defineid="a3"value="a2"property="content"toScope="session"></bean:define><bean:writename="${a3}"property="content"/>logic標(biāo)簽logic標(biāo)簽<logic:empty/><logic:notEmpty/><logic:present/><logic:notpresent/>存在<logic:match/><logic:notmatch/>是否包含給定的字符串<logic:equal/><logic:notEqual/><logic:greaterEqual/><logic:greaterThan/><logic:lessEqual/><logic:lessThan/><logic:iterate/><logic:iterateid="a"collection="<%=list%>"indexId="index"><logic:iterateid=“a”name=“l(fā)ist”indexId=“index”>在四種作用域中能夠找到變量list,直接寫在name后面Struts標(biāo)簽通用屬性屬性名稱說(shuō)明name指出對(duì)應(yīng)Bean的名字。如果給出了scope屬性,則僅僅在scope中查找。否則,根據(jù)規(guī)定的順序(page、request、session或application)在各種scope中查找。property指出Bean中的某個(gè)屬性,可以在其中檢索值。如果沒(méi)有標(biāo)明,則使用對(duì)象本身的值。Struts1lession3選學(xué)國(guó)際化問(wèn)題〔I18N問(wèn)題〕Struts處理消息Struts處理異常Struts驗(yàn)證框架Form驗(yàn)證Action驗(yàn)證I18N問(wèn)題什么是I18N問(wèn)題?在英文中,國(guó)際化〔Internationalization〕被縮寫為I18N,即只取首尾兩個(gè)字母,中間字母為18個(gè)有哪些問(wèn)題?頁(yè)面字符串硬編碼異常消息的硬編碼提示信息的硬編碼Java如何支持I18N?java程序的國(guó)際化主要通過(guò)如下3個(gè)類完成

將程序中的標(biāo)簽和提示等信息放在資源文件中。每個(gè)程序需要所有支持的國(guó)家和語(yǔ)言,都必須提供對(duì)應(yīng)的資源文件。資源文件是key-value對(duì),每個(gè)資源文件中的key是不變的,但value那么隨不同國(guó)家和語(yǔ)言而變化資源文件的命名要標(biāo)準(zhǔn): myMperties(默認(rèn)的資源文件)myMessage_zh_CN.properties(簡(jiǎn)體中文的資源文件)myMessage_en_US.properties(英文的資源文件)資源文件要用native2ascii工具進(jìn)行轉(zhuǎn)換。Java如何支持I18Njava程序例如//取得缺省的LocaleLocalel=Locale.getDefault();//綁定資源文件ResourceBundlerb=ResourceBundle.getBundle("myResource",l);System.out.println(rb.getString(""));//格式化消息文本MessageFormatmf=newMessageFormat(rb.getString("error.time"));System.out.println(mf.format(newObject[]{newDate()}));國(guó)際化后臺(tái)例如LocalecurrentLocale=Locale.getDefault();System.out.println("defaultcountry="+currentLocale.getCountry());System.out.println("defaultlanguage="+currentLocale.getLanguage());//currentLocale=newLocale("en","US");//currentLocale=newLocale("zh","CN");ResourceBundlerb=ResourceBundle.getBundle("com.fd.struts.ApplicationResources",currentLocale);MessageFormatmf=newMessageFormat(rb.getString("notNull"));System.out.println(mf.format(newObject[]{"密碼"}));Struts如何支持I18N需要在struts配置文件中指定資源屬性文件的位置和名稱,如<message-resourcesparameter=“myResources"/>在JSP頁(yè)面中使用<bean:messagekey=“keystring”/>來(lái)輸出文本,以防止硬編碼message-resources中parameter的值,可以指定資源文件的位置和名稱<message-resourcesparameter=“myResources"/>表示在類路徑根目錄〔WEB-INF/classes目錄〕下有myResources_XX_XX.properties文件<message-resourcesparameter="resources.myResources"/>表示在類路徑根目錄下,有一個(gè)resources目錄,在這個(gè)resources目錄中存放著所有的myResources_XX_XX.properties資源屬性文件Struts如何支持I18Nstruts利用在session中存放一個(gè)Locale對(duì)象來(lái)到達(dá)設(shè)置當(dāng)前語(yǔ)言的目的默認(rèn)的情況下,struts根據(jù)網(wǎng)頁(yè)向后臺(tái)提交時(shí)所包含的語(yǔ)言編碼信息來(lái)提供缺省的Locale對(duì)象,這就是我們?yōu)槭裁纯梢酝ㄟ^(guò)更改網(wǎng)頁(yè)顯示語(yǔ)言設(shè)置,就能顯示不同的語(yǔ)言文字的原因。struts在session中存放的這個(gè)Locale對(duì)象,取值:org.apache.struts.Globals.LOCALE_KEYStruts消息處理為什么需要消息處理?比方登錄成功的提示比方創(chuàng)立失敗的提示等等……總之,程序總是要通過(guò)界面來(lái)跟用戶交互,所以,在交互的過(guò)程中,就產(chǎn)生了眾多的消息文本struts提供了專門的處理機(jī)制,來(lái)將這些消息文本國(guó)際化,防止消息文本的硬編碼消息處理,就是在Action和JSP之間傳遞的消息文本的處理〔區(qū)別于JSP頁(yè)面硬編碼文本的消息,JSP頁(yè)面消息可以使用<bean:message/>標(biāo)簽來(lái)處理〕Struts交互消息,是通過(guò)ActionMessages等對(duì)象,以及相應(yīng)的<html:messages/>標(biāo)簽來(lái)處理的如何創(chuàng)立消息對(duì)象?ActionMessages與ActionMessage對(duì)象ActionMessages對(duì)象是ActionMessage對(duì)象的集合一個(gè)ActionMessage對(duì)象,代表一個(gè)國(guó)際化消息文本〔字符串〕如何創(chuàng)立ActionMessages對(duì)象?ActionMessagesmessages=newActionMessages();如何創(chuàng)立ActionMessage對(duì)象?ActionMessagemsg=newActionMessage(“key”);其構(gòu)造方法帶的參數(shù),就是一個(gè)在資源屬性文件中的key,所以,它能表示一個(gè)國(guó)際化消息文本如何將ActionMessage對(duì)象添加到ActionMessages對(duì)象中?messages.add(“message_id”,msg);第一個(gè)參數(shù)(message_id)表示本ActionMessage對(duì)象在ActionMessages對(duì)象中區(qū)別于其它ActionMessage對(duì)象的標(biāo)識(shí)符消息對(duì)象如何傳遞?首先要決定的是,要傳遞的消息是普通消息還是錯(cuò)誤消息?普通消息:即普通的消息文本錯(cuò)誤消息:即提示錯(cuò)誤的消息文本本質(zhì)上,這兩種消息沒(méi)有什么區(qū)別,都是消息文本,但是如果一個(gè)頁(yè)面同時(shí)需要顯示普通的消息文本和錯(cuò)誤消息文本的時(shí)候,就需要進(jìn)行區(qū)分了,比方不同類型的消息文本可能要用不同的樣式來(lái)顯示通過(guò)一句簡(jiǎn)單的代碼,將ActionMessages對(duì)象保存到HttpServletRequest對(duì)象中保存普通消息:this.saveMessages(request,messages);保存錯(cuò)誤消息:this.saveErrors(request,messages);這就是調(diào)用父類〔Action〕所提供的方法saveMessages()/saveErrors()來(lái)保存消息對(duì)象實(shí)際上,父類的saveMessages()方法,將消息對(duì)象保存在了request中,并命名為Globals.MESSAGE_KEYsaveErrors()方法,將消息對(duì)象保存在了request中,并命名為Globals.ERROR_KEY<html:errors/>標(biāo)簽<html:errors/>標(biāo)簽只顯示錯(cuò)誤消息<html:errors/>標(biāo)簽與<html:messages/>標(biāo)簽類似,但無(wú)id屬性<html:errors/>標(biāo)簽通過(guò)提供header/footer屬性以及prefix/suffix屬性來(lái)定制每條消息的顯示格式header/footer–定義整個(gè)錯(cuò)誤消息顯示之前〔之后〕要顯示的內(nèi)容,這些內(nèi)容也是在資源屬性文件中定義的一些key值,默認(rèn)的情況下,它們的取值分別為:errors.header和errors.footerprefix/suffix–定義每條錯(cuò)誤消息顯示之前〔之后〕要顯示的內(nèi)容,這些內(nèi)容也是在資源屬性文件中定義的一些key值,默認(rèn)的情況下,它們的取值分別為:errors.prefix和errors.suffix舉例如下:errors.header=<UL>errors.prefix=<LI>errors.suffix=</LI>errors.footer=</UL>Struts的異常自動(dòng)處理機(jī)制編程式異常處理即我們?cè)贏ction中調(diào)用業(yè)務(wù)邏輯層對(duì)象的方法時(shí),用try{}catch的方式來(lái)截獲異常之后,手工對(duì)異常進(jìn)行處理我們以前的開發(fā)過(guò)程中,都是使用編程式的異常處理在編程式異常處理的時(shí)候,我們可以使用struts的消息處理機(jī)制來(lái)對(duì)這些異常信息進(jìn)行處理自動(dòng)異常處理機(jī)制即在Action中不捕捉異常,而是將異常拋出給struts框架處理我們需要在配置文件中指示struts如何處理這些被拋出的異常使用<exception/>元素來(lái)定義自動(dòng)異常處理<exception/>元素的配置及使用<exception/>元素的配置,指示了struts如何處理異常的方式在通常的情況下,我們得到異常以后,需要將頁(yè)面導(dǎo)航到一個(gè)錯(cuò)誤提示的頁(yè)面,提示錯(cuò)誤信息<exception/>元素配置的關(guān)鍵屬性是:key–即這個(gè)異常所對(duì)應(yīng)的錯(cuò)誤提示消息文本的key,這個(gè)key的值,需要在資源屬性文件中進(jìn)行定義type–即定義需要處理哪種類型的Exceptionpath–定義一旦出現(xiàn)異常,需要轉(zhuǎn)向哪個(gè)頁(yè)面來(lái)進(jìn)行提示,如果不定義path屬性,默認(rèn)情況下,將使用Action配置中的input屬性的值來(lái)作為轉(zhuǎn)向的頁(yè)面如何顯示錯(cuò)誤消息?在JSP頁(yè)面中,使用<html:errors/>標(biāo)簽,即可將其異常對(duì)應(yīng)的錯(cuò)誤消息文本進(jìn)行顯示publicclassByZeroExceptionextendsException{publicByZeroException(Stringmessage){ super("除零異常");}}<exceptiontype="com.struts.ByZeroException"key="exception2"></exception><exceptiontype="java.lang.Exception"key="exception1">

頁(yè)面中:<html:errorskey="exception1"/>ActionForm對(duì)象ActionForm的要求必須擴(kuò)展自如果要獲取表單的值,必須定義與表單元素一一對(duì)應(yīng)的屬性如果要求在將ActionForm傳遞到Action之前進(jìn)行校驗(yàn),必須實(shí)現(xiàn)validate方法如果想要在組裝前初始化屬性,必須實(shí)現(xiàn)reset方法DynaActionForm使用動(dòng)態(tài)ActionForm,可以完全不再需要書寫ActionForm,所有ActionForm只需要在struts-config.xml文件中配置即可<form-property>元素屬性:name,type進(jìn)一步了解ActionForm對(duì)象ActionForm作為表單字段收集器ActionForm作為類型轉(zhuǎn)換器(所有從表單提交到后臺(tái)的數(shù)據(jù)均為字符串類型,利用ActionForm自動(dòng)轉(zhuǎn)換int、double、boolean等數(shù)據(jù)類型)ActionForm可以被其它bean或者過(guò)程作為數(shù)據(jù)載體動(dòng)態(tài)ActionForm

使用動(dòng)態(tài)Form實(shí)現(xiàn)用戶登錄<form-beans><form-beanname="userDynaForm" type=""><form-propertyname=“username"type="java.lang.String"/><form-propertyname=“pwd"type="java.lang.String"/></form-bean></form-beans>以配置的方式創(chuàng)立FormDynaActionFormmyForm=(DynaActionForm)form;Stringusername=(String)myForm.get("uname");Stringpwd=myForm.getString("upass");//其他驗(yàn)證操作Action代碼從動(dòng)態(tài)Form中取值演示例如:使用動(dòng)態(tài)Form開發(fā)“用戶登錄”功能ActionForm數(shù)據(jù)校驗(yàn)ActionForm的代碼校檢重寫ActionForm的validate方法假設(shè)有錯(cuò)誤,把錯(cuò)誤消息封裝在ActionMessage對(duì)象里將多個(gè)ActionMessage組合成ActionErrors對(duì)象應(yīng)對(duì)action配置input屬性jsp頁(yè)面使用<html:errors/>標(biāo)簽輸出出錯(cuò)提示結(jié)合commons-validator.jar的校驗(yàn)編寫ActionForm使其繼承ValidatorForm。編寫校驗(yàn)規(guī)那么文件,validator-rules.xml和validations.xml由配置action的input屬性在struts-config.xml文件中配置<plug-in>元素,負(fù)責(zé)加載校驗(yàn)規(guī)那么文件加載國(guó)際化資源文件,在JSP頁(yè)面使用<html:messages>標(biāo)簽ActionForward對(duì)象ActionForward能做什么?ActionForward會(huì)回傳給ActionServletActionForward中的路徑,可以是一個(gè)帶參數(shù)的URIActionForward的屬性namepathredirect全局ActionForward與局部ActionForward,規(guī)那么:先在局部找,局部沒(méi)有的話,再到全局找;<global-forwards>元素:name,path,redirect動(dòng)態(tài)創(chuàng)立ActionForward將ActionForward定義在一個(gè)Struts配置文件中是個(gè)好的選擇,但也可以在Action中動(dòng)態(tài)創(chuàng)立ActionForward,而不需要在配置文件中指定,例如:ActionForwardforward=newActionForward(“/chap08/welcome.jsp");ActionMapping對(duì)象理解ActionMappingpath,action的訪問(wèn)路徑,以“/”開頭type,action的完整類名name,與action關(guān)聯(lián)的formbean的標(biāo)識(shí)IDscope,與action關(guān)聯(lián)的formbean的存在范圍。(request\session默認(rèn))validate,是否調(diào)用validate方法校驗(yàn)input,校驗(yàn)失敗轉(zhuǎn)向的路徑unknow,處理用戶發(fā)出的無(wú)效ActionURLparameterforwardincludescope屬性在Action映射配置中,scope屬性可以取值為:request或sessionscope屬性表示:Struts框架在將ActionForm對(duì)象〔與目標(biāo)Action匹配的ActionForm〕傳送到Action之前,會(huì)將ActionForm對(duì)象保存的位置如:scope=“request”配置,將指示struts調(diào)用request.setAttribute(“ActionForm名稱”,ActionForm對(duì)象)方法,將ActionForm對(duì)象保存到request。其中,ActionForm名稱與struts-config.xml配置中的ActionForm名稱一致,如:<form-beanname=“addForm”type=“com.fendou.web.form.addActionForm”/>,其中addForm就是其名稱。Action對(duì)象如果應(yīng)用需要保存一個(gè)記錄到數(shù)據(jù)庫(kù)中,典型的過(guò)程可能是ActionForm捕獲輸入ActionMapping配置ActionAction將輸入送到數(shù)據(jù)庫(kù)中〔通常會(huì)將這一步操作委托給業(yè)務(wù)邏輯類去實(shí)現(xiàn)〕ActionForward提供一個(gè)鏈接到輸入頁(yè)面J2EE是一個(gè)多線程的環(huán)境,效勞器針對(duì)每個(gè)請(qǐng)求啟動(dòng)一個(gè)線程來(lái)處理。所以有可能會(huì)有多個(gè)線程同時(shí)訪問(wèn)一個(gè)Servlet實(shí)例的情況。在Struts里面也是一樣的,有可能會(huì)有多個(gè)線程同時(shí)訪問(wèn)一個(gè)Action實(shí)例的情況。所以必須保證Action類中的方法具有“可重入性”,即不能在Action的方法里改變實(shí)例變量的值。Action的主要職責(zé)校驗(yàn)輸入數(shù)據(jù)調(diào)用業(yè)務(wù)邏輯方法檢測(cè)處理異常根據(jù)邏輯進(jìn)行轉(zhuǎn)向操作幾種不同的ActionDispatchAction:該Action可以在一個(gè)action內(nèi)同時(shí)完成多個(gè)action功能DispatchAction的配置方法,添加parameter屬性到Action的配置中,parameter屬性值任意。但是請(qǐng)求的URL必須是URL?parameter屬性值=Action方法名unspecified方法,在調(diào)用DispatchAction的時(shí)候參數(shù)是不能為空的,如果空,DispatchAction會(huì)調(diào)用unspecified(不精確)方法并拋出異常。

DispatchActionpublicActionForwardadd(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){returnnull;}publicActionForwardupdate(ActionMappingmapping,ActionFormform,HttpServletRequestrequest,HttpServletResponseresponse){returnnull;}注意:類中excute()方法不能重寫,否那么將調(diào)用excute方法。

<actionname="loginForm“parameter="method“path="/login" type="com.fendou.struts.action.LoginAction"/>Action中的代碼配置Jsp頁(yè)面:增加一個(gè)隱藏域,名字為method,值設(shè)置為待訪問(wèn)action中方法的名稱<formaction="<%=path%>/edit.do"method="post">

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論