【正文】
,在struts2中實(shí)現(xiàn)action的統(tǒng)一操作也很簡(jiǎn)單。接上例:namespce的作用除了在前面提到的避免協(xié)同開發(fā)名字沖突外,還為認(rèn)證提供一個(gè)條件。比如:package name=tt3 extends=strutsdefault action name=test3/test3 class= result name=success/forward//result /action/package然后輸入a href=%=path%/test3/test3/abr鏈接地址就可以訪問了強(qiáng)調(diào):namespace默認(rèn)值“”,即不配置namespace屬性。 } } public User getModel() { return user。解決此bug的方法是配置一個(gè)filter,并在doFilter方法中增加如下代碼:(“UTF8”)。 } }}說明:實(shí)現(xiàn)了Action接口,主要是為了保證execute的正確定義,其實(shí)我們也可以不實(shí)現(xiàn)此接口,只要能保證execute方法書寫的正確書寫(方法名,返回值)。這也是我們要配置的主要文件。Struts2+xwork一共有700余類,除了為讀者做到現(xiàn)在的這些,已無法再做更多的事情。 sendError(request, response, context, , e)。 } public void serviceAction(HttpServletRequest request, HttpServletResponse response, ServletContext context, 剛才使用了一段插述,我們繼續(xù)回到ActionProxy類。 } catch (NoSuchMethodException e1) { method = getAction().getClass().getMethod(altMethodName, new Class[0])。 Override 配置信息加載完成后,創(chuàng)建一個(gè)Action的代理對(duì)象——ActionProxy引用,實(shí)際上對(duì)Action的調(diào)用正是通過ActionProxy實(shí)現(xiàn)的,而ActionProxy又由ActionProxyFactory創(chuàng)建,ActionProxyFactory是創(chuàng)建ActionProxy的工廠。 loadDefaultInterceptorRef(newPackage, packageElement)。 } if (serveStatic amp。amp。//重新設(shè)置內(nèi)容類型 } //下面處理形如testAction!method格式的請(qǐng)求路徑 } String message = Could not wrap servlet request with MultipartRequestWrapper!。 ()。 protected Dispatcher createDispatcher(FilterConfig filterConfig) { * Constant for the JSP page context}.一旦Action執(zhí)行完畢。三、 生產(chǎn)ActionProxy的工廠。 執(zhí)行ActionStruts2的核心包,最重要的類都放在該包中。,里面的目錄和文件非常多,\\src\core\src\main\java目錄下查看Struts2的源文件,如圖14所示。另外,Struts2可視化視圖組件開始支持主題(theme),缺省情況下,使用自帶的缺省主題,如果要自定義頁面效果,需要將組件的theme屬性設(shè)置為simple。 從圖15可以看出,一個(gè)請(qǐng)求在Struts2框架中的處理大概分為以下幾個(gè)步驟: filternamestruts2/filtername /**}代碼清單10:()方法包裝請(qǐng)求對(duì)象如代碼清單11所示: request = (request, getServletContext())。下面是ActionMapping接口的實(shí)現(xiàn)類DefaultActionMapper的getMapping()方法的源代碼: String name = ()。 (圖16)其內(nèi)容為“中華人民共和國(guó)”,訪問://localhost:8081/Struts2Demo/struts/:(圖17)查找靜態(tài)資源的源代碼如清單14: for (String pathPrefix : pathPrefixes) {//讀取請(qǐng)求文件流 ()。 如果用戶請(qǐng)求的資源不是以/struts開頭——,則通過過濾器鏈繼續(xù)往下傳送,直到到達(dá)請(qǐng)求的資源為止。 mapping = (request, ())。 return。 (timerKey)。 ()方法中,先加載Struts2的配置文件,如果沒有人為配置,、。 loadGlobalExceptionMappings(newPackage, packageElement)。 addAction(actionElement, newPackage)。 活動(dòng)圖如圖19所示:(圖19)其中,遞歸調(diào)用截?cái)r器的代碼如清單17所示:代碼清單17:調(diào)用截?cái)r器,()方法的部分代碼 代碼清單19:public class CustomIntercepter extends AbstractInterceptor { //獲取Action中定義的execute()方法名稱,實(shí)際上該方法是可以隨便定義的 ActionMapping mapping) throws ServletException {// If there was a previous value stack, then create a new copy and pass it in to be used by the new Action 總體來講,但我們不得不佩服Struts和WebWork開發(fā)小組的功底,代碼如此優(yōu)雅,甚至能夠感受看到兩個(gè)開發(fā)小組心神相通的默契。本章目的就是希望能幫助讀者理清一條思路,在必要的地方作出簡(jiǎn)單的解釋,達(dá)到事半功倍的效果。除了StrutsPrepareAndExecuteFilter外,Struts還提供了一個(gè)ActionContexCleanUp類,它的主要任務(wù)是當(dāng)有其它一些過濾器要訪問一個(gè)初始化好了的struts框架的時(shí)候,負(fù)責(zé)處理一些特殊的清除任務(wù)。 private String password。在以前的開發(fā)中,當(dāng)修改一些配置時(shí)總是不能及時(shí)地更新到服務(wù)器,我們總會(huì)重新部署或重啟來更新改變的內(nèi)容,在struts2中可以通過一個(gè)常量來達(dá)到此目的。public class LoginAction implements Action, ModelDrivenUser { private User user = new User()。下面重點(diǎn)來看這個(gè)package元素的namespace屬性及action的name屬性,它們共同定義了action所映射到的實(shí)質(zhì)文件。還可以參head下的base href=%=basePath% 來完成絕對(duì)路徑的書寫。補(bǔ)充:由于上面的package繼承于strutsdefault,而我們這里所用到的timer和params都是在strutsdefalut中定義過,所以即使我們?cè)趇nterceptors中沒有定義過這兩個(gè)攔截器,也可以直接在action中引用。import 。步驟一,:?xml version=39。另外,namespace也可以配置成namespace=/。說明:此方式一般不會(huì)使用,在此略作了解。作如下修改:在LoginAction中有兩個(gè)字段:username,password。主要代碼如下:?xml version= encoding=UTF8 ?!DOCTYPE struts PUBLIC //Apache Software Foundation//DTD Struts Configuration struts package name=myFirst namespace=/ extends=strutsdefault action name=login class= result name=loginSuccess//result result name=loginFailure//result /action /package/struts說明:package后面會(huì)有詳細(xì)說明。屬性文件可以放在任何一個(gè)包含在classpath中的路徑上,但是通常我們都把它放在/WEBINF/classes目錄下面。本章并不適合java語言初學(xué)者或者對(duì)java博大精深的思想理解不深的讀者閱讀,這其中涉及到太多的術(shù)語和類的使用,特別不要去鉆牛角尖,容易使自信心受損。throw new ServletException(e)。 // throw the original one return 李贊紅。 public String intercept(ActionInvocation actionInvocation) throws Exception return newPackage。 loadDefaultActionRef(newPackage, packageElement)。而上面的方法最終會(huì)被addPackage()方法調(diào)用,將所讀取到的數(shù)據(jù)匯集到PackageConfig對(duì)象中,細(xì)節(jié)請(qǐng)參考代碼清單16。 } try { //如果請(qǐng)求的資源是Action,則調(diào)用serviceAction方法。上述過程的源代碼如清單15所示。 } }//將請(qǐng)求參數(shù)中的重復(fù)項(xiàng)去掉 ActionMapping mapping = new ActionMapping()。 return new Dispatcher((), params)。 ()。 然后得到參數(shù)packages,值得注意的是,還有另外三個(gè)固定的包和該參數(shù)進(jìn)行拼接,、template、中間用空格隔開,經(jīng)過解析將包名變成路徑后存儲(chǔ)到一個(gè)名叫pathPrefixes的數(shù)組中,這些目錄中的文件會(huì)被自動(dòng)搜尋。 * Constant for the HTTP response object. * Constant for the HTTP request object. /filterclass filterclass:在這個(gè)過程中需要涉及到ActionMapper。. ActionProxy實(shí)用包。但因?yàn)镾truts2的核心設(shè)計(jì)完全改變,從思想到設(shè)計(jì)到工作流程,都有了很大的不同。 調(diào)用指定的Action的execute()方法。 該類有四個(gè)作用:. ctionProxyFactoryStruts2對(duì)常用的接口進(jìn)行了重新封裝,比如HttpServletRequest、HttpServletResponse、HttpServletContext等。 public static final String HTTP_REQUEST = 。 public static final String HTTP_RESPONSE = 。 HttpServletResponse response) throws ServletException {//從uri變量中解析出Action的name和namespace //如果Action的name沒有解析出來,直接返回 //!是Action名稱和方法名的分隔符 (timerKey)。 } // load the interceptors and interceptor stacks for this package (interce