創(chuàng)建你自己的RequestProcessor
通過上面,我們了解到了RequestProcessor的默認(rèn)實現(xiàn)是如何工作的。現(xiàn)在我們要演示一個例子來說明如何定制你自己的RequestProcessor。為了展示創(chuàng)建用戶定制的RequestProcessor,我們將會讓我們的示例實現(xiàn)下面兩個業(yè)務(wù)需求:
·我們想創(chuàng)建一個ContactImageAction類,它將生成圖片而不是平常的HTML頁面。
·在每個請求處理之前,我們都想通過檢查session中的userName屬性來確定用戶是否已經(jīng)登陸。如果那個屬性沒有找到,我們會把用戶重定向到登陸頁面。
我們將分兩步實現(xiàn)這些業(yè)務(wù)需求。
1、創(chuàng)建你的CustomRequestProcessor類,它將繼承自RequestProcessor類,如下:
public class CustomRequestProcessor extends RequestProcessor { protected boolean processPreprocess ( HttpServletRequest request,HttpServletResponse response) { HttpSession session = request.getSession(false); //If user is trying to access login page // then don't check if( request.getServletPath().equals("/loginInput.do") || request.getServletPath().equals("/login.do") ) return true; //Check if userName attribute is there is session. //If so, it means user has allready logged in if( session != null && session.getAttribute("userName") != null) return true; else{ try{ //If no redirect user to login Page request.getRequestDispatcher("/Login.jsp").forward(request,response); }catch(Exception ex){ } } return false; }
protected void processContent(HttpServletRequest request, HttpServletResponse response) { //Check if user is requesting ContactImageAction // if yes then set image/gif as content type if( request.getServletPath().equals("/contactimage.do")){ response.setContentType("image/gif"); return; } super.processContent(request, response); } } |
在CustomRequestProcessor類的processPreprocess方法中,我們檢查session的userName屬性,如果沒有找到,就將用戶重定向到登陸頁面。
對于生成圖片作為輸出的需求,我們必須覆蓋processContent方法,首先檢查請求是否是/contactimage路徑。如果是的話,我們就會將contentType設(shè)置為image/gif;否則設(shè)置為text/html。
2、在你的struts-config.xml文件的<action-mappint>元素之后加入下面的文字,告訴Struts CustomRequestProcessor應(yīng)當(dāng)被用作RequestProcessor類:
<controller> <set-property property="processorClass"value="com.sample.util.CustomRequestProcessor"/> </controller> |
請注意,當(dāng)你只有很少的action類需要生成非text/html類型的輸出時,你覆寫processContent()方法是OK的。如果不是這樣子的話,你應(yīng)該創(chuàng)建一個Struts的子應(yīng)用來處理請求生成圖片的Action,并為它們將contentType設(shè)置為image/gif。
Struts的Tiles框架就是使用它自己的RequestProcessor來裝飾Struts的輸出。
ActionServlet
如果你查看你的Struts web應(yīng)用的web.xml,你會看到這樣的文字:
<web-app > <servlet> <servlet-name>action=</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <!-- All your init-params go here--> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app > |
這意味著ActionServlet負(fù)責(zé)處理你所有Struts的請求。你可以創(chuàng)建一個ActionServlet的子類,當(dāng)應(yīng)用啟動,關(guān)閉,每個請求的時候做一些特定的事情。但是在繼承ActionServlet類之前,你應(yīng)該盡量創(chuàng)建一個PlugIn或RequestProcessor去解決你的問題。在Servlet1.1之前,Tiles框架是基于ActionServlet來修飾生成的響應(yīng)。但是從1.1之后,它開始使用TilesRequestProcessor類。
總結(jié) 決定開發(fā)你自己的MVC框架是一個非常大的決定,你必須要考慮開發(fā)和維護(hù)框架代碼所花費的時間和資源。Struts是一個非常強大和穩(wěn)定的框架,你可以修改它來滿足你絕大多數(shù)的業(yè)務(wù)需求。
但另一方面,也不要草率地做出擴(kuò)展Struts的決定。如果你在RequestProcessor中寫了一些性能比較低的代碼,它將會在每次請求時執(zhí)行,因而降低你整個應(yīng)用的效率。而且還是有一些情況,開發(fā)自己的MVC框架要比擴(kuò)展Struts好。