Struts-三大コンポーネント(二)RequestProcessor

5246 ワード

RequestProcessor
       
ActionServiceletは、すべてのリクエストを処理するStrutsフレームワーク内で唯一のServiceletです.リクエストがいつ受信されても、まず既存のリクエストにサブアプリケーションを見つけてみます.サブアプリケーションが見つかると、RequestProcessorオブジェクトが生成され、パラメータとしてHttpServertRequestおよびHttpServertResponseが入力されるprocess()メソッドが呼び出されます.
 
一、RequestProcessor.process()
JAvaコード:
public void process(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
		//  HttpServletRequest POST  ,    multipart/form-data 
		//Struts            multipart          ,  ,              
		request = processMultipart(request);
		//        URI         。                    Struts Action  。
		String path = processPath(request, response);
		if (path == null) {
			return;
		}
		if (log.isDebugEnabled()) {
			log.debug("Processing a '" + request.getMethod() + "' for path '"
					+ path + "'");
		}
		//          
		processLocale(request, response);
		//      content type  (encoding)  
		processContent(request, response);
		//  noCache       processNoCache()   ,
		//  noCache   true。               ,           Cache 
		processNoCache(request, response);
		// General purpose preprocessing hook
		//             ,              true,
		//                                   。
		//         Action     ,         ,     false, Action      
		if (!processPreprocess(request, response)) {
			return;
		}
		this.processCachedMessages(request, response);
		// Identify the mapping for this request
		//          path         ActionMapping    。
		//       path    ,         error   。 
		ActionMapping mapping = processMapping(request, response, path);
		if (mapping == null) {
			return;
		}
		// Check for any role required to perform this action
		//     Action       。
		//         ,      isUserInRole()     ,
		//          ,          error   。 
		if (!processRoles(request, response, mapping)) {
			return;
		}
		// Process any ActionForm bean related to this request
		//       ActionMapping   ActionForm 。
		//    ,              ActionForm    ,  ,   ,   ,       。
		//                      (request,session,application) ,
		//  Action   name           。 
		ActionForm form = processActionForm(request, response, mapping);
		//     ActionMapping   ActionForm,
		//            ActionForm  ,
		//       ,   ActionForm  reset()           。 
		processPopulate(request, response, form, mapping);
		// Validate any fields of the ActionForm bean, if applicable
		//  ActionForm    ,  action     validate    true ,
		//      validate()        。
		//  validate()      ,      ActionErrors         ,
		//          action   input         。
		//        action        ActionForm,       。 
		try {
			if (!processValidate(request, response, form, mapping)) {
				return;
			}
		} catch (InvalidCancelException e) {
			ActionForward forward = processException(request, response, e,
					form, mapping);
			processForwardConfig(request, response, forward);
			return;
		} catch (IOException e) {
			throw e;
		} catch (ServletException e) {
			throw e;
		}
		//  action        forward   include          。
		//         ,      RequestDispatcher   forward()   include()  ,
		//   ,          。  ,      。 
		// Process a forward or include specified by this mapping
		if (!processForward(request, response, mapping)) {
			return;
		}
		if (!processInclude(request, response, mapping)) {
			return;
		}
		//       Action        。
		//processActionCreate()                   Action  ,
		//    ,   ,  ,             。 
		Action action = processActionCreate(request, response, mapping);
		if (action == null) {
			return;
		}
		// Call the Action instance itself
		//        try/catch       action    execute()  ,
		//    action  execute()             RequestProcessor  。 
		ActionForward forward = processActionPerform(request, response, action,
				form, mapping);
		// Process the returned ActionForward instance
		//    ActionForward    ,    redirect forword       。    redirect   
		//forword   forward   redirect   。
		processForwardConfig(request, response, forward);
	
		
	}

二、拡張RequestProcessorクラス
RequestProcessorのいくつかのデフォルト機能を変更したい場合は、RequestProcessorベースクラスの関連メソッドを上書きしやすくします.
Javaコード
Public classCustomRequestProcessor extends RequestProcessor{  
  protected void processPreprocess(HttpServletRequest request,  
                                 HttpServletResponse response) {  
 
request.setCharacterEncoding("UTF-8");  //             。
 super.process(request, response);
}  
} 

 
strutsプロファイルでは、要素のprocessorClassプロパティを使用して、独自のRequestProcessorクラスを構成します.
<controller  
contentType=“text/html:charset=”GB2312”  
locale=”true”nocache=”true” processorCalss=”com.test.CustomRequestProcessor”/> 

 
まとめ
ほとんどはRequestProcessorで処理してください.プロセス発生.Process()メソッドはテンプレートメソッド(TemplateMethod)の設計モードで実現され、request処理の各ステップを完了する方法がある.これらのメソッドはすべてprocess()メソッドから順番に呼び出されます.たとえば、現在要求されているActionFormクラスを探したり、現在のユーザーがactionmappingを実行する権限があるかどうかを確認したりするには、いくつかの個別の方法があります.これは私たちに大きな弾性空間を提供してくれた.StrutsのRequestProcessorは、要求処理ステップごとにデフォルトの実装方法を提供します.これにより、必要なメソッドを書き換えることができ、残りの残りはデフォルトの実装を保持することができます.