`

设计自己的MVC框架(2)

阅读更多

转自 http://www.blogjava.net/killme2008/archive/2007/02/06/98227.html


6。前端控制器(FrontController),它的任务我们已经很清楚,初始化配置文件;存储所有action到 ServletContext供整个框架使用;得到发起请求的path,提供给Dispachter查找相应的action;调用Dispatcher,执行getNextPage方法得到下一个页面的url并转发:

 

 public   void  init()  throws  ServletException  {

  
 // 初始化配置文件 
 

  ServletContext context
 = getServletContext();
  String config_file 
 = getServletConfig().getInitParameter( " config " );
  String dispatcher_name
 = getServletConfig().getInitParameter( " dispatcher " );
  
 if  (config_file  ==   null   ||  config_file.equals( "" ))
   config_file 
 =   " /WEB-INF/strutslet-config.xml "  // 默认是/WEB-INF/下面的strutslet-config 
 
   if (dispatcher_name == null || dispatcher_name.equals( "" ))
   dispatcher_name
 = Constant.DEFAULT_DISPATCHER;
    
  
 try   {
   Map
 < String, ActionModel >  resources  =  ConfigUtil.newInstance()   // 工具类解析配置文件 
 
     .parse(config_file, context);
   context.setAttribute(Constant.ACTIONS_ATTR, resources);  
 // 存储在ServletContext中 
 
   log.info( " 初始化strutslet配置文件成功 " );
  }
 
  catch  (Exception e)  {
   log.error(
 " 初始化strutslet配置文件失败 " );
   e.printStackTrace();
  }
 

 
  
 // 实例化Dispacher 
 

   
 try {
   Class c 
 =  Class.forName(dispatcher_name);
      Dispatcher dispatcher 
 =  (Dispatcher) c.newInstance();
      context.setAttribute(Constant.DISPATCHER_ATTR, dispatcher); 
 // 放在ServletContext 
 
      log.info( " 初始化Dispatcher成功 " );
  }
 
catch (Exception e)  {
    log.error(
 " 初始化Dispatcher失败 " );
      e.printStackTrace();
  }
 

 
  ..


doGet()和doPost方法我们都让它调用process方法:

 

 protected   void  process(HttpServletRequest request,
   HttpServletResponse response) 
 throws  ServletException, IOException  {
  ServletContext context 
 =  getServletContext();

        
 // 获取action的path  
 
  String reqURI  =  request.getRequestURI();
  
 int  i = reqURI.lastIndexOf( " . " );
  String contextPath
 = request.getContextPath();
  String path
 = reqURI.substring(contextPath.length(),i);
  
  request.setAttribute(Constant.REQUEST_ATTR, path);
  Dispatcher dispatcher 
 =  (Dispatcher) context.getAttribute(Constant.DISPATCHER_ATTR);

  
 //  make sure we don't cache dynamic data 
 
  response.setHeader( " Cache-Control "  " no-cache " );
  response.setHeader(
 " Pragma "  " no-cache " );

  
 //  use the dispatcher to find the next page 
 
  String nextPage  =  dispatcher.getNextPage(request, context); // 调用Dispatcher的getNextPage

  
 //  forward control to the view 
 
  RequestDispatcher forwarder  =  request.getRequestDispatcher( " / " 
    
 +  nextPage);
  forwarder.forward(request, response);  
 // 转发页面 
 
 } 

 

 

7。最后,web.xml的配置就非常简单了,配置前端控制器,提供启动参数(配置文件所在位置,为空就查找/WEB-INF/下面的strutslet-config.xml文件),我们把所有以action结尾的请求都交给FrontController处理:

 

 < servlet > 
    
 < servlet - name > StrutsletController </ servlet - name > 
    
 < servlet - class > com.strutslet.core.FrontController </ servlet - class > 
    
 <!--   
    
 < init - param > 
         
 < param - name > config </ param - name > 
         
 < param - value >/ WEB - INF / strutslet - config.xml </ param - value > 
    
 </ init - param > 
    
 --> 
       
 < load - on - startup > 0 </ load - on - startup > 
  
 </ servlet > 
 
 < servlet - mapping > 
    
 < servlet - name > StrutsletController </ servlet - name > 
    
 < url - pattern >* .action </ url - pattern > 
 
 </ servlet - mapping >

 

最后,让我们看看整个框架图:

 test.jpg

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics