SAIF:Struts的AOP

我們都知道Struts默認沒有實現AOP,這和WebWork2想比確實矮了一截,還好,有人(Lars Hoss 和 Don Brown)意識到這點,編寫SAIF(Struts Action Invocation Framework)彌補了這個缺陷,下面就是SAIF的使用介紹。

SAIF的安裝很簡單:首先將saif-0.1.jar文件複製到WEB-INF/lib目錄下即可,然後修改struts-config.xml文件,將SAIF以plugin方式添加到struts-config.xml文件中,如下:


<plug-in className="net.sf.struts.saif.SAIFPlugin">
<set-property property="interceptor-config" value="/WEB-INF/interceptor-config.xml" />
</plug-in>

最後,編寫interceptor-config.xml文件,進行相關攔截器的聲明,這樣你就完成SAIF的安裝和設定,下面我們將以一個現時的例子來闡述SAIF的使用及其優點。

我們現在有這個一個需求,在OA中,擬定人可以修改自己發的通知,其他人均不能修改,只能查看。我們撰寫了兩個Action:EditNoticeAction和ViewNoticeAction,我們傳給這兩個Action的參數時通知的編碼:noticeId。通知對象的代碼如下(Hibernate的PO方式):


public class NoticePO
{
private Integer id; //編碼
private String title; //標題
private String content; //內容
private Integer authorId; //發佈人編碼
private Date publishedDate; //發佈日前

//getter and setter methods
……….
}

同時我們擁有兩個jsp文件:viewnotice.jsp和editnotice.jsp,這樣我們在Action中根據noticeId將NoticePO構建出來,然後傳給jsp頁面,jsp負責將數據顯示出來,這樣的流程就完畢啦。但是我們在實現中忘記了這個一點,權限的設定。所以我們需要對EditNoticeAction進行攔截操作,也就是在EditNoticeAction操作完畢後,將session中的用戶id和NoticePO中的authorId進行對比,如果相同,表示是該通知的擬定人,指向editnotice.jsp頁面,否則,指向viewnotice.jsp頁面。新建EditNoticeInterceptor,實現如下:


public class EditNoticeInterceptor extends DefaultInterceptor
{
public ActionForward afterAction(Action action, ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException
{
Integer userId=(Integer)request.getSession().getAttribute(“User_ID”);
NoticePO notice=( NoticePO)request.getAttribute(“notice”);
if(notice.getAuthorId()==userId)
{
return mapping.findForward(“view”);
}
return null;
}
}

這樣我們就完成了攔截器的代碼編寫,下面就是在interceptor-config.xml對攔截器進行聲明。


<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE interceptor-config SYSTEM "http://struts.sourceforge.net/saif.dtd">
<interceptor name="EditNoticeActionInterceptor"
type="net.jetmaven.interceptor.EditNoticeActionInterceptor"/>
<action type="net.jetmaven.action.EditNoticeAction">
<interceptor name="EditNoticeActionInterceptor"/>
</action>
</interceptor-config>

這樣我們就完成了我們既定的需求,通過介入攔截器徹底地將權限和業務邏輯分開啦。

最後再說說SAIF,SAIF默認的攔截方法沒有返回值,而在這裏我們使用ActionForward作爲返回值,目的就是想更改原先的流程,返回值爲空表示繼續原先流程,返回值不爲空標識修改以前的流程,這樣覺得更容易理解點,與實際情況更貼切。SAIF的攔截器可以重疊使用,就是針對某一Action可以有多個攔截器,這一點也是非常有用的,我們同樣更加返回值來判定是否終止這個鏈,如果返回值爲空,標識繼續該鏈,否則終止該鏈,立即返回。

根據SAIF的結構,我們寫了一個DTD(右擊另存),這樣在IntelliJ IDEA這樣的環境下,你編寫xml更方便啦,只需將“http://struts.sourceforge.net/saif.dtd”和實際的DTD文件關聯就可以啦。我們針對SAIF進行了相關的更改,其實就是對流程(ActionForward)的設定,使其更適合實際情況,歡迎和您探討。

 

參考資料:

ezerg 編程小語

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章