之前在GL的督促下用Struts做了一個(gè)簡(jiǎn)單的HR系統。其間有過(guò)許多問(wèn)題,現在歸納一下,希望對看到的人有所幫助。
筆者以前也用Struts開(kāi)發(fā)過(guò)一個(gè)系統,那時(shí)候Struts的版本是1.1,現在1.2了,發(fā)現有一點(diǎn)區別。這次開(kāi)發(fā)最開(kāi)始的問(wèn)題就是在這一點(diǎn)上。
首先有關(guān)于消息提示部分的內容。在A(yíng)ction中,saveErrors(String, ActionError)已經(jīng)被廢棄了,但是saveErrors(String, ActionMessage)還是可用的。而很多時(shí)候,為了區分錯誤消息和提示消息, 還可以用saveMessages(String, ActionMessage)處理相關(guān)內容。
同時(shí)我發(fā)現,無(wú)論用saveErrors還是savaMessages, <html:errors/>標簽都是可用來(lái)提取消息的。不怕麻煩的話(huà),用:
<html:messages id="msg" message="false">
<bean:write name="msg" />
</html:messages>
這樣的方式,可以將錯誤(error) 消息和提示(message) 消息顯式區分開(kāi)來(lái)。當然了,我一向是怕麻煩的,所以直接用<html:errors>就可以了。不過(guò)心中有些疑惑,Struts提供<html:errors/>和<html:messages/>這兩個(gè)標簽,理論上應該是希望前者用來(lái)描述錯誤消息,后者用來(lái)描述提示消息吧?不知道是不是我用法上還有些問(wèn)題?
另外,需要提醒的一點(diǎn)是,我用的是Struts 1.2.4,而現在最新的1.2.9似乎有一些莫名其妙的問(wèn)題。建議現在應用的話(huà),不要選擇這個(gè)最新的版本。
第二個(gè)是Validator應用的問(wèn)題。在Struts 1.2.9中(其實(shí)是從1.2.7開(kāi)始), Validator-rules.xml文件的定義有了一些區別。主要是很多函數多了一個(gè)org.apache.commons.validator.Validator的參數,如果使用之前版本的Validator.xml文件,可能會(huì )報NoSuchMethodException——參數少了一個(gè),方法自然就找不到了。。而在1.2.4的版本中,這個(gè)問(wèn)題是沒(méi)有的。
第三個(gè)是Tiles涉及的問(wèn)題。受Html中Frame的影響,我本來(lái)想找到一種可以實(shí)現Tiles中某個(gè)頁(yè)面部分刷新的方法。(比如在有左右兩部分的頁(yè)面,單擊左鏈接,刷新右側頁(yè)面)而事實(shí)證明,這是不可能的。我猜測的原因是Tiles的整體頁(yè)面已經(jīng)在Server端編譯成servlet,而Html是無(wú)需編譯的腳本。不得已,只有采用正頁(yè)面刷新的方式。(不知道有沒(méi)有別的方法?知道的請指教)
第四是單表單多按鈕時(shí)(LookupDispatchAction),利用Validator驗證,需要單獨寫(xiě)ValidatorForm的validate函數,因為也許不同的按鈕需要的表單驗證是不一樣的。這里提供一份代碼樣本:
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
String parameter = mapping.getParameter();
if( parameter != null ) {
// Identify the method name to be dispatched to.
String name = request.getParameter(parameter);
MessageResources resources =
(MessageResources) request.getAttribute(Globals.MESSAGES_KEY);
// Identify the localized message for the cancel button
String message = resources.getMessage("empmng.modify.deletebutton");
// if message resource matches the cancel button then no
// need to validate
if( name != null && name.equals(message) ) {
return null;
}
}
// perform regular validation
return super.validate(mapping, request);
聯(lián)系客服